Spring boot集成Javamail发送邮件
邮箱协议
邮件传输协议:SMTP协议和POP3协议
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。
IMAP协议
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
代码体现
1.pom中引入相关依赖
<!--spring boot集成javamail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.yml配置邮件服务器地址
本次以163邮箱为例,
注意:此处的邮箱密码不是登录密码,是开通服务时的授权码!
要开通邮件的发送服务(SMTP),去邮箱客户端进行设置即可
tr:
mail:
# 邮件服务器地址
smtpHost: smtp.163.com
#账号
account: xxxx@163.com
# 密码
password: xxxxx
# smtp端口
smtpPort: 465
# 是否打开SSL
smtpSSLEnabled: true
# 发送地址
smtpFromMail: xxxx@163.com
3.编写邮件工具类
package com.tr.common.utils;
import javax.mail.MessagingException;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* email发送工具类
*/
@Component
public class SEmailUtils {
/**
* 用戶名
*/
@Value("${tr.mail.account}")
private String account;
/**
* 密碼
*/
@Value("${tr.mail.password}")
private String password;
@Value("${tr.mail.smtpPort}")
private Integer smtpPort ;
@Value("${tr.mail.smtpSSLEnabled}")
private Boolean smtpSSLEnabled;
@Value("${tr.mail.smtpHost}")
private String smtpHost ;
@Value("${tr.mail.smtpFromMail}")
private String smtpFromMail ;
public enum ResponseCode{
//发送成功
SENDSUCCESS,
//发送失敗
SENDFAIL,
//邮箱格式不正确
EMAILTYPEERR,
//Email不能为空
ISNULL
}
/**
/**
* * 邮箱发送
* @param es 发送人配置
* @param title 邮件标题
* @param msg 邮件内容消息 可以是html
* @param datas 数据附件 可为空
* @param name 附件名称 可为空
* @param targetEmail 收件人地址
* @return 1:成功,0失敗
*/
public ResponseCode sendEmail( String title , String msg , byte[] datas , String name , String...targetEmail ){
if (targetEmail==null || targetEmail.length == 0){
return ResponseCode.ISNULL;
}
System.setProperty("mail.mime.splitlongparameters","false");
//设置访问smtp服务器需要认证
System.setProperty("mail.smtp.auth", "true");
//设置访问服务器的协议
System.setProperty("mail.transport.protocol", "smtp");
//"网页快测异常网站告警" ;
String subject = title ;
try {
HtmlEmail email = new HtmlEmail();
email.setHostName(smtpHost );
if(smtpSSLEnabled ) {
email.setSslSmtpPort(smtpPort.toString());
} else {
email.setSmtpPort(smtpPort);
}
email.setAuthentication(account, password);
email.setSSLOnConnect(smtpSSLEnabled);
email.setFrom(smtpFromMail, smtpFromMail);
//接收地址
email.addTo(targetEmail);
//抄送
//email.addCc(es.getAccount());
//邮件标题
email.setSubject(subject);
email.setCharset("UTF-8");
MimeMultipart multipart = new MimeMultipart("mixed");
// 邮件内容,采用HTML格式
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.removeHeader("Content-Type");
messageBodyPart.removeHeader("Content-Transfer-Encoding");
messageBodyPart.addHeader("Content-Type", "text/html; charset=gbk");
messageBodyPart.addHeader("Content-Transfer-Encoding", "base64");
messageBodyPart.setContent(msg, "text/html;charset=GBK");
multipart.addBodyPart(messageBodyPart);
email.addPart(multipart);
if(datas != null) {
javax.activation.DataSource ds = new ByteArrayDataSource(datas , "application/vnd.ms-excel");
email.attach(ds,name, name);
}
email.send();
} catch (EmailException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return ResponseCode.SENDFAIL;
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return ResponseCode.SENDSUCCESS;
}
}
4.单元测试,验证
注意事项:测试方法应该写在主程序入口test处,目录结构注意保持一致,否则汇报Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
package com.tr;
import com.tr.common.utils.SEmailUtils;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Test {
@Autowired
private SEmailUtils sEmailUtils;
@org.junit.Test
public void sendEmail() {
sEmailUtils.sendEmail("测试邮箱发送","皮一下很开心0.0",null,null,"xxxx@qq.com");
}
}
5.成功
- 点赞
- 收藏
- 关注作者
评论(0)