2012-04-25 109 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クラスはAttachments性質を持っているSystem.Net.Mail.MailMessageにOpenPopのメッセージを、変換ToMailMessage()方法があります。そこから添付ファイルを抽出してみてください。

+0

はあなたが – Pomster

+0

Ivのを抽出することによって何を意味するかを見せてもらえ、これをしようと試みてきたし、それが動作しない、OpenPopは、添付ファイルとしてメッセージ全体を扱いますが、私はそうuが私の恵みを持つことができ、そのちょっと正確に推測します私はあなたの唯一の答えからあなたにそれを与えるためのバッグを手に入れて、それをどうにかするつもりです:\ – Pomster

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- Message-from-MessageRaw#answer1とhttp://codingrage.blogspot.com/2008/04/fetching-and-processing-pop3-email-in.html – as9876

+0

これは私のブログです。 :) – Karl

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

誰かがまだ答えを探しているなら、これは私にとってうまくいった。

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

このコードは、UTF-8添付のアクセント付き文字を2つの疑問符で置き換えます。これを修正するには?私はこれを別の質問としてhttp://stackoverflow.com/questions/27949470/how-to-read-utf-8-mail-attachmets-from-pop3 – Andrus

+0

に投稿しました。ありがとうございました - Mange tak - Gracie - Perfecto :-) – JanBorup

0

たとえば、最新の(または最初の)電子メールをリストに添付するには、次のコードを書くことができます。

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
List<Message> lstMessages = FetchAllMessages("pop.mail-server.com", 995, true,"Your Email ID", "Your Password"); 

上記のコード行は、対応するPOPメール・サーバを使用して電子メールからのすべてのメッセージのリストを取得します:誰かがVB.NETのコードを望んで念のために

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
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)) 
    ;