最近要做一个流程发送邮件的事情。发送的对象不一样。邮件内容不一样。使用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名字。如图

java 发邮件 字体调整 java发送邮件带图片_邮件

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