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>
0 0
原创粉丝点击