SpringBoot 整合Mail邮件

1. 邮件与协议

  A. smtp(简单邮件传输协议):smtp是Simple Mail Transfer Protocol缩写,它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式,smtp认证要求必须提供账号和密码才能登陆服务器,其目的是避免用户受到垃圾邮件的干扰;

  B. pop3(邮局协议):pop3是Post Office Protocol 3缩写,支持客户端远程管理服务器端的邮件;

  C. smtp服务器地址:网易163/QQ/126/sina/aliyun邮箱 ——> smtp.163.com/smtp.qq.com/ smtp.126.com/smtp.sina.com/ smtp.aliyun.com;

  D. 邮件分简单邮件和复杂邮件,复杂邮件有html格式邮件、带附件格式邮件、带静态资源邮件、基于Freemarker模板的邮件;

2. pom.xml Maven依赖

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

3. 邮箱信息配置

  A. application.properties文件配置

  B. 前端传输参数动态配置

  注意:若使用配置文件设置邮箱信息,可使用JavaMailSender接口发送邮件;若动态配置邮箱信息,需使用JavaMailSenderImpl实现类发送邮件;它们是Java后端发送邮件和集成邮件服务的主流工具。

4. 发送邮件

  A. 发送简单邮件

复制代码
package com.ruhuanxingyun.dcy.service.manage.service;

import com.ruhuanxingyun.dcy.service.manage.model.dto.MailDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

/**
 * @description: 邮件 服务层
 * @author: ruphie
 * @date: Create in 2021/4/17 11:00
 * @company: ruhuanxingyun
 */
@Slf4j
@Service
public class MailService {

    @Autowired
    private MailProperties mailProperties;

    @Autowired
    private JavaMailSender javaMailSender;

    /**
     * 发送简单邮件
     * @param mailDTO 邮件信息
     */
    public void sendSimpleMail(MailDTO mailDTO) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        // 邮件发送人
        simpleMailMessage.setFrom(mailProperties.getUsername());
        // 邮件收件人
        simpleMailMessage.setTo(mailDTO.getMailRecipient());
        //邮件主题
        simpleMailMessage.setSubject(mailDTO.getSubject());
        //邮件内容
        simpleMailMessage.setText(mailDTO.getContent());

        // 发送邮件
        javaMailSender.send(simpleMailMessage);
    }

}
复制代码

 

  B. 发送HTML邮件  

复制代码
package com.ruhuanxingyun.service.system.impl;

import com.ruhuanxingyun.entity.system.Mail;
import com.ruhuanxingyun.service.system.IMailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

/**
 * @description: 邮件工具接口实现层
 * @author: ruphie
 * @date: Create in 2020/1/4 16:58
 * @company: ruhuanxingyun
 */
@Service
public class MailServiceImpl implements IMailService {

    @Autowired
    private JavaMailSenderImpl javaMailSender;

    @Override
    public void sendHtmlMail(Mail mail){
        javaMailSender.setDefaultEncoding("UTF-8");
        javaMailSender.setHost(mail.getMailHost());
     javaMailSender.setPort(mail.getMailPort());
// 是否SSL加密连接 if (mail.getOnSsl() == 2) { Properties properties = new Properties(); properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); javaMailSender.setJavaMailProperties(properties); } // 需要验证邮箱用户名和密码 if (mail.getOnAuth() == 2) { javaMailSender.setUsername(mail.getUsername()); javaMailSender.setPassword(mail.getPassword()); } MimeMessage mimeMessage = javaMailSender.createMimeMessage(); try { MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true); messageHelper.setFrom(mail.getMailSender()); messageHelper.setTo(mail.getMailRecipient()); messageHelper.setSubject(mail.getSubject()); messageHelper.setText(mail.getContent(), true); javaMailSender.send(mimeMessage); } catch (MessagingException e) { e.printStackTrace(); throw new RuntimeException("发送测试邮件失败"); } } }
复制代码

  C. 发送带静态资源邮件

  D. 发送带附件邮件

5. 常见错误

  错误一:注入JavaMailSender或JavaMailSenderImpl,启动报错

   原因:无法找到该类,因为没有被扫描到,无法自动注入

  解决:配置bean类,并在类上加@Configuration

 

 

可参考:SpringBoot整合Mail邮件

    各种常见邮箱端口

posted @   如幻行云  阅读(1041)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示