使用MailKit发送带有内嵌图片的邮件且图片不显示成附件

参考文章:MailKit---发送邮件

注意

在邮件客户端中是否显示内嵌图片为附件依据不同邮件有所不同,暂经测试Outlook和qq不显示为附件,新浪邮箱会显示附件。

概述

要发送一封带有复杂格式的邮件,且正文内容中带有复杂的图片,以一封阿里云发送的邮件为例,其中还有5张图片。现在想要使用MailKit这个库来发送邮件,邮件模板中也含有图片,该如何发送呢。

知识点

MIME-多用途互联网邮件扩展类型

一封含有复杂内容的邮件可以如下图表示,分为alternative、related、mixed三个部分,alternative部分包含纯文本和超文本内容,related包含alternative部分和内嵌资源,mixed部分包含related部分和附件。

文章中图片一般是作为图中的内嵌资源,所以不会出现在邮件的附件列表中。

实践

我们现在用这封阿里云的邮件作为模板,用MailKit发送这封邮件,且收到后的邮件效果相同。

准备工作

将邮件下载到本地,保存为Html文件,并将邮件中用到的图片资源下载下来,将Html文件和图片放在一个文件中一次作为一个模板。

代码实现

实现步骤主要问,组装正文部分包裹在alternative中,然后将alternative和内嵌资源包裹在related中,再将related用mixed包裹,将以上内容复制给邮件正文。

图片的链接进行格式处理,原:<img src="xxx/xxx/xx.jpg"/>,修改为<img src="cid:aaaaaaaa"/>。详见代码中射击ContentId部分。

使用bodyBuilder来构建邮件正文。具体见代码。

        public bool SendEmailToSingle(string toEmail, string Subject, string FormatId)
{
try
{
var message = new MimeMessage();
message.To.Add(new MailboxAddress(toEmail));
message.From.Add(new MailboxAddress(EmailDisplayName, EmailUserName));
message.Subject = Subject; // 获取邮件模板
string FullFormatPath = Path.Combine(Environment.CurrentDirectory, "Content", FormatId);
string[] ImgPaths = Directory.GetFiles(Path.Combine(FullFormatPath, "Resources")); string HtmlFormat = string.Empty; var builder = new BodyBuilder(); using (FileStream fs = new FileStream(Path.Combine(FullFormatPath, "format.htm"), FileMode.Open))
{
using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding("gbk")))
{
HtmlFormat = sr.ReadToEnd();
}
} // 将图片加入内嵌资源,并更换邮件中的图片的链接
foreach (string imgpath in ImgPaths)
{
var image = builder.LinkedResources.Add(imgpath);
image.ContentId = MimeUtils.GenerateMessageId();
HtmlFormat = HtmlFormat.Replace(Path.GetFileName(imgpath), string.Format("cid:{0}", image.ContentId));
} builder.HtmlBody = HtmlFormat; message.Body = builder.ToMessageBody(); //return message;
using (SmtpClient client = new SmtpClient())
{
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect(EmailServerAddress, EmailServerPort, false);
client.Authenticate(EmailUserName, EmailPassword);
client.Send(message);
client.Disconnect(true);
} return true;
}
catch (Exception)
{
return false;
}
}

发送后收到的邮件

使用MailKit发送带有内嵌图片的邮件且图片不显示成附件的更多相关文章

  1. 如何解决Angular网页内嵌推特时间线无法正常显示

    我最近解决了一个折磨了我好久但是解决方法却只是添加两三行代码的问题.我没有在网上找到合适的解决方案,最后是我根据官方网站和很多的帖子里的部分代码得到的启发,尝试了很久之后得到的解决方法.因为过程实在是 ...

  2. spring 5.x 系列第20篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (代码配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置类为com.heibaiyin ...

  3. spring 5.x 系列第19篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (xml配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置文件为springApplic ...

  4. python16_day27【crm 内嵌、删除、action】

    一.内嵌 二.删除及关联关联显示 三.action

  5. .NET开发邮件发送功能的全面教程(含邮件组件源码)

    今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2)         ...

  6. java发送内嵌图片邮件

    前言: 博客系统中需要邮件服务的功能,以前写过类似的功能,不过功能太简单了,仅仅是发送文本内容,现在尝试一下发送内嵌图片邮件! 准备工作: 请参考:http://www.cnblogs.com/huj ...

  7. Spring 发送内嵌图片的邮件 遇到的问题

    问题1:spring 发送带图片的html格式的邮件? 解决方法1:直接在发送内容里面添加 <img src="http://www.rgagnon.com/images/jht.gi ...

  8. 在zabbix中实现发送带有图片的邮件和微信告警

    1 python实现在4.2版本zabbix发送带有图片的报警邮件 我们通常收到的报警,都是文字,是把动作中的消息内容当成了正文参数传给脚本,然后邮件或者微信进行接收,往往只能看到当前值,无法直观的获 ...

  9. 原生js实现tab选项卡里内嵌图片滚动特效代码

    <!DOCTYPE HTML><html lang="en-US"><head><meta charset="UTF-8&quo ...

随机推荐

  1. CROSS-ENV不同环境配置

    项目背景 为了适应h5环境搭建需求,需要动态配置开发,测试,生产三种对应域名及其及打包命令.使用cross-env可以让配置环境更加清晰明了还好管理. 简介 cross-env的作用是不需要全局配置N ...

  2. mysql安装过程及无法启动mysql的办法

    下载并解压MySQL 下载mysql-8.0.17-win64 \https://dev.mysql.com/downloads/mysql/8.0.html        // 这里提供的是8.0以 ...

  3. django补充CBV和FBV模式

    django补充CBV和FBV模式FBV模式---函数:经常用的方式CBV模式---类CBV中url连接时函数名后面要接.as_view()class index(views.View): @... ...

  4. 看懂 游戏《Minecraft》的崩溃报告 服务端/客户端

    如何看懂Minecraft报错的关键信息. 让你如何看懂Minecraft报错 前言 一些俏皮话 寻找崩溃日志 打开崩溃日志 重要的事说三遍 下载文本编辑器 开始分析 深度分析 得出结论 修复报错 解 ...

  5. promise和axios

    1.接口调用方式 原生ajax 基于jQuery的ajax fetch axios 异步 JavaScript的执行环境是「单线程」 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的 ...

  6. Java网络爬虫 Jsoup

    一.Jsoup介绍 我们抓取到页面之后,还需要对页面进行解析.可以使用字符串处理工具解析页面,也可以使用正则表达式,但是这些方法都会带来很大的开发成本,所以我们需要使用一款专门解析html页面的技术. ...

  7. MySQL数据库~~~~~存储引擎

    1. InnoDB InnoDB引擎特点: 1.支持事务:支持4个事务隔离界别,支持多版本读. 2.行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响. 3.读写 ...

  8. java执行-cp报错 error: could not load JDBC driver

    首先查看对应的 jar 包是否存在,然后看一下 Server (获取数据库驱动类的名称 driverClassName)是否正确 例如: java -

  9. FTP 代码含义

    vsftpd.config 部分参数含义anonymous_enable=NO #不允许匿名用户登陆 local_enable=YES #vsftpd所在系统的用户可以登录vsftpd write_e ...

  10. ML.NET Model Builder 更新

    ML.NET是面向.NET开发人员的跨平台机器学习框架,而Model Builder是Visual Studio中的UI工具,它使用自动机器学习(AutoML)轻松地允许您训练和使用自定义ML.NET ...