SpringBoot使用QQ郵箱發送郵件

環境:

    IDEA,SpringBoot,QQ郵箱開啓smtp

pom導入依賴:

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

application.yml配置:

spring:  
  mail:
    host: smtp.qq.com # 服務端
    username: [email protected] # 發件人
    password: xxxxxxxxxxxxx # 授權碼,qq郵箱激活smtp時獲得
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
    default-encoding: UTF-8

創建發送郵件線程池:

/**
 * @author YoonaLt
 * @date 2019/12/09
 * 異步發送郵件線程池
 */
@Configuration
public class MailExecutors {
    @Bean("mailExecutor")
    public ExecutorService getPool() {
        ArrayBlockingQueue queue = new ArrayBlockingQueue(50);
        return new ThreadPoolExecutor(7, 10,
                100L, TimeUnit.SECONDS, queue, new MailThreadFactory("mailSend"));
    }

    /**
     * 主要是爲了命名線程,回溯的時候易找出
     */
    static class MailThreadFactory implements ThreadFactory {
        private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1);
        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;

        MailThreadFactory(String name) {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                    Thread.currentThread().getThreadGroup();
            namePrefix = name +
                    POOL_NUMBER.getAndIncrement() +
                    "-thread-";
        }

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(group, r,
                    namePrefix + threadNumber.getAndIncrement(),
                    0);
            if (t.isDaemon()) {
                t.setDaemon(false);
            }
            if (t.getPriority() != Thread.NORM_PRIORITY) {
                t.setPriority(Thread.NORM_PRIORITY);
            }
            return t;
        }
    }
}

自定義相關實體類:

public class MailEnclosure {
    private String fileName;
    private String path;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName == null ? null : fileName.trim();
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path == null ? null : path.trim();
    }

    public MailEnclosure(String fileName, String path) {
        super();
        this.fileName = fileName;
        this.path = path;
    }
}

public class MailResource {
    private String cid;
    private String path;

    public String getCid() {
        return cid;
    }

    public void setCid(String cid) {
        this.cid = cid == null ? null : cid.trim();
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path == null ? null : path.trim();
    }

    public MailResource(String cid, String path) {
        super();
        this.cid = cid;
        this.path = path;
    }
}

創建發送服務類:

/**
 * @author YoonaLt
 * @date 2019/12/09
 * 郵件發送服務配置。可能被收件方標記爲垃圾郵件,需要收件方添加白名單。
 * 此示例默認異步調用全部成功,實際上可以通過 Future 接口的 isDone() 方法來判斷異步調用是否執行。
 */
@Service
public class MailService {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JavaMailSender javaMailSender;

    @Value("${spring.mail.username}")
    private String from;

    /**
     * 發送簡單文本郵件
     *
     * @param to      收件人
     * @param subject 主題
     * @param content 內容
     */
    @Async("mailExecutor")
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(from);
        simpleMailMessage.setTo(to);
        simpleMailMessage.setSubject(subject);
        simpleMailMessage.setText(content);
        try {
            javaMailSender.send(simpleMailMessage);
            logger.info("向 " + to + " 發送郵件 " + subject + " 成功");
        } catch (Exception e) {
            logger.info("向 " + to + " 發送郵件 " + subject + " 失敗,失敗原因是");
            e.printStackTrace();
        }
    }

    /**
     * 發送帶有圖片或附件的html格式郵件
     *
     * @param to                收件人
     * @param subject           主題
     * @param content           內容
     * @param mailResourceList  靜態資源
     * @param mailEnclosureList 附件
     */
    @Async("mailExecutor")
    public void sendMimeMail(String to, String subject, String content, List<MailResource> mailResourceList, List<MailEnclosure> mailEnclosureList) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            mimeMessageHelper.setTo(to);
            mimeMessageHelper.setFrom(from);
            mimeMessageHelper.setText(content, true);
            mimeMessageHelper.setSubject(subject);
            if (mailResourceList != null) {
                for (MailResource m : mailResourceList) {
                    FileSystemResource file = new FileSystemResource(new File(m.getPath()));
                    mimeMessageHelper.addInline(m.getCid(), file);
                }
            }
            if (mailEnclosureList != null) {
                for (MailEnclosure m : mailEnclosureList) {
                    FileSystemResource file = new FileSystemResource(new File(m.getPath()));
                    mimeMessageHelper.addAttachment(m.getFileName(), file);
                }
            }
            javaMailSender.send(mimeMessage);
            logger.info("向 " + to + " 發送郵件 " + subject + " 成功");
        } catch (MessagingException e) {
            logger.info("向 " + to + " 發送郵件 " + subject + " 失敗,失敗原因是");
            e.printStackTrace();
        }
    }
}

啓動類加註解:  @EnableAsync 配合方法 @Async 註解實現異步發送郵件的功能.

一個簡單的測試方法:

    @GetMapping(value = "send")
    public void sendMail() {
        String to = "[email protected]";
        String subject = "帶附件的html郵件";
        String simpleContent = "簡單郵件";
        String htmlContent = "	<font color=\"red\">發送的html郵件</font>\r\n";
        String pictureContent = "<img src=\"cid:Evelynn\"/> " +
                "<img src=\"cid:Ahri\"/> " +
                "	<font color=\"red\">發送帶圖片的html</font>\r\n";
        String template =
                "<!DOCTYPE html>\r\n" +
                        "<html>\r\n" +
                        "<head>\r\n" +
                        "<meta charset=\"UTF-8\">\r\n" +
                        "<title>標題</title>\r\n" +
                        "</head>\r\n" +
                        "<body>\r\n" +
                        htmlContent +
                        "</body>\r\n" +
                        "</html>";

        List<MailResource> mailResourceList = new ArrayList<>();
        List<MailEnclosure> mailEnclosureList = new ArrayList<>();
        String path = "D:\\YoonaLt\\mail\\src\\main\\resources\\";
        MailResource resource1 = new MailResource("Evelynn", path + "Evelynn.jpg");
        MailResource resource2 = new MailResource("Ahri", path + "Ahri.jpg");
        MailEnclosure mailEnclosure = new MailEnclosure("附件名稱.jpg", path + "Ahri.jpg");
        mailEnclosureList.add(mailEnclosure);
        mailService.sendMimeMail(to, subject, template, null, mailEnclosureList);
    }

由於本人水平有限,難免有疏漏與錯誤之處,謝謝指正:

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