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
#邮箱账号
mail.username=1040728129@qq.com
# 邮箱密码(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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懵懵懂懂程序员

如果节省了你的时间, 请鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值