使用帮助
基于Spring Mail的简单的邮件发送API,有详细的配置介绍
项目地址:https://github.com/hongshuboy/springmail-simple-mail
maven
spring
spring mail
simple mail
特点优势
- 极简邮件发送:两行代码发送邮件
- 高效:保证使用简单的同时,重视效率,在你不需要关注源码的情况下,自动选择最好的方式
- Spring:基于Spring,完全支持Spring,又可以脱离Spring使用
- 高送达率:默认双发送器,失败重发,尽可能保证送达到目的地
版本更新
版本号 | 关键词 | 更新时间 | 主要更新内容 |
---|---|---|---|
1.0.0 | RELEASE | 2019年2月22日 | RELEASE版发布,功能测试稳定 |
1.0.1 | 单例模式 | 2019年3月16日 | 目录1.1 ,默认使用单例模式 ,在使用方式不变的情况下,提高了响应速度 |
快速开始(5分钟上手使用)
在这里,你可以快速完成邮件的发送,只需要一点点必须的设置
熟悉项目结构:这是一个maven工程,如果你不会使用maven,可以使用
1.Jar
包的方式
1.设置发件箱的域名和密码
如果你不想使用配置文件,只想使用编码方式快速开始,可以略过这一部分,确保
开启你的邮箱的POP3/SMTP/IMAP
之后,直接看下面的1.1不使用properties(最简单的方式)
或1.2使用properties
src\main\resources\mail.properties
1. 参照现有的配置,修改这个文件,填入你的发件箱,建议你163和QQ邮箱都配置上,这样,如果发送失败,程序会自动切换发送器重发,保证成功率,而且切换过程用户没有察觉。
2. 如果你只配置了一个发送器,无需修改代码,系统会只用这一个发送器进行发送(但是需要删除一个spring配置,注意下文A
部分)。
开启你的邮箱的POP3/SMTP/IMAP
要使用java mail,请先在邮箱设置中开启POP3/SMTP/IMAP,配置的密码不是你的登录密码,以163邮箱为例,同样在设置中选择客户端授权密码,获取一份授权密码,放在配置文件 (src\main\resources\mail.properties) 的mail.password
位置。
A:如果你只在其中配置了一个邮箱
只想用一个发送器?那请把 src\main\resources\spring-mailx.xml
文件中不用的发送器删除,注意删除整个<bean>
标签
- 强烈建议你两个都配置,这样系统在其中一个发送失败时会切换发送器重新发送,点击查看163发送失败的代号对应的原因
下载依赖Jar包
- 将本项目使用Maven打包或者到releases下载
Jar
包
简单的配置之后终于可以开始测试了
可以使用两种方式快速上手使用
1.0 不使用Spring容器的两种方式
注意: 如果你不使用Spring容器,使用
1.1
和1.2
的方式,那么你需要 额外 将/dependencies下的所有Jar包添加到项目中
1.1 不使用Spring容器、不使用配置文件(最简单的方式)
这是最简单的方式,直接可以创建mimeMail
这样只需要在需要的时候用初始化的MimeMail send方法发送邮件即可
注意:
1.1
和1.2
都只能添加一种发送器,但是遇到错误会重试一次。相比2.使用Spring容器(推荐)
的方式(两个发送器),稳定性稍差。
1.0.1
版本更新后,此方式默认使用单例模式加载,在使用方式不变的情况下,提高了响应速度
/**
* 下面是一个简单的例子,测试发送。<strong>这是最简单的方式</strong> - 不使用spring容器如何发送邮件 -
* 弊端:1.发送速度慢,需要几秒钟的时间加载资源 2.这种方式默认只拥有一个发送器,容错率不高
*
* @throws IOException
* @throws MailAddressException 自定义异常,邮件地址不正确
*/
@Test
public void testSendSimple() throws MailAddressException {
MimeMail mimeMail = MimeMail.Builder.initMailSender("smtp.163.com", "smtp",465, "[email protected]","你的客户端授权码", false);
List<String> to = new ArrayList<String>();// 收件人集合
to.add("[email protected]");
//密集发送时,163会报554 DT:SPM异常
mimeMail.sendMail(to, "你有新的消息", "请到网站内查看"+new Date());
}
之后,如果你在系统中再次需要获取MimeMail对象,只需要再次调用MimeMail.Builder.initMailSender
方法,这样会使用单例模式直接拿到第一次初始化的对象,也就是说从第二次使用开始,都会直接获取第一次的MimeMail对象,而不会重新创建。之后的调用,参数填错也不要紧。
第二次调用示例:
MimeMail mail2 = MimeMail.Builder.initMailSender("hello", "world", 100, "a", "b",true);//这里参数可以随便填了
System.out.println(mail == mail2);//这里会输出true,因为直接拿了上一次的对象
如果163邮箱报554 DT:SPM异常,请参考下面的文档
1.2 不使用Spring容器、使用配置文件
- 这样只需要在需要的时候用初始化的MimeMail send方法发送邮件即可
- 注意 : 使用这种方式的话,需要配置
mail.properties
文件中的等号(====)下面的内容,最下面三行内容不要更改。
/**
* 下面是一个简单的例子,测试发送。<strong>这是最简单的方式</strong>
* - 不使用spring容器如何发送邮件
* - 弊端:1.发送速度慢,需要几秒钟的时间加载资源
* 2.这种方式默认只拥有一个发送器,容错率不高
* @throws IOException
* @throws MailAddressException 自定义异常,邮件地址不正确
*/
@Test
public void testSend() throws IOException, MailAddressException {
MimeMail mimeMail = MimeMail.Builder.initMailSenderWithProperties();
List<String> to = new ArrayList<String>();//收件人集合
to.add("[email protected]");
mimeMail.sendMail(to, "你有新消息", "请到网站内查看");
}
我们来看一下调用sendMail方法的具体参数是什么意思
/**
* common mail 重载方法,其他方法调用此方法来实现send mail<br/>
* <strong>发邮件的所有方法必须调用此方法来发送!!!</strong></br>
* 如果你配置了两个mailSender,将会自动切换发送,若只有一个,请务必将不用的发送器从spring-mailx.xml中删除
*
* @param to 收件人地址,List接口形式,支持群发
* @param subject 邮件主题
* @param Text 邮件内容(邮件的尾巴部分会自动补上),可以去上面的重载方法自行定制尾巴
* @return boolean 是否发送成功
* @throws MailAddressException
*/
public boolean sendMail(List<String> to,String subject,String Text)
如果使用这种方式,建议使用一个静态类来管理,不然每次发送都加载资源速度会有点慢,如果不在乎速度的话当然也可以忽略。
2.使用Spring容器(推荐)
这种方式也简单易用,速度上也比上种有显著提升
-
使用git clone项目到本地
-
修改
src\main\resources
下的mail.properties(配置等号上面的内容)(如果你只需要一个发送器,可以只配置一个,并且必须执行第三步
) -
(optional)修改
src\main\resources
下的spring-mailx.xml(如果你在2
中只配置了一个发送器,这里需要删除多余的那个) -
(optional)如果你需要发送附件或者在邮件中显示图片,请将附件或者图片放在
src\main\resources
下,并且修改top\weweb\hawk\mailx\MimeMail.sendMail(List<String> to,String subject,String Text,boolean retry)
对应部分的源码(注释的很清楚) -
使用Maven重新打包项目(请跳过Maven Test,或者删除
src\test
下的java
文件) -
将
Jar
包导入到需要使用邮件的工程中,在工程的spring.xml
中import
中导入simple mail
内的spring-mailx.xml
配置文件,这样当前项目就可以使用MimeMail
发送邮件了,在需要用的地方使用@Autowired
注入就可以使用了。
在上层项目的spring.xml中导Mail组件的Spring容器的方法
请直接复制结点,除非必要不要更改
<!-- 导入邮件组件的spring -->
<import resource="classpath*:spring-mailx.xml"/>
<!-- 忽略下面的内容 -->
<bean id="xxx" class="xxx.xxxx">
...
</bean>
易错注意 :
- 如果使用上层容器,两个容器内不要同时有
<context:property-placeholder location="xx"/>
,将这个结点放到顶层spring.xml
中
如果你觉得对你有帮助,请点个star鼓励作者~
有问题或者建议欢迎在此页留言或者向我发送邮件,一起改进
问题反馈
[email protected]
[email protected]