public class EmailHelp
{
/// <summary>
/// Smtp服务器地址
/// </summary>
private static readonly string SmtpServer = ConfigurationManager.AppSettings["SmtpServer"]; /// <summary>
/// Pop服务器地址
/// </summary>
private static readonly string PopServer = ConfigurationManager.AppSettings["PopServer"]; /// <summary>
/// Imap服务器地址
/// </summary>
private static readonly string ImapServer = ConfigurationManager.AppSettings["ImapServer"]; /// <summary>
/// SMTP端口
/// </summary>
private static readonly int SmtpPort = int.Parse(ConfigurationManager.AppSettings["SmtpPort"]); /// <summary>
/// POP端口
/// </summary>
private static readonly int PopPort = int.Parse(ConfigurationManager.AppSettings["PopPort"]); /// <summary>
/// IMAP端口
/// </summary>
private static readonly int ImapPort = int.Parse(ConfigurationManager.AppSettings["ImapPort"]); /// <summary>
/// 邮件发送
/// </summary>
/// <param name="mailFromAccount">发送邮箱账号</param>
/// <param name="mailPassword">发送邮箱密码</param>
/// <param name="message">邮件</param>
public static void SendEmali(string mailFromAccount, string mailPassword, MimeMessage message)
{
using (var client = new MailKit.Net.Smtp.SmtpClient())
{
client.Connect(SmtpServer, SmtpPort, false); // Note: since we don't have an OAuth2 token, disable
// the XOAUTH2 authentication mechanism.
client.AuthenticationMechanisms.Remove("XOAUTH2"); // Note: only needed if the SMTP server requires authentication
client.Authenticate(mailFromAccount, mailPassword);
client.Send(message);
client.Disconnect(true);
}
} /// <summary>
/// 创建文本消息
/// </summary>
/// <param name="fromAddress">发件地址</param>
/// <param name="toAddressList">收件地址</param>
/// <param name="title">标题</param>
/// <param name="content">内容</param>
/// <param name="IsPostFiles">是否将POST上传文件加为附件</param>
/// <returns></returns>
public static MimeMessage CreateTextMessage(MailboxAddress fromAddress, IList<MailboxAddress> toAddressList
, string title, string content, bool IsPostFiles = false)
{
var message = new MimeMessage();
message.From.Add(fromAddress);
message.To.AddRange(toAddressList);
message.Subject = title; //设置消息的主题 var html = new TextPart("html")
{
Text = content,
};
var alternative = new Multipart("alternative");
alternative.Add(html); var multipart = new Multipart("mixed");
multipart.Add(alternative);
if (IsPostFiles)
{
IList<MimePart> multiPartList = GetMimePartList();
foreach (var item in multiPartList)
{
multipart.Add(item);
}
} message.Body = multipart;
return message;
} /// <summary>
/// 收邮件
/// </summary>
/// <param name="mailFromAccount">发送邮箱账号</param>
/// <param name="mailPassword">发送邮箱密码</param>
/// <param name="searchQuery">查询条件</param>
/// <param name="folderName">文件夹名称</param>
/// <returns></returns>
public static IList<IMessageSummary> ReceiveEmail(string mailFromAccount, string mailPassword, string folderName, SearchQuery searchQuery = null)
{
//打开收件箱
var folder = OpenFolder(mailFromAccount, mailPassword, folderName); //IList<OrderBy> orderByList = new List<OrderBy> { OrderBy.Date };
//查询所有的邮件
var uidss = folder.Search(searchQuery); IList<IMessageSummary> msgList = new List<IMessageSummary>();
if (uidss.Count > )//判断是否查询到邮件
{
//获取邮件头
msgList = folder.Fetch(uidss, MessageSummaryItems.UniqueId | MessageSummaryItems.Full);
} folder.Close();
return msgList;
} /// <summary>
/// 根据唯一号查询信件
/// </summary>
/// <param name="mailFromAccount">邮箱账号</param>
/// <param name="mailPassword">邮箱密码</param>
/// <param name="id">唯一号</param>
/// <param name="folderName">文件夹名称</param>
/// <returns></returns>
public static MimeMessage GetEmailByUniqueId(string mailFromAccount, string mailPassword, uint id, string folderName)
{
//打开收件箱
var folder = OpenFolder(mailFromAccount, mailPassword, folderName);
UniqueId emailUniqueId = new UniqueId(id);
MimeMessage message = folder.GetMessage(emailUniqueId);
/*将邮件设为已读*/
MessageFlags flags = MessageFlags.Seen;
folder.SetFlags(emailUniqueId, flags, true);
return message;
} /// <summary>
/// 读取上传的文件
/// </summary>
/// <returns></returns>
public static IList<MimePart> GetMimePartList()
{
IList<MimePart> mimePartList = new List<MimePart>();
var current = HttpContext.Current;
if (current != null)
{
HttpRequest request = current.Request;
HttpFileCollection files = request.Files;
int filesCount = files.Count;
for (int i = ; i < filesCount; i++)
{
HttpPostedFile item = files[i];
MimePart attachment = new MimePart(item.ContentType)
{
ContentObject = new ContentObject(item.InputStream, ContentEncoding.Default),
ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
ContentTransferEncoding = ContentEncoding.Base64,
FileName = item.FileName
}; mimePartList.Add(attachment);
}
}
return mimePartList;
} /// <summary>
/// 打开邮箱文件夹
/// </summary>
/// <param name="mailFromAccount">邮箱账号</param>
/// <param name="mailPassword">邮箱密码</param>
/// <param name="folderName">文件夹名称(INBOX:收件箱名称)</param>
/// <returns></returns>
public static IMailFolder OpenFolder(string mailFromAccount, string mailPassword, string folderName)
{
ImapClient client = new ImapClient();
client.Connect(ImapServer, ImapPort);
client.Authenticate(mailFromAccount, mailPassword);
//获取所有文件夹
//List<IMailFolder> mailFolderList = client.GetFolders(client.PersonalNamespaces[0]).ToList(); var folder = client.GetFolder(folderName); //打开文件夹并设置为读的方式
folder.Open(MailKit.FolderAccess.ReadWrite);
return folder;
} /// <summary>
/// 下载邮件附件
/// </summary>
/// <param name="mimePart"></param>
public static void DownFile(MimePart mimePart)
{
HttpContext context = HttpContext.Current; // 设置编码和附件格式
context.Response.ContentType = mimePart.ContentType.ToString();
//context.Response.ContentEncoding = Encoding.UTF8; context.Response.Charset = "";
string fileName = HttpUtility.UrlEncode(mimePart.FileName, Encoding.UTF8);
context.Response.AppendHeader("Content-Disposition",
"attachment;filename=" + fileName);
using (MemoryStream ms = new MemoryStream())
{
mimePart.ContentObject.DecodeTo(ms);
ms.Flush();
ms.Position = ;
context.Response.BinaryWrite(ms.GetBuffer()); context.Response.End();
}
}
}

