使用MailKit发送带有内嵌图片的邮件且图片不显示成附件
使用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发送带有内嵌图片的邮件且图片不显示成附件的更多相关文章
- 如何解决Angular网页内嵌推特时间线无法正常显示
我最近解决了一个折磨了我好久但是解决方法却只是添加两三行代码的问题.我没有在网上找到合适的解决方案,最后是我根据官方网站和很多的帖子里的部分代码得到的启发,尝试了很久之后得到的解决方法.因为过程实在是 ...
- spring 5.x 系列第20篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (代码配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置类为com.heibaiyin ...
- spring 5.x 系列第19篇 ——spring简单邮件、附件邮件、内嵌资源邮件、模板邮件发送 (xml配置方式)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 邮件发送配置文件为springApplic ...
- python16_day27【crm 内嵌、删除、action】
一.内嵌 二.删除及关联关联显示 三.action
- .NET开发邮件发送功能的全面教程(含邮件组件源码)
今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1) 邮件基础理论知识 2) ...
- java发送内嵌图片邮件
前言: 博客系统中需要邮件服务的功能,以前写过类似的功能,不过功能太简单了,仅仅是发送文本内容,现在尝试一下发送内嵌图片邮件! 准备工作: 请参考:http://www.cnblogs.com/huj ...
- Spring 发送内嵌图片的邮件 遇到的问题
问题1:spring 发送带图片的html格式的邮件? 解决方法1:直接在发送内容里面添加 <img src="http://www.rgagnon.com/images/jht.gi ...
- 在zabbix中实现发送带有图片的邮件和微信告警
1 python实现在4.2版本zabbix发送带有图片的报警邮件 我们通常收到的报警,都是文字,是把动作中的消息内容当成了正文参数传给脚本,然后邮件或者微信进行接收,往往只能看到当前值,无法直观的获 ...
- 原生js实现tab选项卡里内嵌图片滚动特效代码
<!DOCTYPE HTML><html lang="en-US"><head><meta charset="UTF-8&quo ...
随机推荐
- 4.Android-adt安卓打包过程、adb指令学习
本章学习adt安卓打包过程.adb指令学习.并通过adb将打包的APK发给设备 1.打包 在eclipse中已经帮我们实现打包了. 具体打包流程如下: 最终一个APK包含了如下: classes.de ...
- PromiseKit基本使用及源码解析
Promise处理一系列异步操作的应用框架,能够保证顺序执行一系列异步操作,当出错时可以通过catch捕获错误进行处理.Promise框架也是很好的诠释了swift的面相协议编程以及函数式编程 两种类 ...
- LICEcap 动画屏幕录制软件
下载地址 https://licecap.en.softonic.com/ LICEcap捕捉屏幕的区域并保存为gif动画或lcf格式 效果请看下面的链接 https://www.cnblogs ...
- [AI开发]DeepStream开发填坑记录
下面是在deepstream使用过程中碰到的一些坑: (1)Pipeline中的Sink如果需要编码存文件或者推rtmp的流,注意控制编码的参数,编码质量不要太高.否则可能Sink带不动,整个Pipe ...
- ConcurrentHashMap(1.7)分析
1. 先来了解ConcurrentHashMap中的几个成员,当然大多数与HashMap中的相似,我们只看独有的成员 /** * The default concurrency level for ...
- node.js安装本地模块遇到的目录锁定问题【新手问题】
昨天发过文字版的,后来以为问题没解决就删除,今天偷个懒,直接上图. 被书中的介绍给误导了,虽然和书中不一样,但实际上自己练习写的模块已经是可用了.也犯了个常识性的错误:Warn一般不会有太大的影响.
- 简单了解一下:var 、let、const
var 重新赋值,重新定义,作用域 属于:function scope: let 声明的变量只在 let 命令所在的代码块内有效,Block scope. const 声明一个只读的常量,一旦声明,常 ...
- C#NULL条件运算符
C#6.0新增的特性 NULL条件运算符 ?. 之前我们在需要判断某个对象是否为空的是这样的 Person per = null; if (per != null) { Console.Write(& ...
- 6、netty第五个例子,使用websocket来通讯
websocket中,可以支持双向的数据通信.其中所有的数据格式,都是以帧的形式来传递. initializer import io.netty.channel.ChannelInitializer; ...
- 50-overlay 如何实现跨主机通信?
上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理. 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ...