ITKeyword,专注技术干货聚合推荐

注册 | 登录

Java使用freemarker模版发送包含图片邮件

u012373815 分享于 2016-07-06

推荐:利用SharePoint designer发送包含图片的邮件

我们可以利用SharePoint Designer 2007或2010的工作流来发送包含具有样式文本的邮件。 具体的做法就是: 1、创建一个自定义列表 2、列表中定义几个栏位:Title,

2019阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/yunparter/invite.html

最近要做一个流程发送邮件的事情。发送的对象不一样。邮件内容不一样。使用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” 是为了对应邮件工具类中对图片的传递。

推荐:java 使用javamail发送邮件

  使用 JavaMail 收发邮件只需要下载两个开源的 jar 文件,感谢“我心依旧”在“深入浅出JavaMail”中提供的这两个jar文件的下载链接,我在这里引用了:   mail.

<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>

推荐:用Java Mail发送带有图片附件的html格式邮件

用Java Mail发送带有图片的html格式的邮件,针对于显示图片,一般有两种方法。 1. 图片存在于服务器上,我们只需要把图片在服务器的的链接放进去即可。 这种发式

最近要做一个流程发送邮件的事情。发送的对象不一样。邮件内容不一样。使用freemarker 模版来作为邮件发送的模版。 java 发送邮件首先需要导入所需jar包。因为发送邮件中包涵图片所以需要引入文

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。