本文主要谈谈实现思路,不提供完整代码

一、分离基础

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的处理是将发一个链接提供下载。

  1. /// <summary>
  2. /// 获取邮件的附件
  3. /// </summary>
  4. /// <param name="attachments"></param>
  5. /// <param name="messageId"></param>
  6. /// <returns></returns>
  7. public List<EmailAttachmentDto> GetEmailAttachments(IEnumerable<MimeEntity> attachments, string messageId)
  8. {
  9. var emailAttachments = new List<EmailAttachmentDto>();
  10. foreach (var attachment in attachments)
  11. {
  12. if (attachment.IsAttachment)
  13. {
  14. var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name;
  15. var filePath = MailHelper.GetEmlAttachmentFilePath(fileName, messageId);
  16. using (var stream = File.Create(filePath))
  17. {
  18. if (attachment is MessagePart rfc822)
  19. {
  20. rfc822.Message.WriteTo(stream);
  21. }
  22. else
  23. {
  24. var part = (MimePart)attachment;
  25. part.Content.DecodeTo(stream);
  26. }
  27. }
  28. var mailFileInfo = new FileInfo(filePath);
  29. emailAttachments.Add(new EmailAttachmentDto() { FilePath = filePath, FileName = fileName, FileSize = mailFileInfo.Length });
  30. }
  31. }
  32. return emailAttachments;
  33. }

2.保存EML

其实,这一步才是关键,移除附件,只保存其他内容到eml,这样才不会读取时由于文件太大导致卡死

  1. if (mimeMessage.Body is Multipart multipart)
  2. {
  3. while (mimeMessage.Attachments.Any())
  4. {
  5. multipart.Remove(mimeMessage.Attachments.ElementAt(0));
  6. }
  7. var mineMessage = new MimeMessage()
  8. {
  9. Sender = mimeMessage.Sender,
  10. Body = multipart,
  11. MessageId = customerMimeMessage.Id.ToString(),
  12. };
  13. if (!System.IO.File.Exists(fileName))
  14. {
  15. await mineMessage.WriteToAsync(fileName);
  16. }
  17. }

这样就完成了,附件和邮件eml分开存储

参考文章

http://www.it1352.com/675410.html

https://www.cnblogs.com/pengze0902/p/8519715.html

https://www.cnblogs.com/rocketRobin/p/8337055.html

MailKit系列之附件分离的更多相关文章

  1. MailKit系列之---查询SearchQuery

    对于邮件的唯一Id查询,由于MailKit提供了大量的方法,无法完全讲解完全,所以这里只选择几个来介绍. MailKit通过方法folder.Search来查询邮件的唯一Id,参数是一个SearchQ ...

  2. MailKit系列之转发电子邮件

    原文:http://www.it1352.com/429181.html 问题 我尝试通过MailKit访问一个IMAP账号,我设法下载邮件(作为的MimeMessage),并在某些时候我需要转发给其 ...

  3. Asp.NET 简易通用WebServices 附件服务

    [toc] 总述: 用了很久的附件分离服务, .NET 2.0平台开始使用.  配置好服务后, 由调用端定义并管理目录级次.  调用端存储目录即可.  附件服务: 相应配置节点放入 web.confi ...

  4. Discuz论坛架构改造

    这个论坛一直通过NFS服务共享文件给三台web服务器做负载均衡. 在实际环境中WEB Server总是出现CPU负载突然升高.文件交互的网络流量异常.甚至WEB Server夯死,NFS不能卸载,只能 ...

  5. Android逆向——破解水果大战

    最近公司需要测试安卓app安全,但安卓基本上0基础,决定开始学习下安卓逆向根据吾爱破解上教程 <教我兄弟学Android逆向系列课程+附件导航帖> https://www.52pojie. ...

  6. 使用AndroidKiller进行APK反编译

    安装环境 JDK 最好用JDK8,问就是坑太多了 Android Studio 官网安装即可,安装教程如下 https://www.runoob.com/android/android-studio- ...

  7. Email系列(QQ邮箱 + 含附件的邮箱案例 + 项目实战)

    平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html 邮箱系列:https://github.com/duniti ...

  8. Chrome扩展开发(Gmail附件管理助手)系列之〇——概述

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  9. Spring Boot 系列教程9-swagger-前后端分离后的标准

    前后端分离的必要 现在的趋势发展,需要把前后端开发和部署做到真正的分离 做前端的谁也不想用Maven或者Gradle作为构建工具 做后端的谁也不想要用Grunt或者Gulp作为构建工具 前后端需要通过 ...

随机推荐

  1. python读写excel文件

    '''xlrd和xlwt处理的是xls文件,单个sheet最大行数是65535,如果有更大需要的,建议使用openpyxl函数,最大行数达到1048576.'''import openpyxl ''' ...

  2. 清除 x-code 缓存

    https://www.jianshu.com/p/5673d8333544 之前由于经费不足,购置的128的mac,现在发现一不注意盘就满了,悔之晚矣...a).清除 x-code CoreSimu ...

  3. 基于Python玩转人工智能最火框架 TensorFlow应用实践

    慕K网-299元-基于Python玩转人工智能最火框架 TensorFlow应用实践 需要联系我,QQ:1844912514

  4. html-webpack-plugin不输出script标签的方法

    那就是修改源码 约550行: if (!this.options.disableScript) { if (this.options.inject === 'head') { head = head. ...

  5. python学习日记(面向对象——组合)

    组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积.圆环的周长是内部圆的周长加上外部圆的周长.这个时候,我们就首先实现一 ...

  6. 【dp】合唱队形

    题目描述 NN位同学站成一排,音乐老师要请其中的(N-KN−K)位同学出列,使得剩下的KK位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K,他们的身高分别为 ...

  7. chrome主页篡改解决方法

    网上有一个超级细致的小白教学连接,但是发现很难找到,分享一下:https://arlenluo.github.io./2017/03/12/DefeatYourBrowser 还有一种情况是要打开 & ...

  8. 关于Aop切面中的@Before @Around等操作顺序的说明

    [转]http://www.cnblogs.com/softidea/p/6123307.html 话不多说,直接上代码: package com.cdms.aop.aspectImpl; impor ...

  9. P1962 斐波那契数列-题解(矩阵乘法扩展)

    https://www.luogu.org/problemnew/show/P1962(题目传送) n的范围很大,显然用普通O(N)的递推求F(n)铁定超时了.这里介绍一种用矩阵快速幂实现的解法: 首 ...

  10. 关于AI

    自己看着办吧 http://tieba.baidu.com/p/6008409988?fr=ala0&pstaala=1&tpl=5&fid=93764&isgod=0