引入依赖
推荐用spring集成依赖,不用一个包一个包找了。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置
这里以qq为例:
spring:
main:
allow-bean-definition-overriding: true
mail:
host: smtp.qq.com
port: 465
protocol: smtps
userName: 1111111@qq.com
passWord: eyywqbcdfddd
properties:
mail:
smtp:
auth: false
starttls:
enable: false
required: false
注:userName是发送方邮件地址,用自己的qq号就行。
password是授权码,这个要在qq邮箱开通下。
如果启动报错:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
那么记得加这个配置(大意是解决类再次加载的问题):
spring:
main:
allow-bean-definition-overriding: true
代码
javax.mail.internet.MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = null;
helper = new MimeMessageHelper(mimeMessage, true);
URL url = new URL(request.getAttachmentUrl());
DataSource dataSource = new URLDataSource(url); // 附件地址为空会报错 MalformedURLException
helper.addAttachment(request.getAttachmentName(), dataSource); // 附件名为空不报错,会有个默认附件名
helper.setFrom(request.getFrom()); // 发送人
helper.setTo(request.getTo()); // 接收人
helper.setSubject(request.getSubject()); // 主题
helper.setText(request.getText(), true); // 正文
log.info("rest发送邮件开始"); // 这里无法toJson,会报错
mailSender.send(mimeMessage); // 不报错就是成功
log.info("rest发送邮件完成");
因为涉及到参数接收,最好弄个实体类,代码更整洁。实际mail有很多参数,但是常规来说,这些也够用了。
@Data
public class MailEntity{
private String subject;
private String from;
private String to;
private String text;
private String attachmentUrl;
private String attachmentName;
}
附件url地址为空会不会报错
会的,会报错MalformedURLException,这个在发送前的入参检查时就会报错。
接收方邮件地址错误会不会报错
不会,因为邮件是异步的,代码里的发送是发到邮件服务器,邮件服务器后续会发送给接收方,java代码肯定不能等这个反馈,所以不会报错。
但是如果地址错误,邮件的发送方会收到退回邮件。’
邮件有哪些协议呢
常见的有smtp,pop3,imap,exchange等。
大家都听说过,但是不一定了解他们的区别。
smtp
smtp(simple mail transfer protocol)(简单邮件传输协议)是最常见的,他是发件协议。
smpt对应端口 25
收件协议
为什么要谈到收件协议呢?
因为邮件我们最常用的功能有2个,发送和接收。
发送就不说了,推些内容。接收也是很有用的,例如要采集些数据。
发件服务器和收件服务器不是一回事,是不同的,所有也要了解。
常见的有pop3,imap等。具体的区别不用太关心,知道他们是收件协议即可。
pop3 对应端口 110
imap 对应端口 143
当然,协议可以加密,及支持ssl。
exchange收发协议
exchange协议既可以收,也可以发。