1. 首页
  2. IT资讯

10 分钟实现 Spring Boot 发生邮件功能

“u003Cpu003E优质文章,及时送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRcsUnd92eoboDR” img_width=”640″ img_height=”29″ alt=”10 分钟实现 Spring Boot 发生邮件功能” inline=”0″u003Eu003Cpu003E链接 | u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Ewww.u003Cu002Fiu003Ejianshuu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002Fpu002F5eb000544dd7u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E基础知识u003Cu002Fh1u003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E什么是SMTP?u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003ESMTP全称为Simple Mail Transfer Protocol(简单邮件传输协议),它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP认证要求必须提供账号和密码才能登陆服务器,其设计目的在于避免用户受到垃圾邮件的侵扰。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E什么是IMAP?u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003EIMAP全称为Internet Message Access Protocol(互联网邮件访问协议),IMAP允许从邮件服务器上获取邮件的信息、u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E下载u003Cu002Fiu003E邮件等。IMAP与POP类似,都是一种邮件获取协议。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E什么是POP3?u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003EPOP3全称为Post Office Protocol 3(邮局协议),POP3支持u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003E远程管理服务器端的邮件。POP3常用于“离线”邮件处理,即允许u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E下载u003Cu002Fiu003E服务器邮件,然后服务器上的邮件将会被删除。目前很多POP3的邮件服务器只提供u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E下载u003Cu002Fiu003E邮件功能,服务器本身并不删除邮件,这种属于改进版的POP3协议。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003EIMAP和POP3协议有什么不同呢?u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E两者最大的区别在于,IMAP允许双向通信,即在u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003E的操作会反馈到服务器上,例如在u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003E收取邮件、标记已读等操作,服务器会跟着同步这些操作。而对于POP协议虽然也允许u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E下载u003Cu002Fiu003E服务器邮件,但是在u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003E的操作并不会同步到服务器上面的,例如在u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003E收取或标记已读邮件,服务器不会同步这些操作。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E进阶知识u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E什么是JavaMailSender和JavaMailSenderImpl?u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003EJavaMailSender和JavaMailSenderImpl 是Spring官方提供的集成邮件服务的接口和实现类,以简单高效的设计著称,目前是Java后端发送邮件和集成邮件服务的主流工具。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E如何通过JavaMailSenderImpl发送邮件?u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E非常简单,直接在业务类注入JavaMailSenderImpl并调用send方法发送邮件。其中简单邮件可以通过SimpleMailMessage来发送邮件,而复杂的邮件(例如添加附件)可以借助MimeMessageHelper来构建MimeMessage发送邮件。例如:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@Autowiredu003Cbru003Eprivate JavaMailSenderImpl mailSender;u003Cbru003Eu003Cbru003Epublic void sendMail throws MessagingException {u003Cbru003Eu002Fu002F简单邮件u003Cbru003ESimpleMailMessage simpleMailMessage = new SimpleMailMessage;u003Cbru003EsimpleMailMessage.setFrom(“admin@163u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003E”);u003Cbru003EsimpleMailMessage.setTo(“socks@u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003Eqqu003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003E”);u003Cbru003EsimpleMailMessage.setSubject(“Hu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Ey New Year”);u003Cbru003EsimpleMailMessage.setText(“新年快乐!”);u003Cbru003EmailSender.send(simpleMailMessage);u003Cbru003Eu003Cbru003Eu002Fu002F复杂邮件u003Cbru003EMimeMessage mimeMessage = mailSender.createMimeMessage;u003Cbru003EMimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);u003Cbru003EmessageHelper.setFrom(“admin@163u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003E”);u003Cbru003EmessageHelper.setTo(“socks@u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003Eqqu003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003E”);u003Cbru003EmessageHelper.setSubject(“Hu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Ey New Year”);u003Cbru003EmessageHelper.setText(“新年快乐!”);u003Cbru003EmessageHelper.addInline(“doge.gif”, new File(“xxu002Fxxu002Fdoge.gif”));u003Cbru003EmessageHelper.addAttachment(“work.docx”, new File(“xxu002Fxxu002Fwork.docx”));u003Cbru003EmailSender.send(mimeMessage);u003Cbru003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E为什么JavaMailSenderImpl 能够开箱即用 ?u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E所谓开箱即用其实就是基于官方内置的自动配置,翻看源码可知晓邮件自动配置类(MailSenderPropertiesConfiguration) 为上下文提供了邮件服务实例(JavaMailSenderImpl)。具体源码如下:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@Configurationu003Cbru003E@ConditionalOnProperty(prefix = “spring.mail”, name = “host”)u003Cbru003Eu003Cstrong toutiao-origin=”span”u003Eclassu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003EMailSenderPropertiesConfigurationu003Cu002Fstrongu003E{u003Cbru003Eprivate final MailProperties properties;u003Cbru003EMailSenderPropertiesConfiguration(MailProperties properties) {u003Cbru003Ethis.properties = properties;u003Cbru003E}u003Cbru003E@Beanu003Cbru003E@ConditionalOnMissingBeanu003Cbru003Epublic JavaMailSenderImpl mailSender {u003Cbru003EJavaMailSenderImpl sender = new JavaMailSenderImpl;u003Cbru003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003ElyProperties(sender);u003Cbru003Ereturn sender;u003Cbru003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E其中MailProperties是关于邮件服务器的配置信息,具体源码如下:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@ConfigurationProperties(prefix = “spring.mail”)u003Cbru003Epublic class MailProperties {u003Cbru003Eprivate static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;u003Cbru003Eprivate String host;u003Cbru003Eprivate Integer port;u003Cbru003Eprivate String username;u003Cbru003Eprivate String password;u003Cbru003Eprivate String protocol = “smtp”;u003Cbru003Eprivate Charset defaultEncoding = DEFAULT_CHARSET;u003Cbru003Eprivate Map<String, String> properties = new HashMap<>;u003Cbru003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E使用教程u003Cu002Fh1u003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E一、开启邮件服务u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Cpu003E登陆网易邮箱163,在设置中打开并勾选POP3u002FSMTPu002FIMAP服务,然后会得到一个授权码,这个邮箱和授权码将用作登陆认证。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRis5h6W9UvEioz” img_width=”1080″ img_height=”869″ alt=”10 分钟实现 Spring Boot 发生邮件功能” inline=”0″u003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E二、配置邮件服务u003Cu002Fh2u003Eu003Cpu003E首先咱们通过 Spring Initializr 创建工程springboot-send-mail,如图所示:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRis5h6qEkCF6FY” img_width=”756″ img_height=”872″ alt=”10 分钟实现 Spring Boot 发生邮件功能” inline=”0″u003Eu003Cpu003E然后在pom.xml 引入web、thymeleaf 和spring-boot-starter-mail等相关依赖。例如:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<dependencies>u003Cbru003E<dependency>u003Cbru003E<groupId>org.springframework.boot<u002FgroupId>u003Cbru003E<artifactId>spring-boot-starter-web<u002FartifactId>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.springframework.boot<u002FgroupId>u003Cbru003E<artifactId>spring-boot-starter-thymeleaf<u002FartifactId>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.springframework.boot<u002FgroupId>u003Cbru003E<artifactId>spring-boot-starter-mail<u002FartifactId>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.webjars<u002FgroupId>u003Cbru003E<artifactId>webjars-locator-core<u002FartifactId>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.webjars<u002FgroupId>u003Cbru003E<artifactId>jquery<u002FartifactId>u003Cbru003E<version>3.3.1<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.webjars<u002FgroupId>u003Cbru003E<artifactId>bootstrap<u002FartifactId>u003Cbru003E<version>3.3.7<u002Fversion>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.springframework.boot<u002FgroupId>u003Cbru003E<artifactId>spring-boot-devtools<u002FartifactId>u003Cbru003E<scope>runtime<u002Fscope>u003Cbru003E<u002Fdependency>u003Cbru003E<dependency>u003Cbru003E<groupId>org.springframework.boot<u002FgroupId>u003Cbru003E<artifactId>spring-boot-starter-test<u002FartifactId>u003Cbru003E<scope>test<u002Fscope>u003Cbru003E<u002Fdependency>u003Cbru003E<u002Fdependencies>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E根据前面提到的配置项(MailProperties)填写相关配置信息,其中spring.mail.username 表示连接邮件服务器时认证的登陆账号,可以是普通的手机号或者登陆账号,并非一定是邮箱,为了解决这个问题,推荐大家在spring.mail. properties.from填写邮件发信人即真实邮箱。u003Cu002Fpu003Eu003Cpu003ETips:u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E关注u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E微信u003Cu002Fiu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E公众号u003Cu002Fiu003E:Java后端,每日提送技术博文。u003Cu002Fpu003Eu003Cpu003E然后在u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Elication.yml添加如下配置:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Espring:u003Cbru003Email:u003Cbru003Ehost: smtp.163u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003E #SMTP服务器地址u003Cbru003Eusername: socks #登陆账号u003Cbru003Epassword: 123456 #登陆密码(或授权码)u003Cbru003Eproperties:u003Cbru003Efrom: socks@163u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003E #邮件发信人(即真实邮箱)u003Cbru003Ethymeleaf:u003Cbru003Ecache: falseu003Cbru003Eprefix: classpath:u002Fviewsu002Fu003Cbru003Eservlet:u003Cbru003Emultipart:u003Cbru003Emax-file-size: 10MB #限制单个文件大小u003Cbru003Emax-request-size: 50MB #限制请求总量u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E透过前面的进阶知识,我们知道在发送邮件前,需要先构建 SimpleMailMessage或 MimeMessage 邮件信息类来填写邮件标题、邮件内容等信息,最后提交给JavaMailSenderImpl发送邮件,这样看起来没什么问题,也能实现既定目标,但在实际使用中会出现大量零散和重复的代码,还不便于保存邮件到数据库。u003Cu002Fpu003Eu003Cpu003E那么优雅的发送邮件应该是如何的呢?应该屏蔽掉这些构建信息和发送邮件的细节,不管是简单还是复杂邮件,都可以通过统一的API来发送邮件。例如:mailService.send(mailVo) 。u003Cu002Fpu003Eu003Cpu003E例如通过邮件信息类(MailVo) 来保存发送邮件时的邮件主题、邮件内容等信息 :u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Epackage com.hehe.vo;u003Cbru003Eu003Cbru003Epublic class MailVo {u003Cbru003Eprivate String id;u002Fu002F邮件idu003Cbru003Eprivate String from;u002Fu002F邮件发送人u003Cbru003Eprivate String to;u002Fu002F邮件接收人(多个邮箱则用逗号”,”隔开)u003Cbru003Eprivate String subject;u002Fu002F邮件主题u003Cbru003Eprivate String text;u002Fu002F邮件内容u003Cbru003Eprivate Date sentDate;u002Fu002F发送时间u003Cbru003Eprivate String cc;u002Fu002F抄送(多个邮箱则用逗号”,”隔开)u003Cbru003Eprivate String bcc;u002Fu002F密送(多个邮箱则用逗号”,”隔开)u003Cbru003Eprivate String status;u002Fu002F状态u003Cbru003Eprivate String error;u002Fu002F报错信息u003Cbru003E@JsonIgnoreu003Cbru003Eprivate MultipartFile multipartFiles;u002Fu002F邮件附件u003Cbru003Eu002Fu002F省略GET&SET方法u003Cbru003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E三、发送邮件和附件u003Cu002Fh1u003Eu003Cpu003E除了发送邮件之外,还包括检测邮件和保存邮件等操作,例如:u003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E检测邮件 checkMail; 首先校验邮件收信人、邮件主题和邮件内容这些必填项,若为空则拒绝发送。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E发送邮件 sendMimeMail; 其次通过MimeMessageHelper来解析MailVo并构建MimeMessage传输邮件。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E保存邮件 sendMimeMail; 最后将邮件保存到数据库,便于统计和追查邮件问题。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E本案例邮件业务类 MailService 的具体源码如下:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003Epackage com.hehe.service;u003Cbru003Eu003Cbru003Eu002F**u003Cbru003E* 邮件业务类 MailServiceu003Cbru003E*u002Fu003Cbru003E@Serviceu003Cbru003Epublicu003Cstrong toutiao-origin=”span”u003Eclassu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003EMailServiceu003Cu002Fstrongu003E{u003Cbru003Eu003Cbru003Eprivate Logger logger = LoggerFactory.getLogger(getClass);u002Fu002F提供日志类u003Cbru003Eu003Cbru003E@Autowiredu003Cbru003Eprivate JavaMailSenderImpl mailSender;u002Fu002F注入邮件工具类u003Cbru003Eu003Cbru003Eu003Cbru003Eu002F**u003Cbru003E* 发送邮件u003Cbru003E*u002Fu003Cbru003Epublic MailVo sendMail(MailVo mailVo) {u003Cbru003Etry {u003Cbru003EcheckMail(mailVo); u002Fu002F1.检测邮件u003Cbru003EsendMimeMail(mailVo); u002Fu002F2.发送邮件u003Cbru003Ereturn saveMail(mailVo); u002Fu002F3.保存邮件u003Cbru003E} catch (Exception e) {u003Cbru003Elogger.error(“发送邮件失败:”, e);u002Fu002F打印错误信息u003Cbru003EmailVo.setStatus(“fail”);u003Cbru003EmailVo.setError(e.getMessage);u003Cbru003Ereturn mailVo;u003Cbru003E}u003Cbru003Eu003Cbru003E}u003Cbru003Eu003Cbru003Eu002Fu002F检测邮件信息类u003Cbru003Eu003Cstrong toutiao-origin=”span”u003Eprivateu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003Evoidu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003EcheckMailu003Cu002Fstrongu003E(MailVo mailVo) {u003Cbru003Eif (StringUtils.isEmpty(mailVo.getTo)) {u003Cbru003Ethrow new RuntimeException(“邮件收信人不能为空”);u003Cbru003E}u003Cbru003Eif (StringUtils.isEmpty(mailVo.getSubject)) {u003Cbru003Ethrow new RuntimeException(“邮件主题不能为空”);u003Cbru003E}u003Cbru003Eif (StringUtils.isEmpty(mailVo.getText)) {u003Cbru003Ethrow new RuntimeException(“邮件内容不能为空”);u003Cbru003E}u003Cbru003E}u003Cbru003Eu003Cbru003Eu002Fu002F构建复杂邮件信息类u003Cbru003Eu003Cstrong toutiao-origin=”span”u003Eprivateu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003Evoidu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003EsendMimeMailu003Cu002Fstrongu003E(MailVo mailVo) {u003Cbru003Etry {u003Cbru003EMimeMessageHelper messageHelper = new MimeMessageHelper(mailSender.createMimeMessage, true);u002Fu002Ftrue表示支持复杂类型u003Cbru003EmailVo.setFrom(getMailSendFrom);u002Fu002F邮件发信人从配置项读取u003Cbru003EmessageHelper.setFrom(mailVo.getFrom);u002Fu002F邮件发信人u003Cbru003EmessageHelper.setTo(mailVo.getTo.split(“,”));u002Fu002F邮件收信人u003Cbru003EmessageHelper.setSubject(mailVo.getSubject);u002Fu002F邮件主题u003Cbru003EmessageHelper.setText(mailVo.getText);u002Fu002F邮件内容u003Cbru003Eif (!StringUtils.isEmpty(mailVo.getCc)) {u002Fu002F抄送u003Cbru003EmessageHelper.setCc(mailVo.getCc.split(“,”));u003Cbru003E}u003Cbru003Eif (!StringUtils.isEmpty(mailVo.getBcc)) {u002Fu002F密送u003Cbru003EmessageHelper.setCc(mailVo.getBcc.split(“,”));u003Cbru003E}u003Cbru003Eif (mailVo.getMultipartFiles != ) {u002Fu002F添加邮件附件u003Cbru003Efor (MultipartFile multipartFile : mailVo.getMultipartFiles) {u003Cbru003EmessageHelper.addAttachment(multipartFile.getOriginalFilename, multipartFile);u003Cbru003E}u003Cbru003E}u003Cbru003Eif (StringUtils.isEmpty(mailVo.getSentDate)) {u002Fu002F发送时间u003Cbru003EmailVo.setSentDate(new Date);u003Cbru003EmessageHelper.setSentDate(mailVo.getSentDate);u003Cbru003E}u003Cbru003EmailSender.send(messageHelper.getMimeMessage);u002Fu002F正式发送邮件u003Cbru003EmailVo.setStatus(“ok”);u003Cbru003Elogger.info(“发送邮件成功:{}->{}”, mailVo.getFrom, mailVo.getTo);u003Cbru003E} catch (Exception e) {u003Cbru003Ethrow new RuntimeException(e);u002Fu002F发送失败u003Cbru003E}u003Cbru003E}u003Cbru003Eu003Cbru003Eu002Fu002F保存邮件u003Cbru003Eprivate MailVo saveMail(MailVo mailVo) {u003Cbru003Eu002Fu002F将邮件保存到数据库..u003Cbru003Ereturn mailVo;u003Cbru003E}u003Cbru003Eu003Cbru003Eu002Fu002F获取邮件发信人u003Cbru003Epublic String getMailSendFrom {u003Cbru003Ereturn mailSender.getJavaMailProperties.getProperty(“from”);u003Cbru003E}u003Cbru003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cblockquoteu003Eu003Cpu003E搞定了发送邮件最核心的业务逻辑,接下来咱们写一个简单页面用来发送邮件。u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E首先写好跟页面交互的控制器 MailController,具体源码如下:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E@RestControlleru003Cbru003Epublicu003Cstrong toutiao-origin=”span”u003Eclassu003Cu002Fstrongu003Eu003Cstrong toutiao-origin=”span”u003EMailControlleru003Cu002Fstrongu003E{u003Cbru003E@Autowiredu003Cbru003Eprivate MailService mailService;u003Cbru003Eu003Cbru003Eu002F**u003Cbru003E* 发送邮件的主界面u003Cbru003E*u002Fu003Cbru003E@GetMu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Eing(“u002F”)u003Cbru003Epublic ModelAndView index {u003Cbru003EModelAndView mv = new ModelAndView(“mailu002FsendMail”);u002Fu002F打开发送邮件的页面u003Cbru003Emv.addObject(“from”, mailService.getMailSendFrom);u002Fu002F邮件发信人u003Cbru003Ereturn mv;u003Cbru003E}u003Cbru003Eu002F**u003Cbru003E* 发送邮件u003Cbru003E*u002Fu003Cbru003E@PostMu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Eing(“u002Fmailu002Fsend”)u003Cbru003Epublic MailVo sendMail(MailVo mailVo, MultipartFile[] files) {u003Cbru003EmailVo.setMultipartFiles(files);u003Cbru003Ereturn mailService.sendMail(mailVo);u002Fu002F发送邮件和附件u003Cbru003E}u003Cbru003E}u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003E然后在u002Fresourcesu002Fviewsu002Fmail目录新建sendMail.html,具体源码如下:u003Cu002Fpu003Eu003Cpreu003Eu003Ccodeu003E<!DOCTYPE html>u003Cbru003E<html xmlns:th=”u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Ewww.u003Cu002Fiu003Ethymeleaf.org”>u003Cbru003Eu003Cbru003E<head>u003Cbru003E<meta charset=”UTF-8″u002F>u003Cbru003E<title>发送邮件<u002Ftitle>u003Cbru003E<link th:href=”@{u002Fwebjarsu002Fbootstrapu002Fcssu002Fbootstrap.min.css}” rel=”stylesheet” type=”textu002Fcss”u002F>u003Cbru003E<script th:src=”@{u002Fwebjarsu002Fjqueryu002Fjquery.min.js}”><u002Fscript>u003Cbru003E<script th:href=”@{u002Fwebjarsu002Fbootstrapu002Fjsu002Fbootstrap.min.js}”><u002Fscript>u003Cbru003Eu003Cbru003E<u002Fhead>u003Cbru003Eu003Cbru003E<body>u003Cbru003E<div class=”col-md-6″ style=”margin:20px;padding:20px;border: #E0E0E0 1px solid;”>u003Cbru003E<marquee behavior=”alternate” onfinish=”alert(12)” id=”mq”u003Cbru003EonMouseOut=”this.start;$(‘#egg’).text(‘嗯 真听话!’);”u003Cbru003EonMouseOver=”this.stop;$(‘#egg’).text(‘有本事放开我呀!’);”>u003Cbru003E<h5 id=”egg”>祝大家新年快乐!<u002Fh5><img id=”doge” src=”u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Fpics.sc.chinazu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003Eu002FFilesu002Fpicu002Ffacesu002F3709u002F7.gif” alt=””>u003Cbru003E<u002Fmarquee>u003Cbru003Eu003Cbru003E<form class=”form-horizontal” id=”mailForm”>u003Cbru003E<div class=”form-group”>u003Cbru003E<label class=”col-md-2 control-label”>邮件发信人:<u002Flabel>u003Cbru003E<div class=”col-md-6″>u003Cbru003E<input class=”form-control” id=”from” name=”from” th:value=”${from}” readonly=”readonly”>u003Cbru003E<u002Fdiv>u003Cbru003E<u002Fdiv>u003Cbru003E<div class=”form-group”>u003Cbru003E<label class=”col-md-2 control-label”>邮件收信人:<u002Flabel>u003Cbru003E<div class=”col-md-6″>u003Cbru003E<input class=”form-control” id=”to” name=”to” title=”多个邮箱使用,隔开”>u003Cbru003E<u002Fdiv>u003Cbru003E<u002Fdiv>u003Cbru003E<div class=”form-group”>u003Cbru003E<label class=”col-md-2 control-label”>邮件主题:<u002Flabel>u003Cbru003E<div class=”col-md-6″>u003Cbru003E<input class=”form-control” id=”subject” name=”subject”>u003Cbru003E<u002Fdiv>u003Cbru003E<u002Fdiv>u003Cbru003E<div class=”form-group”>u003Cbru003E<label class=”col-md-2 control-label”>邮件内容:<u002Flabel>u003Cbru003E<div class=”col-md-6″>u003Cbru003E<textarea class=”form-control” id=”text” name=”text” rows=”5″><u002Ftextarea>u003Cbru003E<u002Fdiv>u003Cbru003E<u002Fdiv>u003Cbru003E<div class=”form-group”>u003Cbru003E<label class=”col-md-2 control-label”>邮件附件:<u002Flabel>u003Cbru003E<div class=”col-md-6″>u003Cbru003E<input class=”form-control” id=”files” name=”files” type=”file” multiple=”multiple”>u003Cbru003E<u002Fdiv>u003Cbru003E<u002Fdiv>u003Cbru003E<div class=”form-group”>u003Cbru003E<label class=”col-md-2 control-label”>邮件操作:<u002Flabel>u003Cbru003E<div class=”col-md-3″>u003Cbru003E<a class=”form-control btn btn-primary” onclick=”sendMail”>发送邮件<u002Fa>u003Cbru003E<u002Fdiv>u003Cbru003E<div class=”col-md-3″>u003Cbru003E<a class=”form-control btn btn-default” onclick=”clearForm”>清空<u002Fa>u003Cbru003E<u002Fdiv>u003Cbru003E<u002Fdiv>u003Cbru003E<u002Fform>u003Cbru003Eu003Cbru003E<script th:inline=”javascript”>u003Cbru003Evar u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003ECtx = [[${#request.getContextPath()}]];u003Cbru003Eu003Cbru003Efunction sendMail {u003Cbru003Eu003Cbru003Evar formData = new FormData($(‘#mailForm’)[0]);u003Cbru003E$.ajax({u003Cbru003Eurl: u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003ECtx + ‘u002Fmailu002Fsend’,u003Cbru003Etype: “POST”,u003Cbru003Edata: formData,u003Cbru003EcontentType: false,u003Cbru003EprocessData: false,u003Cbru003Esuccess: function (result) {u003Cbru003Ealert(result.status === ‘ok’ ? “发送成功!” : “你被Doge嘲讽了:” + result.error);u003Cbru003E},u003Cbru003Eerror: function {u003Cbru003Ealert(“发送失败!”);u003Cbru003E}u003Cbru003E});u003Cbru003E}u003Cbru003Eu003Cbru003Efunction clearForm {u003Cbru003E$(‘#mailForm’)[0].reset;u003Cbru003E}u003Cbru003Eu003Cbru003EsetInterval(function {u003Cbru003Evar total = $(‘#mq’).width;u003Cbru003Evar width = $(‘#doge’).width;u003Cbru003Evar left = $(‘#doge’).offset.left;u003Cbru003Eif (left <= width u002F 2 + 20) {u003Cbru003E$(‘#doge’).css(‘transform’, ‘rotateY(180deg)’)u003Cbru003E}u003Cbru003Eif (left >= total – width u002F 2 – 40) {u003Cbru003E$(‘#doge’).css(‘transform’, ‘rotateY(-360deg)’)u003Cbru003E}u003Cbru003E});u003Cbru003E<u002Fscript>u003Cbru003E<u002Fdiv>u003Cbru003E<u002Fbody>u003Cbru003E<u002Fhtml>u003Cu002Fcodeu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E四、测试发送邮件u003Cu002Fh1u003Eu003Cpu003E如果是初学者,u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E建议u003Cu002Fiu003E大家先u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E下载u003Cu002Fiu003E源码,修改配置后运行工程,成功后再自己重新写一遍代码,这样有助于加深记忆。u003Cu002Fpu003Eu003Cpu003E启动工程并访问:u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Flocau003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003Elhu003Cu002Fiu003Eost:8080 然后可以看到发送邮件的主界面如下:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FRis5h71NvbHyd” img_width=”640″ img_height=”513″ alt=”10 分钟实现 Spring Boot 发生邮件功能” inline=”0″u003Eu003Cpu003E然后填写你的小号邮箱,点击发送邮件,若成功则可以登陆小号邮箱查看邮件和刚才上传的附件。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FRis5h79GanO5vK” img_width=”640″ img_height=”399″ alt=”10 分钟实现 Spring Boot 发生邮件功能” inline=”0″u003Eu003Cpu003E至此发送邮件代码全部完成,欢迎大家u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003E下载u003Cu002Fiu003E并u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-6″u003E关注u003Cu002Fiu003EGithub 源码。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E五、常见失败编码u003Cu002Fh1u003Eu003Cpu003E如果企业定制了邮件服务器,自然会记录邮件日志,根据错误编码存储日志有利于日常维护。u003Cu002Fpu003Eu003Cpu003E例如这些由网易邮箱提供的错误编码标识:u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E421u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003E421 HL:REP 该IP发送行为异常,存在接收者大量不存在情况,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并核对发送列表有效性;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E421 HL:ICC 该IP同时并发连接数过大,超过了网易的限制,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低IP并发连接数量;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E421 HL:IFC 该IP短期内发送了大量信件,超过了网易的限制,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低发送频率;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E421 HL:MEP 该IP发送行为异常,存在大量伪造发送域域名行为,被临时禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并使用真实有效的域名发送;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E450u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003E450 MI:CEL 发送方出现过多的错误指令。请检查发信程序;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E450 MI:DMC 当前连接发送的邮件数量超出限制。请减少每次连接中投递的邮件数量;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E450 MI:CCL 发送方发送超出正常的指令数量。请检查发信程序;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E450 RP:DRC 当前连接发送的收件人数量超出限制。请控制每次连接投递的邮件数量;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E450 RP:CCL 发送方发送超出正常的指令数量。请检查发信程序;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E450 DT:RBL 发信IP位于一个或多个RBL里。请参考u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Ewww.u003Cu002Fiu003Erbls.orgu002F关于RBL的相关信息;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E450 WM:BLI 该IP不在网易允许的发送地址列表里;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E450 WM:BLU 此用户不在网易允许的发信用户列表里;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E451u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003E451 DT:SPM ,please try again 邮件正文带有垃圾邮件特征或发送环境缺乏规范性,被临时拒收。请保持邮件队列,两分钟后重投邮件。需调整邮件内容或优化发送环境;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E451 Requested mail action not taken: too much fail authentication 登录失败次数过多,被临时禁止登录。请检查密码与帐号验证设置;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E451 RP:CEL 发送方出现过多的错误指令。请检查发信程序;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E451 MI:DMC 当前连接发送的邮件数量超出限制。请控制每次连接中投递的邮件数量;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E451 MI:SFQ 发信人在15分钟内的发信数量超过限制,请控制发信频率;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E451 RP:QRC 发信方短期内累计的收件人数量超过限制,该发件人被临时禁止发信。请降低该用户发信频率;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E451 Requested action aborted: local error in processing 系统暂时出现故障,请稍后再次尝试发送;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eu003Cstrongu003E500u003Cu002Fstrongu003Eu003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003E500 Error: bad syntaxU 发送的smtp命令语法有误;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 MI:NHD HELO命令不允许为空;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 MI:IMF 发信人电子邮件地址不合规范。请参考u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Ewww.u003Cu002Fiu003Erfc-editor.orgu002F关于电子邮件规范的定义;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 MI:SPF 发信IP未被发送域的SPF许可。请参考u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003Ewww.u003Cu002Fiu003Eopenspf.orgu002F关于SPF规范的定义;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 MI:DMA 该邮件未被发信域的DMARC许可。请参考u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-3″u003Ehttpu003Cu002Fiu003E:u002Fu002Fdmarc.orgu002F关于DMARC规范的定义;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 MI:STC 发件人当天的连接数量超出了限定数量,当天不再接受该发件人的邮件。请控制连接次数;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 RP:FRL 网易邮箱不开放匿名转发(Open relay);u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 RP:RCL 群发收件人数量超过了限额,请减少每封邮件的收件人数量;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 RP:TRC 发件人当天内累计的收件人数量超过限制,当天不再接受该发件人的邮件。请降低该用户发信频率;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 DT:SPM 邮件正文带有很多垃圾邮件特征或发送环境缺乏规范性。需调整邮件内容或优化发送环境;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 Invalid User 请求的用户不存在;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 User in blacklist 该用户不被允许给网易用户发信;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 User suspended 请求的用户处于禁用或者冻结状态;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E550 Requested mail action not taken: too much recipient 群发数量超过了限额;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E552u003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003E552 Illegal Attachment 不允许发送该类型的附件,包括以.uu .pif .scr .mim .hqx .bhx .cmd .vbs .bat u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003E.comu003Cu002Fiu003E .vbe .vb .js .wsh等结尾的附件;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E552 Requested mail action aborted: exceeded mailsize limit 发送的信件大小超过了网易邮箱允许接收的最大限制;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E553u003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003E553 Requested action not taken: sender is not allowed 不允许发件人为空,请使用真实发件人发送;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E553 Requested action not taken: Local user only SMTP类型的机器只允许发信人是本站用户;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E553 Requested action not taken: no smtp MX only MX类型的机器不允许发信人是本站用户;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E553 authentication is required SMTP需要身份验证,请检查u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003E设置;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E554u003Cu002Fh2u003Eu003Culu003Eu003Cliu003Eu003Cpu003E554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E554 DT:SUM 信封发件人和信头发件人不匹配;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E554 IP is rejected, smtp auth error limit exceed 该IP验证失败次数过多,被临时禁止连接。请检查验证信息设置;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E554 HL:IHU 发信IP因发送垃圾邮件或存在异常的连接行为,被暂时挂起。请检测发信IP在历史上的发信情况和发信程序是否存在异常;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E554 HL:IPB 该IP不在网易允许的发送地址列表里;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E554 MI:STC 发件人当天内累计邮件数量超过限制,当天不再接受该发件人的投信。请降低发信频率;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E554 MI:SPB 此用户不在网易允许的发信用户列表里;u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E554 IP in blacklist 该IP不在网易允许的发送地址列表里。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cp class=”pgc-end-source”u003E【END】u003Cu002Fpu003E”

原文始发于:10 分钟实现 Spring Boot 发生邮件功能

主题测试文章,只做测试使用。发布者:逗乐男神i,转转请注明出处:http://www.cxybcw.com/17732.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code