zoukankan      html  css  js  c++  java
  • SpringBoot入门 (十) 发送邮件

    本文记录学习在SpringBoot中发送邮件。

    一 邮件发送过程

      发送邮件是一个我们在项目中经常会用到的功能,如在用户注册时发送验证码,账户激活等都会用到。完整的一个邮件发送过程主要包含以下几个步骤:

      1 发件人在用户邮件代理上写邮件内容及收件人的邮箱地址;

      2 用户邮件代理根据发件人填写的邮件信息,生成一封符合邮件格式的邮件;

      3 用户邮件代理把邮件发送到发信人的邮件服务器上;

      4 发件人的邮件服务器使用 SMTP 协议把这封邮件发送到收件人的邮件服务器上;

      5 收件人的邮件服务器收到邮件后,把这封邮件放到收件人在这个服务器上的信箱中;

      6 收件人使用用户邮件代理来收取邮件。

    二 发送邮件示例

      以前发送邮件时,调用 JavaMail 的相关 API 来开发实现,需要我们自己去组装消息体,代码量比较大,实现起来也不是很容易;Spring 提供的JavaMailSender 对JavaMail的Api做了一定的封装,简化了发邮件的过程。JavaMailSender 提供了强大的邮件发送功能,可支持各种类型的邮件发送。Spring Boot在JavaMailSender 的基础上又做了进一步的封装,让我们的使用更加的简单。

      在pom.xml文件中引入需要得依赖

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

      在application.properties中配置邮件服务相关信息(测试使用得是QQ邮件服务)

    # Email
    #邮件默认字符集
    spring.mail.default-encoding=UTF-8
    #邮件服务地址
    spring.mail.host=smtp.qq.com
    #邮件服务协议,可以不写(查看源码可知,没有时默认值是smtp )
    #spring.mail.protocol=smtp
    #端口
    spring.mail.port=25
    #账号
    spring.mail.username=********@qq.com
    #密码 使用第三方发送邮件时,需要开通授权,所以此处要写邮箱授权码
    spring.mail.password=****************
    

      完成了上边得配置后,在启动服务得时候,SpringBoot会根据我们得配置,为我们初始化好一个JavaMailSender类供我们调用,我们只需要在要使用得地方注入就可以了。

      定义一个邮件服务接口,提供我们得邮件服务方法,其他业务中用到发邮件功能时,调用找个接口就可以了

    public interface EmailSenderService {
    
        /**
         * 发送文本消息
         * @param subject 邮件主题
         * @param content 邮件内容
         * @param to 收件人(可变参数,多个时用逗号隔开)
         */
        void sendTextMail(String subject, String content, String... to);
    
    }
    @Service
    public class EmailSenderServiceImpl implements EmailSenderService {
    
        @Autowired
        private JavaMailSender javaMailSender;
    
        //发件人邮箱
        @Value("${spring.mail.username}")
        private String from;
    
        @Override
        public void sendTextMail(String subject, String content, String... to) {
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            mailMessage.setFrom(from);
            mailMessage.setTo(to);
            mailMessage.setSubject(subject);
            mailMessage.setText(content);
            mailMessage.setSentDate(new Date());
            javaMailSender.send(mailMessage);
        }
    }
    

      如上,我们在实现类中注入JavaMailSender后直接调用它send方法就可以完成发邮件。其他业务中用到发邮件业务了,直接调用EmailSenderService 接口得方法即可。我们完全也可以把JavaMailSender直接注入到我们得各个业务模块中去,在发邮件时直接调用JavaMailSender得send方法发邮件。但是还是推荐将邮件发送相关功能独立起来,便于维护。

      上边我们实现了发送一个文本邮件,有时候我们还需要在发送邮件时附带发送附件,这种也是支持的,我们添加接口及实现方法

    /**
         * 发送带附件邮件
         * @param subject 主题
         * @param content 内容
         * @param filePath 附件得本地路径
         * @param fileName 附件名
         * @param to 收件人
         */
        void sendAttachmentMail(String subject, String content, String filePath, String fileName, String... to);
    @Override
        public void sendAttachmentMail(String subject, String content, String filePath, String fileName, String... to) {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            try {
                MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
                helper.setFrom(from);
                helper.setTo(to);
                helper.setSubject(subject);
                helper.setText(content);
                //附件
                FileSystemResource file = new FileSystemResource(new File(filePath));
                helper.addAttachment(fileName, file);
    
                javaMailSender.send(mimeMessage);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
    

      如果我们发送邮件时,除了收件人之外,还想让某些人知道即抄送某些人,这种也是支持得,接口及实现方法如下:

    /**
         * 发送一个邮件并抄送
         * @param subject 主题
         * @param content 内容
         * @param ccList 抄送人(可以有多个)
         * @param to 收件人(可以有多个)
         */
        void sendTextMail(String subject, String content, List<String> ccList, String... to);
    @Override
        public void sendTextMail(String subject, String content, List<String> ccList, String... to) {
            //收件人地址
            InternetAddress[] addressesTo = new InternetAddress[to.length];
            if(to != null && to.length>0){
                for(int i=0;i<to.length;i++){
                    InternetAddress addressTo = null;
                    try {
                        addressTo = new InternetAddress(to[i]);
                        addressesTo[i] = addressTo;
                    } catch (AddressException e) {
                        e.printStackTrace();
                    }
                }
            }
            //抄送人地址
            InternetAddress[] addressesCc = new InternetAddress[ccList.size()];
            if(ccList != null && ccList.size() > 0){
                for(int i=0;i<ccList.size();i++){
                    String ccAdd = ccList.get(i);
                    InternetAddress address = null;
                    try {
                        address = new InternetAddress(ccAdd);
                        addressesCc[i] = address;
                    } catch (AddressException e) {
                        e.printStackTrace();
                    }
                }
            }
    
            MimeMessagePreparator preparator = new MimeMessagePreparator() {
                @Override
                public void prepare(MimeMessage mimeMessage) throws Exception {
                    mimeMessage.setFrom(from);
                    mimeMessage.setSubject(subject);
                    mimeMessage.setText(content);
                    mimeMessage.setRecipients(Message.RecipientType.TO, addressesTo);
                    mimeMessage.setRecipients(Message.RecipientType.CC, addressesCc);
                }
            };
            javaMailSender.send(preparator);
        }
    

      如上方法就实现了向多人发送邮件并且抄送多人

  • 相关阅读:
    HDU 4315 Climbing the Hill [阶梯Nim]
    POJ 1704 Georgia and Bob [阶梯Nim]
    BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]
    BZOJ 1299: [LLH邀请赛]巧克力棒 [组合游戏]
    浏览器缓存知识点总结
    软件测试自动化的最新趋势
    性能测试面试题(附答案
    最流行的自动化测试工具,总有一款适合你
    49种软件测试方法
    linux执行jmeter脚本解决响应数据为空
  • 原文地址:https://www.cnblogs.com/love-wzy/p/10345817.html
Copyright © 2011-2022 走看看