前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Springboot发送邮件

Springboot发送邮件

作者头像
用户3467126
发布2019-07-03 18:13:09
7290
发布2019-07-03 18:13:09
举报
文章被收录于专栏:爱编码爱编码

简介

Spring提供了非常好用的 JavaMailSender接口实现邮件发送。在Spring Boot的Starter模块中也为此提供了自动化配置。下面通过实例看看如何在Spring Boot中使用 JavaMailSender 发送邮件。

目标
  • 实现发送简单的邮件发送
  • 实现发送带附件的邮件发送
过程

1.导入依赖 spring提供了操作邮箱的相关工具包。开箱即用(哈哈哈),添加相关依赖如下:

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2.邮箱配置 既然要发送邮件,那么你肯定能够想到这里是需要配置你邮箱的账号和密码的,要不然你是想随便就能发的么(想想都觉得不合理)。所以相关yml配置文件如下:

代码语言:javascript
复制
  #邮箱配置
  spring:
    mail:
      host: smtp.163.com
      #发送者邮箱账号
      username: 你的邮箱@163.com
      #发送者密钥
      password: 你的密钥
      default-encoding: utf-8
      port: 465   #端口号465或587
      protocol: smtp
      properties:
        mail:
          debug:
            false
          smtp:
            socketFactory:
              class: javax.net.ssl.SSLSocketFactory

这里有个地方需要注意的就是那个密码password用你自己平时登陆的密码可能不行。那么你可以参考以下的邮箱授权配置如下图:

邮箱授权码

3.邮箱操作服务类 此处有几个点需要注意的

  • mail.mime.splitlongparameters :这个是为了禁用附件名过长会被自动截取的功能
  • @Async :由于发送邮件是调用第三方的接口,如果你加上带附件的话,此处就需要特别长的时间,所以Async 是为了异步处理,而快速返回响应客户端,等处理完成再提醒发送是否成功。

具体操作如下

代码语言:javascript
复制
@Service
public class MailService {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private JavaMailSender javaMailSender;

    @Value("${spring.mail.username}")
    private String from;

    private static String projectPath = StringUtils
            .substringBefore(System.getProperty("user.dir").replaceAll("\\\\", "/"), "/");


    static {
        System.setProperty("mail.mime.splitlongparameters", "false");
    }


    /**
     * 发送简易邮件
     */
    @Async
    public void sendSimpleMail(MailBean mailBean) throws Exception {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);//发送方
        message.setTo(mailBean.getReceiver().split(";"));//接收者
        message.setSubject(mailBean.getSubject());//主题
        message.setText(mailBean.getContent());//内容
        javaMailSender.send(message);
        logger.info("简单邮件已经发送。");
    }




    /**
     * 发送带多附件的邮件
     *
     * @param mailBean
     * @throws Exception
     */
    @Async
    public void sendMultiAttachmentsMail(MailBean mailBean) throws Exception {

        MimeMessage message = javaMailSender.createMimeMessage();
        // true表示需要创建一个multipart message
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(mailBean.getReceiver().split(";"));
        helper.setSubject(mailBean.getSubject());
        helper.setText(mailBean.getContent());

        String[] files = mailBean.getAttachment().split("\\|");
        for (String fileName : files) {
            String path = projectPath + "/temp/" + fileName;
            FileSystemResource file = new FileSystemResource(path);
            if (file.exists() && file.isFile()) {
                helper.addAttachment(fileName, file);
            }
        }

        javaMailSender.send(message);
        logger.info("带附件的邮件已经发送。");
    }


    /**
     * 发送邮件-邮件正文是HTML
     *
     * @param mailBean
     * @throws Exception
     */
    @Async
    public void sendMailHtml(MailBean mailBean) throws Exception {

        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);

        helper.setFrom(from);
        helper.setTo(mailBean.getReceiver().split(";"));
        helper.setSubject(mailBean.getSubject());
        helper.setText(mailBean.getContent(), true);

        javaMailSender.send(mimeMessage);

    }

    /**
     * 内联资源(静态资源)邮件发送 由于邮件服务商不同,可能有些邮件并不支持内联资源的展示 在测试过程中,新浪邮件不支持,QQ邮件支持
     * 不支持不意味着邮件发送不成功,而且内联资源在邮箱内无法正确加载
     *
     * @param mailBean
     * @throws Exception
     */
    @Async
    public void sendMailInline(MailBean mailBean) throws MessagingException {

        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);

        helper.setFrom(from);
        helper.setTo(mailBean.getReceiver().split(";"));
        helper.setSubject(mailBean.getSubject());

