1. 程式人生 > 其它 >java 傳送郵件的幾種方式

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);
        }
    }
}