Spring-boot-email邮件

前言

电子邮件(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:<xxxx@xxx>

RCPT:可以是一到多个,代表收件人地址,如RCPT TO:<xxxx@xxx>

DATA:为邮件内容,以<CRLF>.<CRLF>结束

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:<[email protected]>

5、设置收件人

RCPT TO:<xxxxx@xxxx>

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-email

Spring-boot由于底层框架帮助我们实现了SMTP邮件发送的协议管理,我们只需按照框架编程即可实现邮件发送,大大减轻编程的难度。

在pom.xml中加入spring email的依赖支持

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

在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="<html>\n"+
                "<body>\n"+
                    "<h3>hello 明天要加油哦!</h3>\n"+
                "</body>\n"+
                "</html>";
        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

猜你喜欢

转载自blog.csdn.net/dosthing/article/details/84669290