最近要做一个流程发送邮件的事情。发送的对象不一样。邮件内容不一样。使用freemarker 模版来作为邮件发送的模版。
java 发送邮件首先需要导入所需jar包。因为发送邮件中包涵图片所以需要引入文件传输依赖。
maven依赖如下:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</dependency>
<dependency>
<groupId>com.us</groupId>
<artifactId>kulm</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
工具类如下
请求数据如下,这个是实用了新浪的邮件服务器;
Host=smtp.sina.com
User=你的账号@sina.com
Pswd=你的密码
Image=D:/DT/upload/image9.jpg(你的图片物理路径)
public class MailUtil {
/**
*
* 邮件发送工具,默认开启SSL和TSL
*
* @param fromEmail
* 邮件发送人
* @param toEmails
* 邮件接收者,支持多个接收者
* @param subject
* 标题
* @param message
* 信息
* @param host
* 邮件发送服务器
* @param port
* 端口
* @param username
* 用户名
* @param password
* 密码
*/
public static void sendEmail(String host, String emailUser, String pswd, Set<String> toEmails, String emailImage,
String subject, String htmlText) throws Exception {
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", host);
props.setProperty("mail.user", emailUser);
props.setProperty("mail.password", pswd);
props.setProperty("mail.smtp.auth", "true");
Session mailSession = Session.getDefaultInstance(props, null);
mailSession.setDebug(true);
Transport transport = mailSession.getTransport();
MimeMessage message = new MimeMessage(mailSession);
message.setSubject(subject);
message.setFrom(new InternetAddress(emailUser));
InternetAddress[] Email = new InternetAddress[toEmails.size()];
Iterator<String> it = toEmails.iterator();
for (int i = 0; i < toEmails.size(); i++) {
Email[i] = new InternetAddress(it.next());
}
message.addRecipients(Message.RecipientType.TO, Email);
MimeMultipart multipart = new MimeMultipart("related");
// first part (the html)
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(htmlText, "text/html;charset=UTF-8");
// add it
multipart.addBodyPart(messageBodyPart);
// second part (the image)
messageBodyPart = new MimeBodyPart();
DataSource fds = new FileDataSource(emailImage);
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setHeader("Content-ID", "<image>");
// add it
multipart.addBodyPart(messageBodyPart);
// put everything together
message.setContent(multipart);
transport.connect(null, emailUser, pswd);
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
transport.close();
}
public static String getMailText(FreeMarkerConfigurer freeMarkerConfigurer, String templateName,
Map<String, Object> map) throws Exception {
String htmlText = "";
// 通过指定模板名获取FreeMarker模板实例
Template tpl = freeMarkerConfigurer.getConfiguration().getTemplate(templateName);
// FreeMarker通过Map传递动态数据
// 解析模板并替换动态数据,最终content将替换模板文件中的${content}标签。
htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, map);
return htmlText;
}
}
使用freemarker 模版首先要配置bean ,spring 中加入配置如下:也可以通过xml 的形式配置。classpath:templates 是模版文件的folder名字。如图
@Configuration
public class TemplateConfig {
@Bean
public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException {
FreeMarkerConfigurationFactory factory = new FreeMarkerConfigurationFactory();
factory.setTemplateLoaderPaths("classpath:templates");
factory.setDefaultEncoding("UTF-8");
FreeMarkerConfigurer result = new FreeMarkerConfigurer();
result.setConfiguration(factory.createConfiguration());
return result;
}
}
配置完以后要编写 freemarker模版,简单编写如下“${content}“ 后面调用要传递参数。img src=”cid:image” 是为了对应邮件工具类中对图片的传递。
<html>
<body>
<H1>${content}</H1>
<img src="cid:image">
</body>
</html>
接下来就是在service 中调用了:首先要注入FreeMarkerConfigurer
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
//在方法中调用语句如下
Map<String, Object> templateMap = new HashMap<String, Object>();
templateMap.put("content", content);
MailUtil.sendEmail("smtp.sina.com", "你的账号@sina.com","你的密码", "邮件接收者的list集合", "邮件发送图片的路径","邮件的标题",
MailUtil.getMailText(freeMarkerConfigurer, "emailTemp.ftl", templateMap));
toEmails.clear();
getMailText 是获取邮件模版。得到的html 字符串。emailTemp.ftl是模版的名字。templateMap是给模版中传递参数。
上述例子只是邮件发送单图片。下边提供多图片的一个方法
多图片发送工具方法
public static void sendEmail(String host, String emailUser, String pswd, Set<String> toEmails, String emailImage,
String subject, String htmlText) throws Exception {
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", host);
props.setProperty("mail.user", emailUser);
props.setProperty("mail.password", pswd);
props.setProperty("mail.smtp.auth", "true");
Session mailSession = Session.getDefaultInstance(props, null);
mailSession.setDebug(true);
Transport transport = mailSession.getTransport();
MimeMessage message = new MimeMessage(mailSession);
message.setSubject(subject);
message.setFrom(new InternetAddress(emailUser));
InternetAddress[] Email = new InternetAddress[toEmails.size()];
Iterator<String> it = toEmails.iterator();
for (int i = 0; i < toEmails.size(); i++) {
Email[i] = new InternetAddress(it.next());
}
message.addRecipients(Message.RecipientType.TO, Email);
MimeBodyPart text = new MimeBodyPart();
// setContent(“邮件的正文内容”,”设置邮件内容的编码方式”)
text.setContent(htmlText, "text/html;charset=gb2312");
// 创建图片
MimeBodyPart img = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource(emailImage));// 图片路径
img.setDataHandler(dh);
// 创建图片的一个表示用于显示在邮件中显示
img.setContentID("<image>");
MimeBodyPart img2 = new MimeBodyPart();
DataHandler dh2 = new DataHandler(new FileDataSource(emailImage));// 第二张图片路径
img2.setDataHandler(dh2);
img2.setContentID("<image2>");
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(img);
mm.setSubType("related");// 设置正文与图片之间的关系
// 图班与正文的 body
MimeBodyPart all = new MimeBodyPart();
all.setContent(mm);
// 附件与正文(text 和 img)的关系
MimeMultipart mm2 = new MimeMultipart();
mm2.addBodyPart(all);
mm2.addBodyPart(img2);
mm2.setSubType("mixed");// 设置正文与附件之间的关系
message.setContent(mm2);
message.saveChanges(); // 保存修改
transport.connect(null, emailUser, pswd);
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
transport.close();
}
对应模版修改为
<html>
<body>
<H1>${content}</H1>
<img src="cid:image">
<img src="cid:image2">
</body>
</html>