Java使用freemarker模版发送包含图片邮件
来源:互联网 发布:政府网站建申办域名 编辑:程序博客网 时间:2024/05/21 09:41
最近要做一个流程发送邮件的事情。发送的对象不一样。邮件内容不一样。使用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名字。如图
@Configurationpublic 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
@Autowiredprivate 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>
- Java使用freemarker模版发送包含图片邮件
- 使用FreeMarker邮件模版来发送邮件
- 使用FreeMarker邮件模版来发送邮件
- 使用FreeMarker邮件模版来发送邮件
- 使用FreeMarker邮件模版来发送邮件
- 使用freemarker制作邮件模版
- java使用Freemarker模板发送固定格式邮件
- Java发送包含网络和本地图片的HTML邮件
- SpringBoot使用FreeMarker模板发送邮件
- java mail 通过 freemarker 发送邮件
- java使用freemarker模版导出分页word
- 【java】javamail+freemarker生成邮件模板,并发送邮件
- freemarker发送邮件
- php 发送模版邮件
- 使用java发送邮件
- 使用java发送邮件
- 使用java发送邮件
- 使用Java 发送邮件
- JAVA源码分析之---Object类(一)---registerNatives,getClass方法的使用
- Linux下的C语言开发(开篇)
- python解码问题
- VanlOS 10 发布
- java反射机制详解 及 Method.invoke解释
- Java使用freemarker模版发送包含图片邮件
- HDU 4908/BC B BestCoder Sequence
- 深入理解Java:注解(Annotation)自定义注解入门
- eclipse中配置tomcat 启动正常 访问报404
- css总结
- eclipse优化设置介绍---谷营中西
- 在CentOS中搭建ftp服务器出现的问题
- 数据结构——模拟集合的实现(2)
- JAVA并发编程(二)内置锁和对象共享