美文网首页SpringBoot
SpringBoot发送邮件附件(超详细讲解)

SpringBoot发送邮件附件(超详细讲解)

作者: JTravler | 来源:发表于2020-03-18 09:08 被阅读0次

    现在发送邮件是一个网站必备的功能,比如注册激活,或者忘记密码等等都需要发送邮件。正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在springboot提供了一套更简易使用的封装。也就是我们使用SpringBoot来发送邮件的话,代码就简单许多,毕竟SpringBoot是开箱即用的 ,它提供了什么,我们了解之后觉得可行,就使用它,自己没必要再写原生的。

    发送邮件流程图

    在这里插入图片描述

    现在的Java项目大多都是按照MVC架构模型来开发的,但是这里不使用Controller层,是直接在测试中发送邮件,假如测试中发送邮件成功,那么改为用户发送请求来发送邮件也会成功。发送邮件,也就是要有发送方和接收方,我们需要在系统中配置发送方的信息,而接受方的信息我们需要根据从客户端发来的请求决定。作为发送方的我们,需要被授权,被谁授权?

    1. 假如我使用QQ邮箱发送邮件,那么我就需要开启QQ邮箱授权码。
    2. 假如我使用网易邮箱发送邮件,那我就需要开启网易邮箱授权码。

    我们接下来就一 一开启这两个邮箱的授权码

    1. 开启QQ邮箱授权码


      在这里插入图片描述
    2. 开启网易邮箱授权码


      在这里插入图片描述

    上图的步骤都会生成授权码,我们需要记住它,可以选择保存在本地电脑上,因为我们接下来配置发送方信息需要授权码。
    接下来我们就开始编写代码发送邮件,我们使用IDEA创建SpringBoot项目,下篇博客可以快速了解如何在IDEA中创建SpringBoot项目。
    SpringBoot快速入门

    导入依赖

    spring-boot-starter-mail:这个启动器内部封装了发送邮件的代码,必须引入的。
    spring-boot-starter-web:这个启动器整合了JavaWeb常用的功能,如果只是简单在测试中发送邮件,那么就不需要引入它。
    spring-boot-starter-thymeleaf:模板引擎依赖,如果需要将数据渲染到页面上,就需要引入它。

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

    配置发送方信息

    我们需要在SpringBoot配置文件(application.yml)中配置发送方的信息,包括以下信息:

    1. 用户名:也就是我们的邮箱账号
    2. 密码:我们刚刚生成的授权码
    3. 邮箱主机:配置使用哪个邮箱服务器发送邮件
      还有等等其他可选配置,在下面配置代码中,大家需要填写自己的用户名、密码、from(和用户名一样)。

    QQ邮箱配置

    spring:
      mail:
        host: smtp.qq.com #发送邮件服务器
        username:  #发送邮件的邮箱地址
        password:   #客户端授权码,不是邮箱密码,这个在qq邮箱设置里面自动生成的
        properties.mail.smtp.port: 465 #端口号465或587
        from:  # 发送邮件的地址,和上面username一致
        properties.mail.smtp.starttls.enable: true
        properties.mail.smtp.starttls.required: true
        properties.mail.smtp.ssl.enable: true
        default-encoding: utf-8
    

    网易邮箱配置

    spring:
      mail:
        host: smtp.163.com #发送邮件服务器
        username:  #发送邮件的邮箱地址
        password: #客户端授权码,不是邮箱密码,网易的是自己设置的
        properties.mail.smtp.port: 994 #465或者994
        from:  # 发送邮件的地址,和上面username一致
        properties.mail.smtp.starttls.enable: true
        properties.mail.smtp.starttls.required: true
        properties.mail.smtp.ssl.enable: true
        default-encoding: utf-8
    

    EmailService

    我们需要自己封装邮件服务,这个服务只是便于Controller层调用,也就是根据客户端发送的请求来调用,封装三种邮件服务

    1. 发送普通文本邮件
    2. 发送HTML邮件:一般在注册激活时使用
    3. 发送带附件的邮件:可以发送图片等等附件
    public interface EmailService {
    
    /**
     * 发送文本邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 内容
     */
    void sendSimpleMail(String to, String subject, String content);
    
    /**
     * 发送HTML邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 内容
     */
    void sendHtmlMail(String to, String subject, String content);
    
    /**
     * 发送带附件的邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 内容
     * @param filePath 附件
     */
    public void sendAttachmentsMail(String to, String subject, String content, String filePath);
    }
    

    EmailServiceImpl

    我们需要实现上面的邮件服务,在具体的实现里面,则是调用了SpringBoot提供的JavaMailSender(封装了发送邮件的代码)。

    @Service
    public class EmailServiceImpl implements EmailService {
    
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        @Autowired
        private JavaMailSender javaMailSender;
        
        //注入配置文件中配置的信息——>from
        @Value("${spring.mail.from}")
        private String from;
    
        @Override
        public void sendSimpleMail(String to, String subject, String content) {
            SimpleMailMessage message = new SimpleMailMessage();
            //发件人
            message.setFrom(from);
            //收件人
            message.setTo(to);
            //邮件主题
            message.setSubject(subject);
            //邮件内容
            message.setText(content);
            //发送邮件
            javaMailSender.send(message);
        }
    
        @Override
        public void sendHtmlMail(String to, String subject, String content) {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper messageHelper;
            try {
                messageHelper = new MimeMessageHelper(message,true);
                messageHelper.setFrom(from);
                messageHelper.setTo(to);
                message.setSubject(subject);
                messageHelper.setText(content,true);
                javaMailSender.send(message);
                logger.info("邮件已经发送!");
            } catch (MessagingException e) {
                logger.error("发送邮件时发生异常:"+e);
            }
        }
    
        @Override
        public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper messageHelper;
            try {
                messageHelper = new MimeMessageHelper(message,true);
                messageHelper.setFrom(from);
                messageHelper.setTo(to);
                messageHelper.setSubject(subject);
                messageHelper.setText(content,true);
                //携带附件
                FileSystemResource file = new FileSystemResource(filePath);
                String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
                messageHelper.addAttachment(fileName,file);
    
                javaMailSender.send(message);
                logger.info("邮件加附件发送成功!");
            } catch (MessagingException e) {
                logger.error("发送失败:"+e);
            }
        }
    
    }
    

    EmailServiceTest

    我们直接在测试中发送邮件,如果测试中发送邮件没问题,那么转为用户请求发送邮件也没有问题的。

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class EmailServiceTest{
    
        @Autowired
        private EmailService emailService;
    
        @Test
        public void sendSimpleEmail(){
            String content = "你好,恭喜你...";
            emailService.sendSimpleMail("XXX@qq.com","祝福邮件",content);
        }
    
        @Test
        public void sendMimeEmail(){
            String content = "<a href='https://blog.csdn.net/'>你好,欢迎注册网站,请点击链接激活</a>";
            emailService.sendHtmlMail("XXX@163.com","激活邮件",content);
        }
    
        @Test
        public void sendAttachment(){
            emailService.sendAttachmentsMail("XX@qq.com","发送附件","这是Java体系图","F:/图片/爱旅行.jpg");
        }
    }
    
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这样我们就实现了提供Java代码来发送邮件。发送附件功能其实就是读取我们本地电脑的文件,然后添加到发送流中即可。
    发送邮件附件的源代码

    相关文章

      网友评论

        本文标题:SpringBoot发送邮件附件(超详细讲解)

        本文链接:https://www.haomeiwen.com/subject/liafyhtx.html