MailKit帮助类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. 跨平台的.NET邮件协议MailKit组件解析

    发起的.NET Core开源组织号召,进展的速度是我自己也没有想到的,很多园友都积极参与(虽然有些人诚心砸场子,要是以我以前的宝脾气,这会应该被我打住院了吧,不过幸好是少数,做一件事总有人说好,也有人 ...

  3. 创建基于MailKit和MimeKit的.NET基础邮件服务

    邮件服务是一般的系统都会拥有和需要的功能,但是对于.NET项目来说,邮件服务的创建和使用会较为的麻烦..NET对于邮件功能提供了System.Net.Mail用于创建邮件服务,该基础服务提供邮件的基础 ...

  4. mailkit库收发邮件

    mailkit库用于收发邮件.这个库可以替代C#自带的发邮件库 环境  W10 / VS2017CMMT / MailKit version="2.0.3" "net46 ...

  5. MailKit和MimeKit的.NET基础邮件服务

    MailKit和MimeKit的.NET基础邮件服务 邮件服务是一般的系统都会拥有和需要的功能,但是对于.NET项目来说,邮件服务的创建和使用会较为的麻烦..NET对于邮件功能提供了System.Ne ...

  6. Asp.Net Core采用MailKit部署到Linux Docker连接邮件服务器报错

    前段时间看文章了解到发邮件的SmtpClient已经过时了,微软官方推荐大家用其他解决方案,例如MailKit. https://docs.microsoft.com/zh-cn/dotnet/api ...

  7. 使用Volo.Abp.MailKit发送邮件

    Volo.Abp.MailKit封装继承MailKit库,为Abp邮件发送提供了快捷实现. 邮箱配置 qq邮箱支持smtp功能,需要去申请开通.参考qq邮箱设置,最重要的是smtp发送邮件,qq邮箱对 ...

  8. NET 5 收发邮件之 MailKit

    大家都用过SmtpClient来处理发送邮件的操作,不过这个类以及被标记已过时,所以介绍一个微软推荐的库MailKit来处理. MailKit开源地址:https://github.com/jsted ...

  9. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

随机推荐

  1. 看看一个老程序员如何手写SpringMVC!

    人见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十 ...

  2. C#单元测试分享ppt

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类, ...

  3. Spring Session - 使用Redis存储HttpSession例子

    目的 使用Redis存储管理HttpSession: 添加pom.xml 该工程基于Spring Boot,同时我们将使用Spring IO Platform来维护依赖版本号: 引入的依赖有sprin ...

  4. CentOS 6.5 网络服务器功能的实现②:运用光盘(镜像)制作一个本地yum源

    在用Linux安装软件时(rpm安装方式),有时会出现“包依赖”的现象.因此,我们可以用yum工具来实现一次性安装所有rpm工具包的功能. 实例:在此服务器上用yum的方式安装DHCP服务和TFTP服 ...

  5. Spring Boot 解决方案 - 会话

    连接无状态 使用 HTTP 的连接是无状态的,因此为了应对需要状态的服务例如用户登录,诞生了适合保存状态的设计-会话(session),本文就来探讨一下会话. 会话的使用 Spring Mvc 中使用 ...

  6. Hystrix参数配置

    1.Hystrix参数配置文档  2.Hystrix参数配置示例 import org.springframework.beans.factory.annotation.Autowired; impo ...

  7. 理解 React Hooks

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由志航发表于云+社区专栏 TL;DR 一句话总结 React Hooks 就是在 react 函数组件中,也可以使用类组件(classe ...

  8. 西门子PLC SCL语言开发学习笔记(二)

    今天来讲下scl两个关键的点 一.按键事件 比如地址I0.0是某个按钮的状态,他只有True和False两个状态,所以我们要获得按下事件需要我们自己模拟. #KeyPress := "Btn ...

  9. 3张表实现RBAC

    管理员表 CREATE TABLE cqh_admin ( id smallint unsigned not null auto_increment comment 'id', username va ...

  10. Canvas画空心正五角星-扩展DEMO为五星红旗

    马上就要国庆了,在这个举国欢庆的日子里面,让我来画一个五角星表表我的爱国之情,啊?那你不是要画一个五星红旗?是的,你猜对了,其实我的最初想法只是画一个空心的正五角星,为了满足你,我拼一拼.在这个过程中 ...