using MailKit.Net.Imap;
using MailKit.Search;
using MailKit.Security;
using MailKit;
using MimeKit;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tiger.Model;
using System.Configuration;
namespace Tiger.Business
{
///
/// 跟投邮件服务API
///
public static class ReceiveEmailServiceApi
{
///
/// 设置发件人信息
///
///
public static SendServerConfigurationEntity SetSendMessage()
{
var sendServerConfiguration = new SendServerConfigurationEntity
{
SmtpHost = ConfigurationManager.AppSettings["SmtpServer"],
SmtpPort = int.Parse(ConfigurationManager.AppSettings["SmtpPort"]),
IsSsl = Convert.ToBoolean(ConfigurationManager.AppSettings["IsSsl"]),
MailEncoding = ConfigurationManager.AppSettings["MailEncoding"],
SenderAccount = ConfigurationManager.AppSettings["SenderAccount"],
SenderPassword = ConfigurationManager.AppSettings["SenderPassword"]
};
return sendServerConfiguration;
}
///
/// 接收邮件
///
public static void ReceiveEmail()
{
var sendServerConfiguration = SetSendMessage();
if (sendServerConfiguration == null)
{
throw new ArgumentNullException();
}
using (var client = new ImapClient(new ProtocolLogger(CreateMailLog())))
{
client.Connect(sendServerConfiguration.SmtpHost, sendServerConfiguration.SmtpPort,
SecureSocketOptions.SslOnConnect);
client.Authenticate(sendServerConfiguration.SenderAccount, sendServerConfiguration.SenderPassword);
client.Inbox.Open(FolderAccess.ReadOnly);
var uids = client.Inbox.Search(SearchQuery.All);
foreach (var uid in uids)
{
var message = client.Inbox.GetMessage(uid);
message.WriteTo($"{uid}.eml");
}
client.Disconnect(true);
}
}
///
/// 下载邮件内容
///
public static void DownloadBodyParts()
{
var sendServerConfiguration = SetSendMessage();
using (var client = new ImapClient())
{
client.Connect(sendServerConfiguration.SmtpHost, sendServerConfiguration.SmtpPort,
SecureSocketOptions.SslOnConnect);
client.Authenticate(sendServerConfiguration.SenderAccount, sendServerConfiguration.SenderPassword);
client.Inbox.Open(FolderAccess.ReadOnly);
// 搜索Subject标题包含“MimeKit”或“MailKit”的邮件
var query = SearchQuery.SubjectContains("MimeKit").Or(SearchQuery.SubjectContains("MailKit"));
var uids = client.Inbox.Search(query);
// 获取搜索结果的摘要信息(我们需要UID和BODYSTRUCTURE每条消息,以便我们可以提取文本正文和附件)
var items = client.Inbox.Fetch(uids, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure);
foreach (var item in items)
{
// 确定一个目录来保存内容
var directory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "/MailBody", item.UniqueId.ToString());
Directory.CreateDirectory(directory);
// IMessageSummary.TextBody是一个便利的属性,可以为我们找到“文本/纯文本”的正文部分
var bodyPart = item.TextBody;
// 下载'text / plain'正文部分
var body = (TextPart)client.Inbox.GetBodyPart(item.UniqueId, bodyPart);
// TextPart.Text是一个便利的属性,它解码内容并将结果转换为我们的字符串
var text = body.Text;
File.WriteAllText(Path.Combine(directory, "body.txt"), text);
// 现在遍历所有附件并将其保存到磁盘
foreach (var attachment in item.Attachments)
{
// 像我们对内容所做的那样下载附件
var entity = client.Inbox.GetBodyPart(item.UniqueId, attachment);
// 附件可以是message / rfc822部件或常规MIME部件
var messagePart = entity as MessagePart;
if (messagePart != null)
{
var rfc822 = messagePart;
var path = Path.Combine(directory, attachment.PartSpecifier + ".eml");
rfc822.Message.WriteTo(path);
}
else
{
var part = (MimePart)entity;
// 注意:这可能是空的,但大多数会指定一个文件名
var fileName = part.FileName;
var path = Path.Combine(directory, fileName);
// decode and save the content to a file
using (var stream = File.Create(path))
part.Content.DecodeTo(stream);
}
}
}
client.Disconnect(true);
}
}
///
/// 创建邮件日志文件
///
///
public static string CreateMailLog()
{
var logPath = AppDomain.CurrentDomain.BaseDirectory + "/DocumentLog/" +
DateTime.Now.ToUniversalTime().ToString(CultureInfo.InvariantCulture) + ".txt";
if (File.Exists(logPath)) return logPath;
var fs = File.Create(logPath);
fs.Close();
return logPath;
}
}
}