在项目中,我们需要监听邮件服务器,看是否有新的邮件进入。下面的代码可以帮助我们监听新邮件,并对已有的邮件进行查找:
using System;
using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Office.Interop.Outlook; namespace EmailReceiver { public class EmailAnalyzer { static ApplicationClass outlookApp = new Microsoft.Office.Interop.Outlook.ApplicationClass(); static NameSpace ns; static EmailAnalyzer() { ns = outlookApp.GetNamespace("MAPI"); } public static void Start() { AnalyzeNewItem(); } public static List<MailItem> GetMailItemsWithInFolders(Folders folders, string folderName) { List<MailItem> allmails = new List<MailItem>(); if (folders != null) { int foldersCount = folders.Count; for (int i = 1; i <= foldersCount; i++) { var subFolder = folders[i]; if (!subFolder.Name.Equals(folderName, StringComparison.InvariantCultureIgnoreCase)) { continue; } foreach (var item in subFolder.Items) { if (item is MailItem) { var mail = item as MailItem; allmails.Add(mail); } } } } return allmails; } public static List<Folders> GetUnderlyingFolders(Folders inputFolder) { List<Folders> allFolders = new List<Folders>(); if (inputFolder != null) { int foldersCount = inputFolder.Count; if (foldersCount > 0) { for (int i = 1; i <= foldersCount; i++) { var subFolder = inputFolder[i]; allFolders.AddRange(GetUnderlyingFolders(subFolder.Folders)); } } else { allFolders.Add(inputFolder); } } return allFolders; } public static List<Folders> GetUnderlyingFolders(Folders inputFolder, string folderName) { List<Folders> allFolders = new List<Folders>(); if (inputFolder != null) { int foldersCount = inputFolder.Count; if (foldersCount > 0) { for (int i = 1; i <= foldersCount; i++) { var subFolder = inputFolder[i]; if (subFolder.Name.Equals(folderName, StringComparison.InvariantCultureIgnoreCase)) { allFolders.AddRange(GetUnderlyingFolders(subFolder.Folders)); } } } else { allFolders.Add(inputFolder); } } return allFolders; } public static List<MailItem> GetUnderlyingItems(string folderName = "") { var inbox = ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox); return GetUnderlyingItems(inbox.Folders, !string.IsNullOrEmpty(folderName) ? null : inbox.Items, folderName); } private static List<MailItem> GetUnderlyingItems(Folders inputFolder, Items items, string folderName = "") { List<MailItem> allItems = new List<MailItem>(); if (inputFolder != null) { if (items != null) { foreach (var item in items) { if (item is MailItem) { var mail = item as MailItem; allItems.Add(mail); } } } int foldersCount = inputFolder.Count; if (foldersCount > 0) { for (int i = 1; i <= foldersCount; i++) { var subFolder = inputFolder[i]; if (!string.IsNullOrEmpty(folderName)) { if (folderName.Equals(subFolder.Name, StringComparison.InvariantCultureIgnoreCase)) { foreach (var item in subFolder.Items) { if (item is MailItem) { var mail = item as MailItem; allItems.Add(mail); } } } else { allItems.AddRange(GetUnderlyingItems(subFolder.Folders, null, folderName)); } } else { allItems.AddRange(GetUnderlyingItems(subFolder.Folders, subFolder.Items, folderName)); } } } } return allItems; } private static void AnalyzeNewItem() { var allItems = GetUnderlyingItems(""); var matchedItems = allItems.Where(s => s.Subject != null && s.Subject.ToLower().Contains("")).ToList(); var count = matchedItems.Count; foreach (MailItem item in matchedItems) { Console.WriteLine(item.Subject); Console.WriteLine(item.To); Console.WriteLine(item.SenderName); Console.WriteLine(item.ReceivedTime); //Console.WriteLine(item.Body); } Console.ReadLine(); } } }
同时附上常用的邮件发送组件:
public static class MailHelper { private const string SMTPHost = "mail.pimco.com"; private const string FromAdress = "hailongli@pimco.com"; private const string FromDisplay = "Hailong LI"; private static readonly MailAddress From; private static List<string> toList = new List<string>(); static MailHelper() { From = new MailAddress(FromAdress, FromDisplay); toList.Clear(); toList.Add(FromAdress); } public static void SendToMyself(string subject, string body) { MailHelper.Send(new List<string>(), null, subject, body, null); } private static void Send(List<string> to, string subject, string body, List<System.Net.Mail.Attachment> attachments) { MailHelper.Send(to, null, subject, body, attachments); } private static void Send(List<string> to, List<string> cc, string subject, string body, List<System.Net.Mail.Attachment> attachments) { if (to == null || to.Count == 0) { var ex = new ArgumentNullException("must assign a receiver."); return; } MailMessage message = new MailMessage { Subject = subject, Body = body }; message.From = From; to.ForEach(t => message.To.Add(t)); if (cc != null) { cc.ForEach(c => message.CC.Add(c)); } if (attachments != null) { attachments.ForEach(attachemet => message.Attachments.Add(attachemet)); } SmtpClient client = new SmtpClient(SMTPHost); client.UseDefaultCredentials = true; client.DeliveryMethod = SmtpDeliveryMethod.Network; client.SendCompleted += delegate(object sender, AsyncCompletedEventArgs e) { SmtpClient smtpClient = sender as SmtpClient; if (smtpClient != null) { smtpClient.Dispose(); } }; client.SendAsync(message, null); } }