Spring框架發送電子郵件(學習筆記2020.3.27)

Spring框架發送電子郵件

前言:

Spring框架提供了一個有用的實用程序庫,用於發送電子郵件,使您不受底層郵件系統的限制,並負責代表客戶端進行低級資源處理。(就是對JavaMail庫進行了封裝)

爲了使用Spring Framework的電子郵件庫,以下JAR必須位於應用程序的類路徑中:

JavaMail庫

直接使用Java Mail發送郵件

獲取QQ郵箱授權碼

GP2jpj.png

1. 引入依賴

	<!--javax.mail依賴-->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
        <!-- Spring依賴-start-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
        <!--  spring依賴-end   -->

1.1 編寫配置文件mail.properties

#郵箱服務器
mail.host=smtp.qq.com
#端口
mail.port=465
#郵箱賬號
[email protected]
# 郵箱密碼(qq郵箱使用的是授權碼)
mail.password=自己
#發送協議 默認就是smtp
mail.protocol=smtp
#日記輸出
mail.debug=true
mail.default-encoding=UTF-8
#認證
mail.smtp.auth=true
#啓用STARTTLS,是一種明文通信協議的擴展,能夠讓明文的通信連線直接成爲加密連線(使用SSL或TLS加密)
mail.smtp.starttls.enable=true
mail.smtp.starttls.required=true
#啓用ssl
mail.smtp.ssl.enable=true
#引發成功報告異常
#mail.smtp.reportsuccess=true
#收郵件協議 hdnueendhjnxbegg
mail.store.protocol=pop3
#某些默認超時值是無限的,您可能需要更改該值,以避免線程被無響應的郵件服務器阻塞
mail.smtp.connectiontimeout=5000
mail.smtp.timeout=3000
mail.smtp.writetimeout=5000

1.2 註冊MailSender

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.mail.MailSender;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import zhihao.sendmail.SendMail;
import zhihao.sendmail.impl.SendMailImpl;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * @Author: zhihao
 * @Date: 2020/3/26 17:43
 * @Description: 使用配置類方式代替xml
 * @Versions 1.0
 **/
@Configuration
public class MailConfig {
    /** 屬性集 */
    public static Properties properties;

    /** 加載配置文件到屬性集 */
    static {
        ResourceLoader loader = new DefaultResourceLoader();
        Resource resource = loader.getResource(ResourceLoader.CLASSPATH_URL_PREFIX + "mail.properties");
        properties = new Properties();
        InputStream inputStream = null;
        try {
            inputStream = resource.getInputStream();
            properties.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 註冊發件人
     *
     * @return org.springframework.mail.MailSender
     * @author: zhihao
     * @date: 2020/3/27
     */
    @Bean
    public MailSender javaMailSender() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
        javaMailSender.setHost(properties.getProperty("mail.host"));
        javaMailSender.setPort(Integer.valueOf(properties.getProperty("mail.port")));
        javaMailSender.setUsername(properties.getProperty("mail.username"));
        javaMailSender.setPassword(properties.getProperty("mail.password"));
        javaMailSender.setProtocol(properties.getProperty("mail.protocol"));
        javaMailSender.setDefaultEncoding(properties.getProperty("mail.default-encoding"));
        javaMailSender.setJavaMailProperties(properties);
        return javaMailSender;
    }
}

1.3 發送普通文本郵件

 	@Autowired
    private JavaMailSender javaMailSender;

	/**
     * 發送普通文本郵件
     *
     * @param from 發送者郵箱
     * @param to 接收者郵箱
     * @param subject 郵件主題
     * @param content 郵件內容
     * @return boolean
     * @author: zhihao
     * @date: 2020/3/27
     */
    @Override
    public boolean sendTextMail(String from, String to, String subject, String content) {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setFrom(from);
        mailMessage.setTo(to);
        mailMessage.setSubject(subject);
        mailMessage.setText(content);
        //發送
        try {
            javaMailSender.send(mailMessage);
            return true;
        } catch (MailException e) {
            e.printStackTrace();
        }
        return false;
    }

	@Test
    public void sendText(){
        String from = MailConfig.properties.getProperty("mail.username");
         sendMail.sendTextMail(from, from, "這是個普通郵件", "測試發送");
    }

1.4 發送帶HTML格式的郵件

	@Autowired
    private JavaMailSender javaMailSender;
	/**
     * 發送帶Html文本郵件
     *
     * @param from 發送者郵箱
     * @param to 接收者郵箱
     * @param subject 郵件主題
     * @param content 帶Html文本郵件內容
     * @return boolean
     * @author: zhihao
     * @date: 2020/3/27
     */
    @Override
    public boolean sendHtmlMail(String from, String to, String subject, String content) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            //傳遞對象進行構建發送html文本格式
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content,true);
            javaMailSender.send(mimeMessage);
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return false;
    }

	@Test
    public void sendHtml(){
        String from = MailConfig.properties.getProperty("mail.username");
        String html = "<html><body><img src='https://s1.ax1x.com/2020/03/16/8JHaM4.jpg'/>這個是個圖片</body></html>";
         sendMail.sendHtmlMail(from, from, "Html格式", html);
    }

