谷歌邮箱无法显示使用 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进行试验,需要源码可以私信。