第七章:SpringBoot整合JavaMail发送邮件

作者: 恒宇少年 | 来源:发表于2017-04-08 21:12 被阅读7724次

JavaMail是SUN提供给广大Java开发人员的一款邮件发送和接受的一款开源类库,支持常用的邮件协议,如:SMTP、POP3、IMAP,开发人员使用JavaMail编写邮件程序时,不再需要考虑底层的通讯细节如:Socket而是关注在逻辑层面。JavaMail可以发送各种复杂MIME格式的邮件内容,注意JavaMail仅支持JDK4及以上版本。虽然JavaMail是JDK的API但它并没有直接加入JDK中,所以我们需要另外添加依赖,下面我们开始讲解本章的内容。

本章目标

将Java提供的JavaMail类库与SpringBoot项目进行整合,并且简单封装下JavaMail类库。

构建项目

本章项目无关Web相关内容,所以创建项目时选择Jar形式创建,并且不需要预先导入依赖。项目结构如下图1所示:

图1

可以看到上图1内容,多余的依赖并没有添加,如果你选择的是War项目也没有关系名,那好,我们接下来把我们的主角JavaMail请出来吧,把对应的依赖添加到pom.xml配置文件内。如下图2所示:

图2

依赖我们已经导入成功了,接下来我们开始编写JavaMail的封装,我这里简单的对JavaMail做出封装,如果您需要更完美的封装,请对我的代码做出修改即可,先来编写一个MailEntity类来保存发送邮件时需要的参数字段,如下图3所示:

图3

我们的MailEntity包含了上图3的字段内容,都是一些必填选项,下面我们来创建一个MailSender也就是邮件发送者实体,主要作用就是用来配置发送邮件参数以及执行发送邮件,代码如下图4、5、6、7、8所示:

图4 图5 图6 图7 图8

因为简书的富文本编辑器不支持代码块,下次编写文章使用MarkDown方式来写,类过长贴起来图挺费劲。上面可以看到我使用到了MailContentTypeEnum以及PropertiesUtil工具类。

MailContentTypeEnum

这是一个我自定义的枚举类型,枚举类型包含了邮件内容的类型,目前我仅仅添加了两种,一种是html另外一种则是text形式,具体代码如下图9所示:

图9

PropertiesUtil

PropertiesUtil是用于读取*.properties配置文件的工具类,使用JavaMail需要配置SMTP以及用户名、密码等也就是MailEntity内的字段,那么我们在/resource目录下创建一个名字叫mail.properties的配置文件,里面存放我们定义的邮件发送参数配置,这样方便修改,我分别贴出PropertiesUtil、mail.properties代码内容,如下图10、图11所示:

图10 图11

我使用的QQ邮箱地址作为测试,如果你需要使用你的QQ地址作为测试,请先到QQ邮箱开启POP3/SMTP服务,开启步骤如下。

开启POP3/SMTP

第一步:进入邮箱点击“设置”,如下图12所示:

图12

第二步:点击“账户”后往下拉找到POP3/IMAP/SMTP...,如下图13所示:

图13

我的POP3以及SMTP以及开启了所以这里显示的状态是已开启,如果您第一次使用QQ邮箱的SMTP服务,请点击“开启”并且按照提示步骤完成获取“授权码”即可,授权码就是发送邮件参数的smtp.pwd属性。

测试发送邮件

我们创建一个TestMail类来作为测试入口,因为我们的项目是jar形式,所以我们直接新建一个main方法直接调用发送邮件就可以了,如下图14所示测试代码:

图14

我是向我的钉钉邮箱发送了一条文本类型的测试邮件,发送效果图如下图15所示:

图15

可以看到我们的邮件收到了,证明我们已经完成了邮件发送的功能了,但是你在发送中配置mail.properties文件时配置昵称的时候最有可能出现的问题就是乱码,那么该问题如何解决呢?

昵称乱码问题解决

