电子邮件(e-mail)属于互联网一种最为典型的应用,虽然伴随着即时通信软件的广泛使用,它的通信功能有所减弱,但是在账号注册、账号安全以及工作对接方面仍然占有很大应用空间。电子邮件系统包含三个重要的组件,即用户代理、邮件服务器,以及邮件发送协议(如SMTP)和邮件读取协议(如POP3)。Spring-boot-email属于用户代理部分,使用SMTP、IMAP、MIME等协议进行邮件发送,它们的底层通信原理都是TCP的连接。
电子邮件由信封(envelope)和内容(content)两部分内容构成,在邮件信封上,最重要的就是收件人的地址,TCP/IP体系的邮件系统规定邮件地址(e-mail address)的格式如下:
用户名@邮件服务器的域名
前端界面开发的程序员需要注意的是,这个邮箱标准格式在软件开发中通常用来做格式规则校验,以作为输入有效性的判定,所以很有必要了解一下标准的邮件地址格式要求。
SMTP简单邮件传送协议,SMTP规定了14条命令和21中应答信息。每条命令由几个字母组成,而每一种应答的信息通畅只有一行信息,由一个3位数字的代码(如200 OK)开始,后面带上简单的说明信息。了解邮件底层协议是为了更好应对邮件发送过程中的各种异常,下面是SMTP的一些常用命令:
HELO:由客户端连接SMTP服务器后发送,表明连接开始
AUTH LOGIN:客户端与SMTP服务端认证过程,填写相应的账号密码。
MAIL:邮件传送开始,后面有发件人地址,如MAIL FROM:
RCPT:可以是一到多个,代表收件人地址,如RCPT TO:
DATA:为邮件内容,以
SEND:向用户发生邮件
REST:取消客户端与服务端的事务,释放当前的连接
QUIT:终止客户端与SMTP服务器的连接
此外还有To和Subject两个关键字,用来填入一个或多个收件人的电子邮件地址以及邮件主题,下面使用命令行来发送一封邮件,当然也可以编写程序将协议命令封装起来,然后建立TCP连接进行SMTP邮件发送。
1、启用window Telnet客户端功能,控制面板->程序和功能->启用和关闭Windows功能->勾选Telnet客户端选项
2、连接smtp.163.com邮件服务器
telnet smtp.163.com 25
3、登录
Base64加密后的用户名
Base64加密后的密码
4、设置发件人
MAIL FROM:
5、设置收件人
RCPT TO:
6、填写邮件内容
DATA
from:<[email protected]>
to:<[email protected]>
subject:good night
This is an email from command line. just want to learn how to use SMTP command. thank you.
命令行发送电子邮件通过底层的命令来发送邮件可以加深对SMTP协议的理解,但是SMTP协议只支持ASCLL的编码,这显然不能满足我们日益增多的互联网信息需求,于是MIME拓充协议提出,它在邮件首部说明了邮件的数据类型(文本、声音、图像、影像等),它底层仍然是SMTP,只不过是将信息内容增加了编码,和协议功能拓展而已,也即实现了协议的向下兼容。
Spring-boot由于底层框架帮助我们实现了SMTP邮件发送的协议管理,我们只需按照框架编程即可实现邮件发送,大大减轻编程的难度。
在pom.xml中加入spring email的依赖支持
org.springframework.boot
spring-boot-starter-mail
在application.properties文件中输入配置信息
spring.mail.host=smtp.163.com
spring.mail.username=yourmail address
spring.mail.password=yourpassword
spring.mail.default-encoding=UTF-8
编写smtp邮件发送代码
@Service
public class MailService {
@Value("${spring.mail.username}")
private String from;
private final Logger logger= LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender mailSender;
/**
* 发送简单文本的邮件方法
* @param to
* @param subject
* @param content
*/
public void sendSimpleMail(String to,String subject,String content){
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(to);
message.setFrom(from);
message.setSubject(subject);
message.setText(content);
mailSender.send(message);
}
/**
* 发送HTML邮件的方法
* @param to
* @param subjecr
* @param content
*/
public void sendHtmlMail(String to ,String subjecr,String content){
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message,true);
helper.setTo(to);
helper.setFrom(from);
helper.setSubject(subjecr);
helper.setText(content,true);
mailSender.send(message);
logger.info("发送静态邮件成功");
} catch (MessagingException e) {
logger.error("发送静态邮件失败:",e);
}
}
}
编写smtp邮件发送测试代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class MailServiceTest {
@Resource
MailService mailService;
@Resource
TemplateEngine templateEngine;
@Test
public void sendSpimpleMailTest(){
mailService.sendSimpleMail("[email protected]","这是一封简单文本邮件","明天很美好,今天很重要");
}
@Test
public void sendHtmlMailTest() throws MessagingException {
String content="\n"+
"\n"+
"hello 明天要加油哦!
\n"+
"\n"+
"";
mailService.sendHtmlMail("[email protected]","这是一封html邮件",content);
}
}
•421 HL:REP 该IP发送行为异常,存在接收者大量不存在情况,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并核对发送列表有效性;
•450 MI:CEL 发送方出现过多的错误指令。请检查发信程序;
•500 Error: bad syntaxU 发送的smtp命令语法有误;
•550 MI:NHD HELO命令不允许为空;
•550 MI:IMF 发信人电子邮件地址不合规范;
•550 MI:STC 发件人当天的连接数量超出了限定数量,当天不再接受该发件人的邮件。请控制连接次数;
•552 Requested mail action aborted: exceeded mailsize limit 发送的信件大小超过了网易邮箱允许接收的最大限制;
•553 Requested action not taken: NULL sender is not allowed 不允许发件人为空,请使用真实发件人发送;
•553 authentication is required SMTP需要身份验证,请检查客户端设置;
•554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件;
•554 IP is rejected, smtp auth error limit exceed 该IP验证失败次数过多,被临时禁止连接。请检查验证信息设置;
电子邮件依赖SMTP、IMAP、POP3等协议,SMTP协议由一些命令和应答信息构成,我们可以根据相关命令协议进行程序开发或者借用springboot等框架来发送邮件。参考:
http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html