1.5 發送帶附件的郵件

	@Autowired
    private JavaMailSender javaMailSender;
	/**
     * 發送帶附件文本郵件
     *
     * @param from 發送者郵箱
     * @param to 接收者郵箱
     * @param subject 郵件主題
     * @param content 郵件文本內容,例如xx.jpg ||  xx.xlsx || xx.後綴名
     * @param AnnexName 附件名
     * @param inputStream 文件流
     * @return boolean
     * @author: zhihao
     * @date: 2020/3/27
     */
    @Override
    public boolean sendAnnexMail(String from, String to, String subject, String content, String AnnexName, InputStream inputStream) {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            //傳遞對象進行構建發送附件文本格式
            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content);
            ByteArrayDataSource dataSource = new ByteArrayDataSource(inputStream,"application/octet-stream");
            helper.addAttachment(AnnexName, dataSource);
            javaMailSender.send(mimeMessage);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

	@Test
    public void sendAnnex() throws Exception {
        String from = MailConfig.properties.getProperty("mail.username");
        FileInputStream inputStream = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\hhhh.xlsx"));
//         sendMail.sendAnnexMail(from, from, "這是個普通郵件", "圖片郵件","我的.jpg",inputStream);
         sendMail.sendAnnexMail(from, from, "這是個附件郵件", "圖片郵件","我的.xlsx",inputStream);
    }

1.6 使用HTML模板發送郵件

本質上還是使用發送HTML格式的郵件, 只是將頁面模板填充數據,並解析成頁面字符串發送。

	/**
     * 發送模板,本質上還是發送HTML郵件,只不過多了綁定變量的過程。
     *
     * @param from 發送者郵箱
     * @param to 接收者郵箱
     * @param subject 郵件主題
     * @param content 模板Html文本內容
     * @return boolean
     * @author: zhihao
     * @date: 2020/3/27
     */
    @Override
    public boolean sendHtmlTemplateMail(String from, String to, String subject, String content) {
        //調用之前發送HTML格式
        return this.sendHtmlMail(from, to, subject, content);
    }

1.6.1 引入依賴

	<!-- 頁面模板 -->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.11.RELEASE</version>
        </dependency>

1.6.2 創建HTML頁面模板

emailTemplate.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>模板</title>
</head>
<body>
    使用thymeleaf模板語法
    你的偶像:<h1 style="color: red" th:text="${name}"></h1>
</body>


1.6.3 創建模板引擎

步驟:

  1. ​ 創建模板引擎: TemplateEngine
  2. ​ 設置模板解析器setTemplateResolver(template)
  3. 創建模板解析器並設置文件的前綴,後綴,模式
  4. 使用TemplateEngine調用process()處理得到模板字符串
	@Test
    public void sendHtmlTemplateMail() throws Exception {
        String from = MailConfig.properties.getProperty("mail.username");
        Context context = new Context();
        context.setVariable("name", "張韶涵");
        //創建模板
        TemplateEngine templateEngine = new TemplateEngine();
        //設置模板解析器
        FileTemplateResolver templateResolver = new FileTemplateResolver();
        templateResolver.setTemplateMode("HTML");
        //文件夾前綴
        templateResolver.setPrefix("src/main/resources/"); 
        //後綴
        templateResolver.setSuffix(".html"); 
        templateEngine.setTemplateResolver(templateResolver);
        String process = templateEngine.process("emailTemplate", context);
        sendMail.sendHtmlTemplateMail(from, from, "html模板郵件",process );
    }

擴展資料:

項目代碼:

mail屬性配置說明

發送帶圖片的郵件:

發送帶靜態資源的郵件

發送帶靜態資源的郵件其實就是在發送HTML郵件的基礎上嵌入靜態資源(比如圖片),嵌入靜態資源的過程和傳入附件類似,

helper.addInline("img", file);中的img和圖片標籤裏cid後的名稱相對應。

GPwcGV.png

收郵件操作:

	@Autowired
    private JavaMailSenderImpl javaMailSender;
    @Test
    public void incomingMail() throws Exception {
        //1.獲取會話
        Session session = javaMailSender.getSession();
        //2.通過會話獲取Store
        Store store = session.getStore();
        //3.連上郵件服務器  賬號----密碼(QQ郵箱使用授權碼)
        store.connect(javaMailSender.getUsername(),MailConfig.properties.getProperty("mail.password"));
        //4.獲取收件箱的郵件夾
        Folder folder = store.getFolder("inbox");
        //5.打開只讀郵件夾,還有很多操作
        folder.open(Folder.READ_ONLY);
        //6.獲取郵件
        Message[] messages = folder.getMessages();
        for (Message message : messages) {
            String subject = message.getSubject();
            Object content = message.getContent();
            System.out.println("主題"+subject);
            System.out.println("內容"+content);
        }
        folder.close();
        store.close();
    }

參考了:https://www.jianshu.com/p/0d1fc72d3414

1

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