2012-04-25 70 views
7

我已經創建了一個Web電子郵件應用程序,我如何查看保存附加文件?如何使用OpenPop保存電子郵件附件

我正在使用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 
     } 
    } 
} 

回答

4

OpenPop.Mime.Message類有ToMailMessage()方法,其將OpenPop的信息給System.Net.Mail.MailMessage,其具有Attachments屬性。嘗試從那裏提取附件。

+0

你能告訴我你通過提取 – Pomster 2012-05-14 05:43:12

+0

㈣已經tryed這一點,這是行不通的,OpenPop把整個郵件作爲附件的意思,但我猜它還挺正確的,這樣你們可以有我的獎金,我可能會得到一個袋子給你,因爲你唯一的答案,並將採取任何方式:\ – Pomster 2012-05-14 12:27:30

0

我寫了這個相當長的時間以前,但看看這個代碼塊,我用來保存電子郵件中的XML附件坐在POP服務器上:

OpenPOP.POP3.POPClient client = new POPClient("pop.yourserver.co.uk", 110, "[email protected]", "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"); 
       } 
      } 
     } 
    } 
} 
+1

另外,請參閱www.codeproject.com/Answers/181619/How-i-can-extract-attachment-文件從MessageRaw#answer1和http://codingrage.blogspot.com/2008/04/fetching-and-processing-pop3-email-in.html – as9876 2013-11-26 20:02:03

+0

是@AYS,這是我的博客。 :) – Karl 2014-01-23 11:37:34

4

爲未來的讀者有更新版本的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<Message> allMessages = new List<Message>(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))); 
        } 
       } 
      } 
      } 
10

如果有人仍在尋找答案,這對我來說工作得很好。

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<Message>(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(); 
} 
+0

此代碼用兩個問號替換UTF-8附件中的重音字符。如何解決這個問題?我發佈這個作爲單獨的問題在http://stackoverflow.com/questions/27949470/how-to-read-utf-8-mail-attachmets-from-pop3 – Andrus 2015-01-14 18:03:00

+0

謝謝 - Mange tak - 格雷西 - 完美:-) – JanBorup 2015-02-20 12:30:22

0

以防萬一有人想爲VB.NET代碼:

For Each emailAttachment In client.GetMessage(count).FindAllAttachments 
    AttachmentName = emailAttachment.FileName 
    '----// Write the file to the folder in the following format: <UniqueID> followed by two underscores followed by the <AttachmentName> 
    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 
0
List<Message> lstMessages = FetchAllMessages("pop.mail-server.com", 995, true,"Your Email ID", "Your Password"); 

上面的代碼行會從您的電子郵件使用彈出相應的郵件服務器中的所有郵件列表。

例如,要獲取列表中最新(或第一個)電子郵件的附件,您可以編寫下面的一段代碼。

List<MessagePart> 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); 
} 
0
private KeyValuePair<byte[], FileInfo> parse(MessagePart part) 
    { 
     var _steam = new MemoryStream(); 
     part.Save(_steam); 
     //... 
     var _info = new FileInfo(part.FileName); 
     return new KeyValuePair<byte[], FileInfo>(_steam.ToArray(), _info); 
    } 

    //... How to use 
    var _attachments = message 
     .FindAllAttachments() 
     .Select(a => parse(a)) 
    ; 
相關問題