//        helper.setText(mailBean.getContent(),true);
        //        helper.addInline();
        helper.setText("my text <img src='cid:myLogo'>", true);
        helper.addInline("myLogo", new ClassPathResource("img/mylogo.gif"));
        javaMailSender.send(mimeMessage);

//        mailSender.send(new MimeMessagePreparator() {
//            public void prepare(MimeMessage mimeMessage) throws MessagingException {
//                MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
//                message.setFrom("me@mail.com");
//                message.setTo("you@mail.com");
//                message.setSubject("my subject");
//                message.setText("my text <img src='cid:myLogo'>", true);
//                message.addInline("myLogo", new ClassPathResource("img/mylogo.gif"));
//                message.addAttachment("myDocument.pdf", new ClassPathResource("doc/myDocument.pdf"));
//            }
//        });

    }

    /**
     * 模板邮件发送
     *
     * @param mailBean
     * @throws Exception
     */
    @Async
    public void sendMailTemplate(MailBean mailBean) throws MessagingException {

        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setFrom(from);
        helper.setTo(mailBean.getReceiver().split(";"));
        helper.setSubject(mailBean.getSubject());
        helper.setText(mailBean.getContent(), true);
        javaMailSender.send(mimeMessage);

    }
}

4.页面参考如下 普通的表单提交加上多附件上传。

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>邮件发送</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div style="margin-left: 20px;">
    <form role="form">
        <div class="form-group">
            <label>收件人</label>
            <input style="width: 300px;" type="text" class="form-control" id="receiver" name="receiver"
                   placeholder="收件人">
        </div>
        <div class="form-group">
            <label>主题</label>
            <input style="width: 300px;" type="text" class="form-control" id="subject" name="subject" placeholder="主题">
        </div>
        <div class="form-group">
            <label>内容</label>
            <input style="width: 300px;" type="text" class="form-control" id="content" name="content" placeholder="内容">
        </div>
        <div class="form-group">
            <label>附件</label>
            <form>
                <input  type="file" multiple id="file" name="file[]" >
                <input  type="button" id="btn" value="上传"/>
            </form>
            <input type="hidden" id="attachment" name="attachment">
        </div>

        <button type="submit" id="send" class="btn btn-default">提交</button>
    </form>
</div>
<script>
    $(function () {
        $('#send').click(function () {
            var d = {};
            var t = $('form').serializeArray();
            $.each(t, function () {
                d[this.name] = this.value;
            });
            console.log(JSON.stringify(d));

            $.ajax({
                type: "POST",
                url: "/mail/send",
                data: JSON.stringify(d),
                cache: false,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data) {
                    alert(data.message);
                },
                error: function (err) {
                    alert(err);
                }
            });
        });

        $("#btn").click(function(){

            var formData = new FormData();
            for(var i=0; i<$('#file')[0].files.length;i++){
                formData.append('file', $('#file')[0].files[i]);
            }

            $.ajax({
                type: "POST",
                data: formData,
                url: "/mail/upload",
                contentType: false,
                processData: false,
            }).success(function (res) {
                var data = res.data;
                if (res.status) {
                    var attachUrls = "";
                    for(var i = 0;i<data.length;i++){
                        var item = data[i];
                        attachUrls += item.url+"|";
                    }
                    $("#attachment").val(attachUrls);
                    console.log(attachUrls);
                } else {
                    console.log(res.message);
                }
            }).error(function (data) {
                alert(data);
                console.log(data);
            });

        });

    });
</script>
</body>
</html>
成果

体验地址:http://120.79.226.4/mail-demo/ 源码地址:https://github.com/xbmchina/mail-demo

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱编码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目标
  • 过程
  • 成果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档