项目中经常会有这样的需求,用户注册成功,需要给用户发送一封邮件。邮件需要有一定格式和样式。本次例子中用freemarker做样式,其他的模版引擎类似。
首先Spring Boot项目,项目结构如下
在pom.xml文件中添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
配置发件人信息,发件人邮箱需要开通POP3/SMTP服务,如下图(我是采用126邮箱):
然后在application.properties中添加配置文件:
然后在service层中添加MailService类,代码如下
import freemarker.core.ParseException; import freemarker.template.MalformedTemplateNameException; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.TemplateNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.util.ResourceUtils; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Service public class MailService { private final static Logger logger = LoggerFactory.getLogger(MailService.class); @Value("${spring.mail.username}") private String from; @Autowired private JavaMailSender mailSender; @Autowired private FreeMarkerConfig freeMarkerConfig; // send simple email public String sendSimple(String to, String title, String content) { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(from); message.setTo(to); message.setSubject(title); message.setText(content); mailSender.send(message); logger.info("{} send email to {}", from, to); return "SUCESS"; } // send template mail public String sendTemplateMail(String to, String title) { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(title); Map<String, Object> model = new HashMap<>(); model.put("params", from); Template template = freeMarkerConfig.getConfiguration().getTemplate("message.ftl"); String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); helper.setText(text, true); mailSender.send(mimeMessage); } catch (MessagingException e) { e.printStackTrace(); } catch (MalformedTemplateNameException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (TemplateNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } return "SUCEESS"; } // send template mail with attachment public String sendAttactmentMail(String to, String title){ MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(title); // add template Map<String, Object> model = new HashMap<>(); model.put("params", from); Template template = freeMarkerConfig.getConfiguration().getTemplate("message.ftl"); String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); helper.setText(text, true); // add attachment File file = ResourceUtils.getFile("classpath:static/flcl.jpg"); helper.addAttachment(file.getName(), file); mailSender.send(mimeMessage); } catch (MessagingException e) { e.printStackTrace(); } catch (MalformedTemplateNameException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (TemplateNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } return "SUCCESS"; } }
这个service中写了三个方法,三个方法的作用分别对应于:发送简单邮件、发送模版邮件、发送带附件的模版邮件
核心方法是 mailSender.send(message) ,message对象根据发送的邮件类型不同而不同,主要有MimeMessage MimeMessageHelper
发送带附件的模板邮件方式是三者中最复杂,首先创建邮件对象MimeMessage ,然后通过MimeMessage对象创建MimeMessageHelper(此对象的作用:向MimeMessage对象中填充数据的助手),通过向MimeMessageHelper对象中添加一些属性,例如发件人、收件人、邮件主题、模版、附件。其中freemarker模板文件xxx.ftl放在resources文件夹下中template(通过FreemakrerConfig获取xxx.ftl的Template对象,然后转换为String),其中附件flcl.jpg放在resources文件夹中的static中(通过ResourceUtils获取文件对象File)。属性添加完成后,就可以发送了。
然后在controller或者其他service层中调用该方法就可以了。
补充:
message.ftl文件内容如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello</title> </head> <body> <h1>Send email</h1> <div>this email come from ${params}</div> </body> </html>
发送成功后,可在收件箱中收到邮件