第一步:修改InteiiJ IDEA工具的properties文件的编码,点击File->Setting->Editor->File Encodings将下面的Default encoding设置为UTF-8,如下图16所示:

图16

那么我们的mail.properties内使用ASCII编码进行配置昵称就可以了,具体中文如何转换ASCII,请大家访问tool.oschina.net/encode在线转换即可。修改完成后再次测试发送邮件,你就会发现乱码问题解决了。

总结

上述内容就是本章的所有讲解,本章主要讲解了在SpringBoot项目内是如何使用JavaMail来进行发送简单邮件,简单封装了下MailSender类以及对象实体MailEntity,如果需要发送HTML内容的邮件修改contentType(MailContentTypeEnum.HTML)然后content("html代码")即可。

本章代码已经上传码云:

SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter

SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter

SpringBoot相关系列文章请访问:目录:SpringBoot学习目录

QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录

SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录

SpringBoot相关文章请访问:目录:SpringBoot学习目录,感谢阅读!

欢迎微信扫码加入知识星球,恒宇少年带你走以后的技术道路!!!

知识星球 - 恒宇少年

相关文章

网友评论

  • 我不想再努力了:发送邮件不成功的,可以先设置一下 mailSession.setDebug(true); 方便查看信息来排查问题
    我的没有发送成功是因为没有设置SSL,可参照:https://segmentfault.com/q/1010000004497746
  • 谁遇而安:图片、附件发送更新一下呗,老铁
  • 街角的幸福i:很棒,发送成功了
  • 街角的幸福i:大佬 有没有源码
    街角的幸福i:@恒宇少年 好的
    恒宇少年:@街角的幸福i 仔细看看文章底部
  • jkian:我项目是war模式的,也可以main方法直接测试吗?
    jkian:@恒宇少年 喜欢你的简书
    jkian:@恒宇少年 很喜欢的简书,多跟您学习学习
    恒宇少年:@并亲揍了你一顿jkian 可以
  • 13c292a6fc65:我的收到的怎么都是text这个字母
  • 6be3c6d729ed:全部粘过来,改了发送邮箱和接受邮箱以及发送qq邮箱的授权码,为撒子我怎么都收不到呢?为了去除变量影响,本来接受邮箱是个qq邮箱我也换成了钉钉邮箱,还是接收不到:persevere:
  • 小宋_ed76:代码是ok的,封装的也很好。亲自编码测试。不过遇到个问题,为什么发送了邮件了收不到呢?也没有报错!
    6be3c6d729ed:我也遇到同样的问题,我是用qq邮箱发送到另一个qq邮箱,不晓得为啥收不到
    821fdb27b805:同样的问题,代码走完不报错,就是没有接收到邮件
  • 734374ebfd5c:测试了一下html格式的,发送的图片看不见,请问这是什么原因造成的?怎样解决了
  • 987864014e66:Connected to the target VM, address: '127.0.0.1:4460', transport: 'socket'
    我这个运行完 一直是这个 断点调试一直显示在执行Transport.send(message); 这个是什么原因呢
    小荟荟的超人:@宫宇祁_ddae 哪里错了你的
    987864014e66:@恒宇少年 查到问题了。谢谢
    恒宇少年:@宫宇祁_ddae 检查配置信息是否配置错误
  • libmi:很详细,赞赞赞!
  • f7997f9b6027:讲解很详细,最近也在学着。spring-boot有集成邮件发送:spring-boot-starter-mail,可以参考使用一下
    http://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail
    恒宇少年:好的,非常感谢
  • d05c4c3ff25f:报javax.mail.AuthenticationFailedException: 535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´的错,POP3/SMTP服务开启了,密码输入的是授权码还是提示这个问题。。。
    恒宇少年:@沉默呐喊 这个是编码集的问题,看看配置文件是不是utf8

本文标题:第七章:SpringBoot整合JavaMail发送邮件

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