java 發送郵件的幾種方式

一、java mail發送郵件:
1.pom.xml

    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
        <version>1.6.2</version>
    </dependency>

2.代碼
2.1email實體類

@Data
public class EmailDto {
    private String serverName;
    private String port;
    private String userName;
    private String password;
    private String senderName;
    private String emailAddress;
    private String subject;
    private String to;
    private String cC;
    private String content;

    @Override
    public String toString() {
        return JSONObject.toJSONString(this);
    }
}

2.2郵件發送

public class MailUtils {
    /**
     * 發送郵件
     * @param emailDto email配置信息
     * @param filePath  本地附件地址
     */
    public static void sendMail(EmailDto emailDto, JSONArray filePath) {
        Transport transport = null;
        try {
            Properties prop = new Properties();
            prop.setProperty("mail.host", emailDto.getServerName());  //郵箱發送
            prop.setProperty("mail.transport.protocol", "smtp"); // 郵件發送協議
            prop.setProperty("mail.smtp.auth", "true"); // 需要驗證用戶名密碼
            //1、創建定義整個應用程序所需的環境信息的 Session 對象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    //傳入發件人的姓名和授權碼
                    return new PasswordAuthentication(emailDto.getUserName(), emailDto.getPassword());
                }
            });
            //2、通過session獲取transport對象
            transport = session.getTransport();
            //3、通過transport對象郵箱用戶名和授權碼連接郵箱服務器
            transport.connect(emailDto.getServerName(), emailDto.getUserName(), emailDto.getPassword());
            //4、創建郵件,傳入session對象
            MimeMessage mimeMessage = getMimeMessage(session, emailDto, filePath);
            //5、發送郵件
            transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (transport != null) {
                try {
                    transport.close();
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    /**
     * 組裝發送信息
     * @param session session
     * @param emailDto 郵件配置信息
     * @param filesPath 本地地址
     * @return MimeMessage
     * @throws Exception  Exception
     */
    private static MimeMessage getMimeMessage(Session session, EmailDto emailDto, JSONArray filesPath) throws Exception {
        //消息的固定信息
        MimeMessage mimeMessage = new MimeMessage(session);
        //發件人
        mimeMessage.setFrom(new InternetAddress(emailDto.getEmailAddress()));
        //收件人
        if (StringUtils.isNotBlank(emailDto.getTo())) {
            String[] tos = emailDto.getTo().split(",");
            for (String to : tos) {
                mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
            }
        }
        //抄送人
        if (StringUtils.isNotBlank(emailDto.getCC())) {
            String[] ccs = emailDto.getTo().split(",");
            for (String cc : ccs) {
                mimeMessage.setRecipient(Message.RecipientType.CC, new InternetAddress(cc));
            }
        }
        //郵件標題
        mimeMessage.setSubject(emailDto.getSubject());
        MimeMultipart multipart = new MimeMultipart();
        //附件
        for (Object pathObj : filesPath) {
            MimeBodyPart attachPart = new MimeBodyPart();
            File file = new File((String) pathObj);
            attachPart.setDataHandler(new DataHandler(new FileDataSource(file)));
            //避免中文亂碼的處理
            attachPart.setFileName(MimeUtility.encodeWord(file.getName()));
            multipart.addBodyPart(attachPart);//附件
        }
        //正文
        MimeBodyPart contentPart = new MimeBodyPart();
        contentPart.setContent(emailDto.getContent(), "text/html;charset=utf-8");
        multipart.addBodyPart(contentPart);
        multipart.setSubType("mixed"); //正文和附件都存在郵件中,所有類型設置爲mixed
        //放到Message消息中
        mimeMessage.setContent(multipart);
        mimeMessage.saveChanges();//保存修改
        return mimeMessage;
    }
}

二、spring自帶的郵件發送器發送郵件

1.pom.xml

    <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

2.代碼

    /**
     * 創建郵件發送器
     *
     * @param emailDto  郵件配置信息
     * @return 發送器
     */
    private static JavaMailSenderImpl createMailSender(EmailDto emailDto) {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setHost(emailDto.getServerName());
        sender.setPort(Integer.parseInt(emailDto.getPort()));
        sender.setUsername(emailDto.getUserName());
        sender.setPassword(emailDto.getPassword());
        sender.setDefaultEncoding("Utf-8");
        Properties p = new Properties();
        p.setProperty("mail.smtp.timeout", "25000");
        p.setProperty("mail.smtp.auth", "false");
        sender.setJavaMailProperties(p);
        return sender;
    }
    
    /**
     * 發送郵件
     *
     * @param emailDto emailDto
     * @param files files(由於附件是服務接收的,故我這裏用MultipartFile)
     * @throws MessagingException 
     * @throws UnsupportedEncodingException 自定義異常,可忽略
     */
    public void sendMail(EmailDto emailDto, MultipartFile... files) throws MessagingException, UnsupportedEncodingException {
        long startTime = System.currentTimeMillis();
        JavaMailSenderImpl mailSender = createMailSender(emailDto);
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        // 設置utf-8或GBK編碼,否則郵件會有亂碼
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        messageHelper.setFrom(emailDto.getEmailAddress(), emailDto.getSenderName());
        messageHelper.setTo(emailDto.getTo().split(","));
        messageHelper.setSubject(emailDto.getSubject());
        messageHelper.setText(emailDto.getContent(), true);
        if (StringUtils.isNotBlank(emailDto.getCC())) {
            messageHelper.setCc(emailDto.getCC().split(","));
        }
        for (MultipartFile file : files) {
            if (!file.isEmpty() && file.getOriginalFilename() != null) {
                messageHelper.addAttachment(file.getOriginalFilename(), file);
            }
        }
        mailSender.send(mimeMessage);
        log.info("郵件發送耗時:" + (System.currentTimeMillis() - startTime) / 1000.0);
    }

三、使用Apache commons-email發送html郵件
1.pom.xml

    <dependency>
         <groupId>org.apache.commons</groupId>
          <artifactId>commons-email</artifactId>
          <version>1.5</version>
    </dependency>

2.代碼

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import java.util.List;

/**
 * @className: MailUtil.java
 * @description: 郵件工具類
 */
public class MailUtil {

    /**
     * 構建器
     */
    public static class EmailInfo {

        /**
         * SMTP 服務器 端口
         */
        private String mailServer;
        private Integer mailPort;

        /**
         * 發件人 賬號
         */
        private String mailNick;

        /**
         * 發件人 賬號
         */
        private String mailUsername;

        /**
         * 發件人 密碼
         */
        private String mailPassword;

        /**
         * 郵件標題
         */
        private String title;
        
        /**
         * 郵件內容
         */
        private String content;
        
        /**
         * 收件人
         */
        private List<String> receivers;

        boolean ssl;

        public EmailInfo(String mailServer,Integer mailPort,String mailNick,String mailUsername,
            String mailPassword,String title,String content,List<String> receivers,boolean ssl) {
            this.mailServer = mailServer;
            this.mailPort = mailPort;
            this.mailNick = mailNick;
            this.mailUsername = mailUsername;
            this.mailPassword = mailPassword;
            this.title = title;
            this.content = content;
            this.receivers = receivers;
            this.ssl = ssl;
        }

        public MailUtil send() throws Exception {
            return new MailUtil(this);
        }
    }

    private MailUtil(EmailInfo emailInfo) throws Exception {
        HtmlEmail email = new HtmlEmail();
        // 通過Server 發送郵件
        email.setHostName(emailInfo.mailServer);
        email.setSmtpPort(emailInfo.mailPort);
        //設定smtp服務器的認證資料信息
        email.setAuthentication(emailInfo.mailUsername, emailInfo.mailPassword);
        email.setStartTLSEnabled(false);
        email.setSSLOnConnect(emailInfo.ssl);
        try {
            // 設定發件人
            email.setFrom(emailInfo.mailUsername,emailInfo.mailNick);
            // 設定收件人 (多人)
            int size = emailInfo.receivers.size();
            email.addTo(emailInfo.receivers.toArray(new String[size]));
            // 設定內容的語言集
            email.setCharset("UTF-8");
            email.setDebug(false);
            // 設定主題
            email.setSubject(emailInfo.title);
            // 設定郵件內容
            email.setHtmlMsg(emailInfo.content);
            // 發送郵件
            email.send();
            System.out.println("郵件發送成功!");
        } catch (EmailException e) {
            System.out.println("郵件發送失敗!");
            throw new Exception(e);
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章