MailKit系列之附件分离
本文主要谈谈实现思路,不提供完整代码
一、分离基础
1.MIME邮件的multipart类型
引用文章:https://blog.csdn.net/wangyu13476969128/article/details/72724179
MIME,英文全称为"Multipurpose Internet Mail Extensions",即多用途互联网邮件扩展,是目前互联网电子邮件普通遵循的技术规则。
邮件体包含邮件的内容, 它的类型由邮件头的“Content-Type”域指出。常见的简单类型有text/plain(纯文本)和text/html(超文本)。
MIME邮件Content-Type域常见的主类型如下:
| 主类型 | 常见属性 | 参数含义 |
|---|---|---|
| text | charset | 文本信息所使用的字符集 |
| image | name | 图像的名称应用程序的名称 |
| application | name | 应用程序的名称 |
| multipart | boundary | 邮件分段边界标识 |
对于multipart类型,下面有三种子类型:mixed、alternative、related
multipart/mixed可以包含附件。
multipart/related可以包含内嵌资源。
multipart/alternative 纯文本与超文本共存
二、附件分离
引用文章:C#使用MailKit获取邮件中的附件(QQ邮箱/163网易邮箱)
1.保存附件
通过获取到的MimeMessage可以轻松得到附件,注意超过50M的文件为超大附件,不能下载,如qq的处理是将发一个链接提供下载。
/// <summary>
/// 获取邮件的附件
/// </summary>
/// <param name="attachments"></param>
/// <param name="messageId"></param>
/// <returns></returns>
public List<EmailAttachmentDto> GetEmailAttachments(IEnumerable<MimeEntity> attachments, string messageId)
{
var emailAttachments = new List<EmailAttachmentDto>();
foreach (var attachment in attachments)
{
if (attachment.IsAttachment)
{
var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name;
var filePath = MailHelper.GetEmlAttachmentFilePath(fileName, messageId);
using (var stream = File.Create(filePath))
{
if (attachment is MessagePart rfc822)
{
rfc822.Message.WriteTo(stream);
}
else
{
var part = (MimePart)attachment;
part.Content.DecodeTo(stream);
}
}
var mailFileInfo = new FileInfo(filePath);
emailAttachments.Add(new EmailAttachmentDto() { FilePath = filePath, FileName = fileName, FileSize = mailFileInfo.Length });
}
}
return emailAttachments;
}
2.保存EML
其实,这一步才是关键,移除附件,只保存其他内容到eml,这样才不会读取时由于文件太大导致卡死
if (mimeMessage.Body is Multipart multipart)
{
while (mimeMessage.Attachments.Any())
{
multipart.Remove(mimeMessage.Attachments.ElementAt(0));
}
var mineMessage = new MimeMessage()
{
Sender = mimeMessage.Sender,
Body = multipart,
MessageId = customerMimeMessage.Id.ToString(),
};
if (!System.IO.File.Exists(fileName))
{
await mineMessage.WriteToAsync(fileName);
}
}
这样就完成了,附件和邮件eml分开存储
参考文章
http://www.it1352.com/675410.html
https://www.cnblogs.com/pengze0902/p/8519715.html
https://www.cnblogs.com/rocketRobin/p/8337055.html
MailKit系列之附件分离的更多相关文章
- MailKit系列之---查询SearchQuery
对于邮件的唯一Id查询,由于MailKit提供了大量的方法,无法完全讲解完全,所以这里只选择几个来介绍. MailKit通过方法folder.Search来查询邮件的唯一Id,参数是一个SearchQ ...
- MailKit系列之转发电子邮件
原文:http://www.it1352.com/429181.html 问题 我尝试通过MailKit访问一个IMAP账号,我设法下载邮件(作为的MimeMessage),并在某些时候我需要转发给其 ...
- Asp.NET 简易通用WebServices 附件服务
[toc] 总述: 用了很久的附件分离服务, .NET 2.0平台开始使用. 配置好服务后, 由调用端定义并管理目录级次. 调用端存储目录即可. 附件服务: 相应配置节点放入 web.confi ...
- Discuz论坛架构改造
这个论坛一直通过NFS服务共享文件给三台web服务器做负载均衡. 在实际环境中WEB Server总是出现CPU负载突然升高.文件交互的网络流量异常.甚至WEB Server夯死,NFS不能卸载,只能 ...
- Android逆向——破解水果大战
最近公司需要测试安卓app安全,但安卓基本上0基础,决定开始学习下安卓逆向根据吾爱破解上教程 <教我兄弟学Android逆向系列课程+附件导航帖> https://www.52pojie. ...
- 使用AndroidKiller进行APK反编译
安装环境 JDK 最好用JDK8,问就是坑太多了 Android Studio 官网安装即可,安装教程如下 https://www.runoob.com/android/android-studio- ...
- Email系列(QQ邮箱 + 含附件的邮箱案例 + 项目实战)
平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html 邮箱系列:https://github.com/duniti ...
- Chrome扩展开发(Gmail附件管理助手)系列之〇——概述
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- Spring Boot 系列教程9-swagger-前后端分离后的标准
前后端分离的必要 现在的趋势发展,需要把前后端开发和部署做到真正的分离 做前端的谁也不想用Maven或者Gradle作为构建工具 做后端的谁也不想要用Grunt或者Gulp作为构建工具 前后端需要通过 ...
随机推荐
- JS JSON对象相关
1.多对象合并 将2个或2个以上对象(object{....})中的属性进行合并,即最后合并为一个object{.....} 解决办法:Object.assign 方法 var form = {nam ...
- spring boot Websocket(使用笔记)
使用websocket有两种方式:1是使用sockjs,2是使用h5的标准.使用Html5标准自然更方便简单,所以记录的是配合h5的使用方法. 1.pom 核心是@ServerEndpoint ...
- xgboost 非官方每天编译
xgboost http://ssl.picnet.com.au/xgboost/ 非官方每天编译
- Vjudge Code
Stylus @-moz-document url-prefix("https://cn.vjudge.net/"), url-prefix("https://vjudg ...
- Want To Say Something
2019.3.3 明天要演讲了,在这里为自己打一下气! 加油! 2019.3.31 停课三周的第一次写日志 怎么说这三周结交了很多八班的朋友 在竞赛上一直在学数论快学吐了,但没办法呀还是要为出 ...
- [Windows Doc]微软官方文档
desktop: https://docs.microsoft.com/en-us/windows/desktop/index server:https://docs.microsoft.com/en ...
- 洛谷 P2325 [SCOI2005]王室联邦
简化版题意: 一个国家由\(n\)个城市组成一颗树,要将其划分为\(n\)个省 每个城市大小为\([B,3B]\),每个省有一个省会(不一定要在省内),使得每个省的所有城市到省会的路径上不能经过其他省 ...
- Vim内直接使用p粘贴系统剪切板
解决方法 set clipboard=unnamed
- 利用反射将IDataReader读取到实体类中效率低下的解决办法
最开始使用反射一个类型的各个属性,对气进行赋值的代码如下: public static List<T> ToList<T>(IDataReader reader) { //实例 ...
- HAOI2019+十二省联考 游记
Day1 T1 考前还奶了一口不会考01Trie的,也就没有学,然后60分BOOM T2 不会SAM,告辞,30分滚粗 T3 传统实现题答?2p,2u,2g分别对应素数,莫比乌斯函数,原根?没看出来, ...