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

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

  1. 笔记本网络计算机和设备不可见,xp电脑不显示无线网络的七种原因和解决方法...

    xp纯净版系统电脑打开后发现桌面右下角不显示无线网络,如果要设置无线网络都不知道从哪里下手,这到底是怎么回事?造成xp系统不显示无线网络的原因有很多种,下面和大家讲解一下xp电脑不显示无线网络的七种原 ...

  2. 怎么在win7链接无线网络连接服务器,Win7系统网络连接一直显示正在获取网络地址但是连不上网解决方法...

    电脑上不了网的原因很多,比如是网络设置问题.路由器问题.运营商问题.最近一个Win7用户,网络连接一直显示,正在获取网络地址但是连不上网,但是其它电脑可以上网,那么说明是电脑设置问题,那么该如何解决呢 ...

  3. eclipse打开后显示 Failed to create the part‘s controls 解决方法

    eclipse打开后显示 Failed to create the part's controls 解决方法 参考文章: (1)eclipse打开后显示 Failed to create the pa ...

  4. 运行adb devices命令后 显示 List of devices attached 无法获取设备解决方法

    运行adb devices命令后 显示 List of devices attached 无法获取设备解决方法 参考文章: (1)运行adb devices命令后 显示 List of devices ...

  5. 启动mysql时显示:/tmp/mysql.sock 不存在的解决方法

    启动mysql时显示:/tmp/mysql.sock 不存在的解决方法 参考文章: (1)启动mysql时显示:/tmp/mysql.sock 不存在的解决方法 (2)https://www.cnbl ...

  6. gFTP不能显示中文文件(夹)名的解决方法

    gFTP不能显示中文文件(夹)名的解决方法 现象:Ylmf OS 2.0 中预装的gFTP在登录远程服务器后,中文文件夹及中文文件名不能显示. 原因:非root身份登录 解决:用root登录,后登录g ...

  7. GX works2 三菱PLC 显示注释后代码行变宽的解决方法

    GX works2 三菱PLC 显示注释后代码行变宽的解决方法 解决前 没显示注释前 --------------------------------------------------------- ...

  8. outlook你的邮件服务器证书无效,Outlook添加网易邮箱账号提示服务器的加密连接不可用的解决方法...

    Outlook添加网易邮箱账号提示"服务器的加密连接不可用"的解决方法 发布日期:2018-12-10 outlook邮件服务器的加密连接不可用该怎么办?outlook邮箱经常添加 ...

  9. win10任务栏图标显示异常(重启资源管理器无果)解决方法

    win10任务栏图标显示异常(重启资源管理器无果)解决方法 方法1: - Ctrl+Win+R打开任务管理器 - 点击[文件],点击[运行新任务],输入[Explorer],运行,此刻可以看到Wind ...

  10. linux终端能显示中文,但是不能输入中文的解决方法

    linux终端能显示中文,但是不能输入中文的解决方法 linux终端能显示中文,但是不能输入中文的解决方法 第一种方法:修改用户目录下的.inputrc文件允许 8bit 输入即可 第二种方法(不建议 ...

最新文章

  1. 几个表示“光”的概念
  2. 第十六届全国大学生智能汽车竞赛-航天智慧物流创意组 线下选拔赛赛题发布!
  3. linux 修改时区_如何在 Ubuntu 20.04 上设置或者修改时区
  4. 基于mjpg-streamer网络视频服务器移植
  5. 不错的秒杀系统架构分析与实战!
  6. python网上编程课程-什么是Python编程课程
  7. 【矩阵】概念的理解 —— span、基
  8. 程序员面试金典 - 面试题 16.13. 平分正方形(数学)
  9. Spring Cloud Config采用数据库存储配置内容【Edgware+】
  10. mysqlfront连接MySQL错误_使用MySql-Front远程连接MySQL失败的解决办法
  11. linux 文件隐藏权限,linux文件基本权限、默认权限、隐藏权限和ACL权限
  12. 连接SQL SERVER的时候登录名如何清除
  13. PPPOE拨号之一:Cisco 路由器adsl拨号配置
  14. 实数在计算机上存储,实数如何在内存中存储
  15. Kafka拉取某一个时间段內的消息
  16. Linux 安装qq农场小游戏
  17. 使用Arduino Motor Shield控制步进制电机
  18. python基础——数据可视化
  19. ASO优化在大数据时代应该怎么操作,aso优化如何操作
  20. 拯救者Y7000安装ubuntu时出现的问题

热门文章

  1. echarts关系图vue完整代码
  2. CSS边框boder
  3. iphone模拟器中的documentPath
  4. django urls import views报错
  5. 电脑微信不显示好友头像和聊天表情
  6. BDD - 介绍 Behavior-Driven Development 行为驱动开发
  7. android 手机型号获取root,Android用代码获取手机root之后的最高权限
  8. 使用 Colab 训练 Pytorch-Yolov4 (WongKinYiu版)
  9. 计算机串口(RS232)的针脚定义
  10. 682. Baseball Game 棒球游戏 按字母处理