谷歌邮箱无法显示使用 Base64 处理的图片的正确解决方法

谷歌邮箱无法显示使用 Base64 处理的图片的正确解决方法

前文

本次做了一下邮件发送,邮件中包含自定义模板和logo,初始logo使用的是url地址,但后期思考,如果地址失效或者网络问题等则会导致logo无法显示,于是乎就将logo改为了base64的形式,本以为天衣无缝,结果遇到了google邮箱,src属性直接丢失。

这里经过查询是因为,Google不兼容base64形式的编码头且路径必须使用https开头,那怎么办呢?可以使用静态文件的形式,发送文件。

1、为了使得代码不要重复修改,将插入图片文件可以配置,resource目录下定义json配置文件。

[
	{
		"fileName": "email-template-logo.png",
		"filePath": "email/image/email-template-logo.png"
	}
]	

2、项目启动时,将文件内容写入缓存

//省略部分工具代码
/** 邮件内嵌文件缓存 */
private static Map<String, File> templateInlineCache = new HashMap<>();

private static synchronized void init() {
		String rs = readFile(emailConfig.getTemplateInlineConfigFile());
		if(StringUtil.isNotEmpty(rs)) {
			try {
				JSONArray array = JSON.parseArray(rs);
				for (Object obj : array) {
					JSONObject json = (JSONObject) obj;
					String fileName = json.getString("fileName");
					String filePath = ResourceUtil.getResourcePath(json.getString("filePath"), EmailTemplateUtil.class);
					File file = new File(filePath);
					if(file.exists()) {
						templateInlineCache.put(fileName, file);
					}else {
						log.error("邮件内嵌文件不存在: filePath={}", filePath);
					}
				}
			} catch (Exception e) {
				log.error("邮件内嵌文件配置解析异常,请检查格式: ConfigFile={}", emailConfig.getTemplateInlineConfigFile(), e);
			}
		}
	}

3、发送邮件时,新增inline属性

//省略部分发送代码
private static JavaMailSenderImpl javaMailSender = SpringUtil.getBean(JavaMailSenderImpl.class);
// 开始发送邮件
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
// 添加内嵌文件
Map<String, File> files = EmailTemplateUtil.getInlineFiles();
for (Entry<String, File> file : files.entrySet()) {
    mimeMessageHelper.addInline(file.getKey(), file.getValue());
}
javaMailSender.send(mimeMessage);

4、邮件模板也需要修改

logo这里只需要改为cid:上述添加的key即可,但是需要主要这个key需要带上后缀,否则src依旧会消失
<img src='cid:email-template-logo.png' width=300px height=40px>

5、如果本地需要新增预览功能,则cid:key的形式是无法展示的,所以在本地展示的时候,可以把这里在转为base64的形式就可以正常访问。

String base64 = "";
//key为src内部内容
String emailContent = content.replace("key",base64); 

6、即可验证,这样发送出去的邮件就会被目标邮件服务器代理成自己的地址

Google邮箱:
在这里插入图片描述

QQ邮箱:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dbyO7O0l-1611716661790)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20210127105523994.png)]

因为现在大多都是继承spring的邮件发送,所以本文以spring的邮件发送为demo进行试验,需要源码可以私信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值