static DbContext db = new DbContext();
/// <summary>
/// 下载邮件附件
/// </summary>
[HttpGet]
public void GetEmailFile()
{
Console.WriteLine("Hello, World!");
string serve = "";
string Account = "";
string pwd = "";
//查读取过的邮件id
List<string> EmailCodeList = (from i in db.Emaillog.GetList() select i.EmailCode).ToList();
using (var client = new ImapClient())
{
#region 连接邮件服务器获取所有邮件
//我们用的端口号是143,SecureScokeroptions是一个枚举类型,邮箱加密方式
client.Connect(serve, 143, SecureSocketOptions.None);
client.Authenticate(Account, pwd);
// The Inbox folder is always available on all IMAP servers...
var inbox = client.Inbox;
//以读写的方式打开收件箱方便设置邮件状态
inbox.Open(FolderAccess.ReadOnly);
//获取所有邮件编号
var uids = inbox.Search(SearchQuery.All);
#endregion
//获取邮件信息
for (int i = 0; i < uids.Count; i++)
{
//如果读取到的邮件编号没有被存储过就会读取邮件附件
if (!EmailCodeList.Contains(uids[i].ToString()))
{
List<string> files = new List<string>();
//只获取当前的循环的邮件编号便于可能操作数据库,分辨邮件
List<UniqueId> uniqueIds = new List<UniqueId> { uids[i] };
//通过邮件编号设置获取邮件内容
var message = inbox.GetMessage(uids[i]);
string msgId = message.MessageId;
Console.WriteLine("Subject: {0}", message.Subject);
Console.WriteLine("Headers: {0}", message.Headers);
//获取附件
var listmsg = client.Inbox.Fetch(uniqueIds, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure);
Emaillog maillog = new maillog()
{
CreateTime = DateTime.Now,
EmailCode = uids[i].ToString(),
ReceivingTime = message.Date.ToString(),
Subject = message.Subject,
Status = true
};
foreach (var item in listmsg)
{
// 确定一个目录来保存内容
var directory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "MailBody");
Directory.CreateDirectory(directory);
// 现在遍历所有附件并将其保存到磁盘
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 = DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
var path = Path.Combine(directory, fileName);
// decode and save the content to a file
using (var stream = System.IO.File.Create(path))
part.Content.DecodeTo(stream);
//读到文件之后记录存放文件路径
files.Add(path);
maillog.AttachmentPath = maillog.AttachmentPath + path;
}
}
}
try
{
db.Db.BeginTran();
foreach (var item in files)
{
ImportExcel(item);
}
var status = db.Emaillog.Insert(Emaillog);
db.Db.CommitTran();
}
catch (Exception ex)
{
db.Db.RollbackTran();
//回滚之后记录错误日志
maillog.Status = false;
maillog.Msg = ex.Message;
var status = db.Emaillog.Insert(maillog);
}
//你可以以读写的方式打开最后设置邮件状态为已读
//MessageFlags messageFlags = MessageFlags.Seen;
//bool silent = false;
//inbox.SetFlags(uids[i], messageFlags, silent);
}
}
client.Disconnect(true);
}
Console.ReadKey();
}
[NonAction]
public static void ImportExcel(string path)
{
List<trackingnumber> trackingnumbers = new List<trackingnumber>();
using (var package = new ExcelPackage(new FileInfo(path)))
{
var sheet = package.Workbook.Worksheets[1];
var colCount = sheet.Dimension.End.Column;
var rowCount = sheet.Dimension.End.Row;
for (int c = sheet.Dimension.Start.Column; c <= rowCount; c++)
{
if (c != 1)
{
var value = sheet.GetValue<string>(c, 1);
var value2 = sheet.GetValue<string>(c, 2);
trackingnumbers.Add(new trackingnumber
{
CreateTime = DateTime.Now,
OrderNumber = value,
TrackingNumber = value2,
Status = false
});
}
}
}
var sta = db.trackingnumber.InsertRange(trackingnumbers);
}