如何使用OpenPop保存电子邮件附件

我创建了一个Web电子邮件应用程序,如何查看保存附件?

我正在使用OpenPop ,第三方dll,我可以发送带附件的电子邮件和阅读没有附件的电子邮件。

这很好用:

Pop3Client pop3Client = (Pop3Client)Session["Pop3Client"]; // Creating newPopClient int messageNumber = int.Parse(Request.QueryString["MessageNumber"]); Message message = pop3Client.GetMessage(messageNumber); MessagePart messagePart = message.MessagePart.MessageParts[1]; lblFrom.Text = message.Headers.From.Address; // Writeing message. lblSubject.Text = message.Headers.Subject; lblBody.Text=messagePart.BodyEncoding.GetString(messagePart.Body); 

第二部分代码显示了附件的内容,但这仅在其文本文件中有用。 我需要能够保存附件。 我在这里的代码的底部部分写了我的消息正文,所以如果我收到一个附件,我无法查看我的消息正文。

 if (messagePart.IsAttachment == true) { foreach (MessagePart attachment in message.FindAllAttachments()) { if (attachment.FileName.Equals("blabla.pdf")) { // Save the raw bytes to a file File.WriteAllBytes(attachment.FileName, attachment.Body); //overwrites MessagePart.Body with attachment } } } 

如果有人还在寻找答案,这对我来说很好。

 var client = new Pop3Client(); try { client.Connect("MailServerName", Port_Number, UseSSL); //UseSSL true or false client.Authenticate("UserID", "password"); var messageCount = client.GetMessageCount(); var Messages = new List(messageCount); for (int i = 0;i < messageCount; i++) { Message getMessage = client.GetMessage(i + 1); Messages.Add(getMessage); } foreach (Message msg in Messages) { foreach (var attachment in msg.FindAllAttachments()) { string filePath = Path.Combine(@"C:\Attachment", attachment.FileName); if(attachment.FileName.Equals("blabla.pdf")) { FileStream Stream = new FileStream(filePath, FileMode.Create); BinaryWriter BinaryStream = new BinaryWriter(Stream); BinaryStream.Write(attachment.Body); BinaryStream.Close(); } } } } catch (Exception ex) { Console.WriteLine("", ex.Message); } finally { if (client.Connected) client.Dispose(); } 

对于未来的读者来说,更新版本的Pop3有更简单的方法

 using( OpenPop.Pop3.Pop3Client client = new Pop3Client()) { client.Connect("in.mail.Your.Mailserver.com", 110, false); client.Authenticate("usernamePop3", "passwordPop3", AuthenticationMethod.UsernameAndPassword); if (client.Connected) { int messageCount = client.GetMessageCount(); List allMessages = new List(messageCount); for (int i = messageCount; i > 0; i--) { allMessages.Add(client.GetMessage(i)); } foreach (Message msg in allMessages) { var att = msg.FindAllAttachments(); foreach (var ado in att) { ado.Save(new System.IO.FileInfo(System.IO.Path.Combine("c:\\xlsx", ado.FileName))); } } } } 

OpenPop.Mime.Message类具有ToMailMessage()方法,该方法将OpenPop的Message转换为System.Net.Mail.MailMessage ,它具有Attachments属性。 尝试从那里提取附件。

我很久以前写过这篇文章,但看看我用来保存POP服务器上的电子邮件中的XML附件的代码块:

 OpenPOP.POP3.POPClient client = new POPClient("pop.yourserver.co.uk", 110, "your@email.co.uk", "password_goes_here", AuthenticationMethod.USERPASS); if (client.Connected) { int msgCount = client.GetMessageCount(); /* Cycle through messages */ for (int x = 0; x < msgCount; x++) { OpenPOP.MIMEParser.Message msg = client.GetMessage(x, false); if (msg != null) { for (int y = 0; y < msg.AttachmentCount; y++) { Attachment attachment = (Attachment)msg.Attachments[y]; if (string.Compare(attachment.ContentType, "text/xml") == 0) { System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); string xml = attachment.DecodeAsText(); doc.LoadXml(xml); doc.Save(@"C:\POP3Temp\test.xml"); } } } } } 

以防有人想要VB.NET的代码:

 For Each emailAttachment In client.GetMessage(count).FindAllAttachments AttachmentName = emailAttachment.FileName '----// Write the file to the folder in the following format:  followed by two underscores followed by the  Dim strmFile As New FileStream(Path.Combine("C:\Test\Attachments", EmailUniqueID & "__" & AttachmentName), FileMode.Create) Dim BinaryStream = New BinaryWriter(strmFile) BinaryStream.Write(emailAttachment.Body) BinaryStream.Close() Next 
  List lstMessages = FetchAllMessages("pop.mail-server.com", 995, true,"Your Email ID", "Your Password"); 

上面的代码行使用相应的pop邮件服务器获取电子邮件中所有邮件的列表。

例如,要在列表中获取最新(或第一个)电子邮件的附件,您可以编写以下代码。

  List lstAttachments = lstMessages[0].FindAllAttachments(); //Gets all the attachments associated with latest (or first) email from the list. for (int attachment = 0; attachment < lstAttachments.Count; attachment++) { FileInfo file = new FileInfo("Some File Name"); lstAttachments[attachment].Save(file); } 
  private KeyValuePair parse(MessagePart part) { var _steam = new MemoryStream(); part.Save(_steam); //... var _info = new FileInfo(part.FileName); return new KeyValuePair(_steam.ToArray(), _info); } //... How to use var _attachments = message .FindAllAttachments() .Select(a => parse(a)) ;