简介
Spring提供了非常好用的 JavaMailSender接口实现邮件发送。在Spring Boot的Starter模块中也为此提供了自动化配置。下面通过实例看看如何在Spring Boot中使用 JavaMailSender 发送邮件。
1.导入依赖 spring提供了操作邮箱的相关工具包。开箱即用(哈哈哈),添加相关依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2.邮箱配置 既然要发送邮件,那么你肯定能够想到这里是需要配置你邮箱的账号和密码的,要不然你是想随便就能发的么(想想都觉得不合理)。所以相关yml配置文件如下:
#邮箱配置
spring:
mail:
host: smtp.163.com
#发送者邮箱账号
username: 你的邮箱@163.com
#发送者密钥
password: 你的密钥
default-encoding: utf-8
port: 465 #端口号465或587
protocol: smtp
properties:
mail:
debug:
false
smtp:
socketFactory:
class: javax.net.ssl.SSLSocketFactory
这里有个地方需要注意的就是那个密码password用你自己平时登陆的密码可能不行。那么你可以参考以下的邮箱授权配置如下图:
邮箱授权码
3.邮箱操作服务类 此处有几个点需要注意的
具体操作如下
@Service
public class MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String from;
private static String projectPath = StringUtils
.substringBefore(System.getProperty("user.dir").replaceAll("\\\\", "/"), "/");
static {
System.setProperty("mail.mime.splitlongparameters", "false");
}
/**
* 发送简易邮件
*/
@Async
public void sendSimpleMail(MailBean mailBean) throws Exception {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);//发送方
message.setTo(mailBean.getReceiver().split(";"));//接收者
message.setSubject(mailBean.getSubject());//主题
message.setText(mailBean.getContent());//内容
javaMailSender.send(message);
logger.info("简单邮件已经发送。");
}
/**
* 发送带多附件的邮件
*
* @param mailBean
* @throws Exception
*/
@Async
public void sendMultiAttachmentsMail(MailBean mailBean) throws Exception {
MimeMessage message = javaMailSender.createMimeMessage();
// true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(mailBean.getReceiver().split(";"));
helper.setSubject(mailBean.getSubject());
helper.setText(mailBean.getContent());
String[] files = mailBean.getAttachment().split("\\|");
for (String fileName : files) {
String path = projectPath + "/temp/" + fileName;
FileSystemResource file = new FileSystemResource(path);
if (file.exists() && file.isFile()) {
helper.addAttachment(fileName, file);
}
}
javaMailSender.send(message);
logger.info("带附件的邮件已经发送。");
}
/**
* 发送邮件-邮件正文是HTML
*
* @param mailBean
* @throws Exception
*/
@Async
public void sendMailHtml(MailBean mailBean) throws Exception {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
helper.setFrom(from);
helper.setTo(mailBean.getReceiver().split(";"));
helper.setSubject(mailBean.getSubject());
helper.setText(mailBean.getContent(), true);
javaMailSender.send(mimeMessage);
}
/**
* 内联资源(静态资源)邮件发送 由于邮件服务商不同,可能有些邮件并不支持内联资源的展示 在测试过程中,新浪邮件不支持,QQ邮件支持
* 不支持不意味着邮件发送不成功,而且内联资源在邮箱内无法正确加载
*
* @param mailBean
* @throws Exception
*/
@Async
public void sendMailInline(MailBean mailBean) throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
helper.setFrom(from);
helper.setTo(mailBean.getReceiver().split(";"));
helper.setSubject(mailBean.getSubject());
// helper.setText(mailBean.getContent(),true);
// helper.addInline();
helper.setText("my text <img src='cid:myLogo'>", true);
helper.addInline("myLogo", new ClassPathResource("img/mylogo.gif"));
javaMailSender.send(mimeMessage);
// mailSender.send(new MimeMessagePreparator() {
// public void prepare(MimeMessage mimeMessage) throws MessagingException {
// MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
// message.setFrom("me@mail.com");
// message.setTo("you@mail.com");
// message.setSubject("my subject");
// message.setText("my text <img src='cid:myLogo'>", true);
// message.addInline("myLogo", new ClassPathResource("img/mylogo.gif"));
// message.addAttachment("myDocument.pdf", new ClassPathResource("doc/myDocument.pdf"));
// }
// });
}
/**
* 模板邮件发送
*
* @param mailBean
* @throws Exception
*/
@Async
public void sendMailTemplate(MailBean mailBean) throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(mailBean.getReceiver().split(";"));
helper.setSubject(mailBean.getSubject());
helper.setText(mailBean.getContent(), true);
javaMailSender.send(mimeMessage);
}
}
4.页面参考如下 普通的表单提交加上多附件上传。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>邮件发送</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div style="margin-left: 20px;">
<form role="form">
<div class="form-group">
<label>收件人</label>
<input style="width: 300px;" type="text" class="form-control" id="receiver" name="receiver"
placeholder="收件人">
</div>
<div class="form-group">
<label>主题</label>
<input style="width: 300px;" type="text" class="form-control" id="subject" name="subject" placeholder="主题">
</div>
<div class="form-group">
<label>内容</label>
<input style="width: 300px;" type="text" class="form-control" id="content" name="content" placeholder="内容">
</div>
<div class="form-group">
<label>附件</label>
<form>
<input type="file" multiple id="file" name="file[]" >
<input type="button" id="btn" value="上传"/>
</form>
<input type="hidden" id="attachment" name="attachment">
</div>
<button type="submit" id="send" class="btn btn-default">提交</button>
</form>
</div>
<script>
$(function () {
$('#send').click(function () {
var d = {};
var t = $('form').serializeArray();
$.each(t, function () {
d[this.name] = this.value;
});
console.log(JSON.stringify(d));
$.ajax({
type: "POST",
url: "/mail/send",
data: JSON.stringify(d),
cache: false,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
alert(data.message);
},
error: function (err) {
alert(err);
}
});
});
$("#btn").click(function(){
var formData = new FormData();
for(var i=0; i<$('#file')[0].files.length;i++){
formData.append('file', $('#file')[0].files[i]);
}
$.ajax({
type: "POST",
data: formData,
url: "/mail/upload",
contentType: false,
processData: false,
}).success(function (res) {
var data = res.data;
if (res.status) {
var attachUrls = "";
for(var i = 0;i<data.length;i++){
var item = data[i];
attachUrls += item.url+"|";
}
$("#attachment").val(attachUrls);
console.log(attachUrls);
} else {
console.log(res.message);
}
}).error(function (data) {
alert(data);
console.log(data);
});
});
});
</script>
</body>
</html>
体验地址:http://120.79.226.4/mail-demo/ 源码地址:https://github.com/xbmchina/mail-demo