Java mail模板发送高级邮件

一、见贤思齐焉

  我们之前自己发的邮件,大家又没有感觉比较丑呢???毫无美感可言,只有空洞的文字,甚至连基础的排版都没有。如果这是给女娃表白的邮件,那我只能陪你一起和顿闷酒咯!!!

  邮箱收件箱中翻一翻,几乎每一条邮件都比我们的好看一倍、两倍、甚至好多倍!!!见贤思齐焉!此时此刻,有没有一种想要学习的冲动呢!!!下面是Twitter的一封邮件,仅供参考。

二、HTML格式的邮件

  邮件内容主要分为两种,HTML格式和纯文本。两种各有优劣,两种各有用途吧,在这里不必深究。一般开发网站还是建议使用HTML格式,因为要注意用户体验感,如果太丑了的话,哪个用户还愿意使用你的产品呢?

  因此诞生了邮件模板,纯html格式,CSS采用行内样式。借鉴了一个大牛写的邮件样式,感兴趣的可以自己修改或者重写。(注意:文件格式为:.ftl

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cAOldLmf-1574782034470)(…/images/HTML邮件模板.png)]

<body style="color: #666; font-size: 14px; font-family: 'Open Sans',Helvetica,Arial,sans-serif;">
<div class="box-content" style="width: 80%; margin: 20px auto; max-width: 800px; min-width: 600px;">
    <div class="header-tip" style="font-size: 12px;  color: #aaa;  text-align: right;  padding-right: 25px;  padding-bottom: 10px;">
        Confidential - Scale Alarm Use Only
    </div>
    <div class="info-top" style="padding: 15px 25px;  border-top-left-radius: 10px;  border-top-right-radius: 10px;  background: ${bgColor};  color: #fff;  overflow: hidden;  line-height: 32px;">
        <img src="cid:icon-alarm" style="float: left; margin: 0 10px 0 0; width: 32px;" /><div style="color:#010e07"><strong>服务实例水平伸缩通知</strong></div>
    </div>
    <div class="info-wrap" style="border-bottom-left-radius: 10px;  border-bottom-right-radius: 10px;  border:1px solid #ddd;  overflow: hidden;  padding: 15px 15px 20px;">
        <div class="tips" style="padding:15px;">
            <p style=" list-style: 160%; margin: 10px 0;">Hi,</p>
            <p style=" list-style: 160%; margin: 10px 0;">${First}</p>
        </div>
        <div class="time" style="text-align: right; color: #999; padding: 0 15px 15px;">${Second}</div>
        <br>
        <table class="list" style="width: 100%; border-collapse: collapse; border-top:1px solid #eee; font-size:12px;">
            <thead>
            <tr style=" background: #fafafa; color: #333; border-bottom: 1px solid #eee;">
                ${Third}
            </tr>
            </thead>
            <tbody>
            ${Fourth}
            </tbody>
        </table>
    </div>
</div>
</body>

三、生成动态邮件

  模板写好了,数据还需要填充,生成动态模板邮件才是王道!!!如上图的模板照片中的第?个就是动态生成的数据,其中在模板中表述为${name}表示填充变量名,进行邮件生成时就可以进行相应的填充。

1、所需依赖

	<dependency>
		    <groupId>javax.mail</groupId>
		    <artifactId>mail</artifactId>
		    <version>1.4.7</version>
		</dependency>
		<dependency>
		    <groupId>com.quhaodian</groupId>
		    <artifactId>freemaker</artifactId>
		    <version>1.8.1</version>
		</dependency>

2、添加所需照片

  在邮件中添加照片,不是像写普通网页一样,加个相对路径就可以显示了!!!

  • 设置图片id 传输图片
	//1、读取文件路径
    String imagePath = MailUtils.class.getResource("/mail/images/cjdx.jpg").getPath();
    //2、创建图片容器部分 
    MimeBodyPart image = new MimeBodyPart();
    //3、读取源文件流并处理
    DataHandler dh = new DataHandler(new FileDataSource(imagePath));//图片路径 
    //4、图片信息放入容器
	image.setDataHandler(dh);
	//5、创建图片的一个ID表示用于显示在邮件中显示 
	image.setContentID("icon-alarm");
	//6、加入主容器部分
	mainPart.addBodyPart(image);
  • 将图片设置为外链

  图床api,该网站可把你的图片转换至各大厂商的图床,直接获取直链。号称无限外链、永久免费。建议照片上传上去后,还要留本地备份,毕竟谁也说不准他哪天就不见了!!!

3、转换模板

public static String transforHtml(Map<String,String> dataMap, String templateName) {
    //创建配置实例 
    Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
    //设置编码
    configuration.setDefaultEncoding("UTF-8");
    //ftl模板文件统一放至 com.lun.template 包下面
    File file = new ile(MailUtils.class.getClassLoader().getResource("mail/").getFile());
    configuration.setDirectoryForTemplateLoading(file);
    //获取模板 
    Template template = configuration.getTemplate(templateName);
    //将模板和数据模型合并生成文件
    StringWriter stringWriter = new StringWriter();
    //生成html
    template.process(dataMap, stringWriter);
    return stringWriter.toString();
}

4、发送HTML邮件

  其中map就是上文提到的转换参数,key中是${name}中的name, value中就是插入模板中的值,由此实现动态生成模板。

//建立邮件对象
        MimeMessage message = new MimeMessage(session);
        //设置邮件的发件人、收件人、主题
        //附带发件人名字
        //设置自定义发件人昵称 
        String nickFrom = MimeUtility.encodeText("职能搜索平台");  
            String nickTo = MimeUtility.encodeText("酷酷的用户");  
           //设置发信人 
			message.setFrom(new InternetAddress(nickFrom+"<524235428@qq.com>"));
			  	 
			Address []tos = {new InternetAddress(nickTo+"<couragehe135@163.com>"),new InternetAddress(nickTo+"<couragehe135@163.com>")}; 
	        message.setRecipients(Message.RecipientType.TO, tos);
	        message.setSubject("多发出!!!");
	    	Map<String,String> map= new HashMap<String,String>();
        	map.put("bgColor", "#f40");
        	map.put("First", "第一个");
        	map.put("Second", "第二个");
        	map.put("Third", "第三个");
        	map.put("Fourth", "第四个");
        	String mailBody = transforHtml(map, "mail.ftl");
        	
// String mailBody = TemplateFactory.genrateHtmlFromFtl(templateName, map);
            Multipart mainPart = new MimeMultipart();
            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            html.setContent(mailBody, "text/html; charset=utf-8");
            mainPart.addBodyPart(html);
            
            MailUtils.setImage(mainPart);
            
            // 4、将MiniMultipart对象设置为邮件内容
            message.setContent(mainPart);
            
	        message.saveChanges();
			message.setSentDate(new Date());
			message.saveChanges();
	        //发送邮件
	        Transport.send(message);

参考:https://blog.csdn.net/ll837448792/article/details/93620939

参考:http://www.shaoqun.com/a/89502.html