2012-04-25 3 views
7

Я создал приложение электронной почты в Интернете, как мне посмотреть и сохранить вложенные файлы?Как сохранить вложение электронной почты с помощью 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

+0

Iv уже судимым это, и это не работает, OpenPop обрабатывает все сообщения, как вложения, но я предполагаю, что его вроде правильно, так и может иметь свою щедрость, Я мог бы также получить мешок за то, что он вам дал, так как у вас есть единственный ответ и все равно получится: \ – 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- file-from-MessageRaw # answer1 и http://codingrage.blogspot.com/2008/04/fetching-and-processing-pop3-email-in.html – as9876

+0

Yep @AYS, это мой блог. :) – 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

Если кто-то все еще ищет ответ, это сработало хорошо для меня.

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

+0

СПАСИБО - Mange tak - Gracie - Perfecto :-) – JanBorup

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)) 
    ; 
Смежные вопросы