使用MailKit发送带有内嵌图片的邮件且图片不显示成附件
时间:2019-10-20
本文章向大家介绍使用MailKit发送带有内嵌图片的邮件且图片不显示成附件,主要包括使用MailKit发送带有内嵌图片的邮件且图片不显示成附件使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用MailKit发送带有内嵌图片的邮件且图片不显示成附件
参考文章:MailKit---发送邮件
注意
在邮件客户端中是否显示内嵌图片为附件依据不同邮件有所不同,暂经测试Outlook和qq不显示为附件,新浪邮箱会显示附件。
概述
要发送一封带有复杂格式的邮件,且正文内容中带有复杂的图片,以一封阿里云发送的邮件为例,其中还有5张图片。现在想要使用MailKit这个库来发送邮件,邮件模板中也含有图片,该如何发送呢。
知识点
MIME-多用途互联网邮件扩展类型
一封含有复杂内容的邮件可以如下图表示,分为alternative、related、mixed三个部分,alternative部分包含纯文本和超文本内容,related包含alternative部分和内嵌资源,mixed部分包含related部分和附件。
文章中图片一般是作为图中的内嵌资源,所以不会出现在邮件的附件列表中。
实践
我们现在用这封阿里云的邮件作为模板,用MailKit发送这封邮件,且收到后的邮件效果相同。
准备工作
将邮件下载到本地,保存为Html文件,并将邮件中用到的图片资源下载下来,将Html文件和图片放在一个文件中一次作为一个模板。
代码实现
实现步骤主要问,组装正文部分包裹在alternative中,然后将alternative和内嵌资源包裹在related中,再将related用mixed包裹,将以上内容复制给邮件正文。
使用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; } }
发送后收到的邮件
原文地址:https://www.cnblogs.com/WattWang/p/11708092.html
- 【翻译】在Mac上使用VSCode创建你的第一个Asp.Net Core应用
- Android6.0运行时权限的处理及解决办法
- 操作系统指纹识别概述
- Android 内存泄露简介、典型情景及检测解决
- [原创]Fluent NHibernate之旅
- 复杂而艰辛的重构之路--起步
- 【强烈推荐】数据库迁移利器:Migrator.Net
- 关于某道C#上机题的OO
- Android 事件处理探险
- Fluent NHibernate RC 1.0 --升级内容
- 驳“反驳老赵之“伪”递归”
- 关于今天很热的--FizzBuzzWhizz
- 了解EF CodeFirst的Migrator功能与Migrator.Net对比
- struts技术的logic标签
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Centreon+Nagios实战第九篇——利用nrpe插件监控本机
- 第四篇 CentOs7下安装Zabbix
- 第十三篇 zabbix创建Item
- 第十四篇 zabbix创建自定义Item
- 【性能】688- 前端性能优化——从 10 多秒到 1.05 秒
- 第十六篇 zabbix创建Trigger
- 如何通过程序(java代码)提高你的博客访问量
- zabbix_get [12429]: Check access restrictions in Zabbix agent configuration
- 【设计模式】689- TypeScript 设计模式之观察者模式
- Found a swap file by the name ".jsidInspector.py.swp"
- CentOs7下部署tomcat文件服务器
- 【拓展】未来的JavaScript记录与元组
- 【Vuejs】690- Vue新特性:CSS 中使用 JS 变量
- Zabbix监控之从Kafka中获取消费进度和lag
- 将UTC(字符串包含TZ的时间)时间转换成本地时间 python