概要
Spring Email抽象的核心是MailSender接口。MailSender的实现能够通过连接Email服务器实现邮件发送的功能。
Spring自带了一个MailSender的实现也就是JavaMailSenderImpl,它会使用JavaMail API来发送Email。
开启邮箱SMTP服务
以网易126邮箱为例,QQ、163都差不多的步骤!
配置邮件发送器
导入javax.mail-1.5.4.jar
RootConfig.java
@Bean
public MailSender mailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("smtp.163.com");//指定用来发送Email的邮件服务器主机名
mailSender.setPort(25);//默认端口,标准的SMTP端口
mailSender.setUsername("test@163.com");//用户名
mailSender.setPassword("password");//就是刚刚设置的授权码
return mailSender;
}
注入JavaMailSender
@Autowired
private JavaMailSender mailSender;
@RequestMapping("/mail")
public void mail() throws MessagingException
{
SimpleMailMessage message = new SimpleMailMessage();//消息构造器
message.setFrom(from@163.com");//发件人
message.setTo("to@qq.com");//收件人
message.setSubject("Spring Email Test");//主题
message.setText("hello world!!");//正文
mailSender.send(message);
System.out.println("邮件发送完毕");
}
添加附件
对于简单的事情来讲,纯文本的Email消息是比较合适的。然而Spring的Email功能并不局限于纯文本的Email,我们可以添加附件。
如果发送带有附件的Email,关键技巧是创建multipart类型的消息。对于发送附件的需求来说,SimpleMailMessage 过于简单了。为了发送multipart类型的Email,需要创建一个MIME的消息。
@RequestMapping("/mail")
public void mail() throws MessagingException
{
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message,true);//true表明这个消息是multipart类型的
helper.setFrom("from@163.com");//发件人
helper.setTo("to@qq.com");//收件人
helper.setSubject("Spring Email Test");//主题
helper.setText("hello world!!");//正文
FileSystemResource resource = new FileSystemResource("F:\\Users\\yd\\Desktop\\test.png");
helper.addAttachment("test.png", resource);
mailSender.send(message);
}
addAttachment()的第一个参数是要添加到Email中附件的名称,第二个参数是图片资源。
发送富文本内容的Email
发送富文本的Email与发送简单文本的Email并没有太大区别。关键是将消息的文本设置为HTML。要做到这一点只需要将HTML字符串传递给helper的setText()方法,并将第二个参数设置为true;
@RequestMapping("/mail")
public void mail() throws MessagingException
{
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message,true);
helper.setFrom("from@163.com");//发件人
helper.setTo("to@qq.com");//收件人
helper.setSubject("Spring Email Test");//主题
helper.setText("<html><body><img src='cid:logo'><h1>hahaha</h1></body></html>", true);
ClassPathResource image = new ClassPathResource("/image/test.png"); //类路径下
helper.addInline("logo", image);
mailSender.send(message);
}
为消息添加嵌入式图片与添加附件很类似。不过这次不在使用helper的addAttachment()方法,而是调用addInline()方法:
ClassPathResource image = new ClassPathResource("/image/test.png"); //类路径下
helper.addInline("logo", image);
addInline的第一个参数表明内联图片的标识符——与img标签的src属性所指定的相同。第二个参数是图片的资源引用,这里使用ClassPathResource从应用程序的类路径下获取图片。
使用Velocity模板生成Email
导入velocity-1.7.jar、commons-collections-3.2.1.jar
RootConfig.java
@Bean
public VelocityEngineFactoryBean velocityEngine() {
VelocityEngineFactoryBean velocityEngine = new VelocityEngineFactoryBean();
Properties props = new Properties();
props.setProperty("resource.loader", "class");
props.setProperty("class.resource.loader.class", ClasspathResourceLoader.class.getName());
velocityEngine.setVelocityProperties(props);
return velocityEngine;
}
Spring自带了VelocityEngineUtils来简化Velocity模板与模型数据合并成String的工作
@RequestMapping("/mail")
public void mail() throws MessagingException
{
Map<String, Object> modal = new HashMap<String, Object>();
modal.put("name", "asd");
modal.put("text", "这是一个用Velocity生成的模板");
//使用VelocityEngineUtils将Velocity模板与模型数据合并成String
String emailText = VelocityEngineUtils
.mergeTemplateIntoString(velocityEngine, "emailTemplate.vm", "UTF-8", modal);
MimeMessage message = mailSender.createMimeMessage();
//第三个参数设置编码,否则如果有汉字会出现乱码问题
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
helper.setFrom("from@163.com");
helper.setTo("to@qq.com");
helper.setSubject("Spring Email Test");
helper.setText(emailText, true);
ClassPathResource image = new ClassPathResource("/image/test.png");
helper.addInline("logo", image);
mailSender.send(message);
System.out.println("邮件发送完毕");
}
首先创建了一个Map用来保存模板使用的模型数据。为了产生合并后的Email文本,我们只需要调用VelocityEngineUtils的mergeTemplateIntoString()方法并将Velocity引擎、模板路径(相对于类路径根)以及模型Map传递进去。
emailTemplate.vm
<!DOCTYPE html>
<html>
<body>
<img src='cid:logo'>
<h4>Hello ${name}</h4>
<h3>${text}</h3>
</body>
</html>
以上只是学习所做的笔记,如有错误,请指正谢谢!!!