12

I have created a Web Email Application, How do I view and save attached files?

I am using OpenPop, a third Party dll, I can send emails with attachments and read emails with no attachments.

This works fine:

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

This second portion of code displays the contents of the attachment, but that's only useful if its a text file. I need to be able to save the attachment. Also the bottom section of code I have here over writes the body of my message, so if I receive an attachment I can't view my message 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 
        } 
    } 
}
laylarenee
  • 3,276
  • 7
  • 32
  • 40
Pomster
  • 14,567
  • 55
  • 128
  • 204

7 Answers7

17

If anyone is still looking for answer this worked fine for me.

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();
}
Tolga Evcimen
  • 7,112
  • 11
  • 58
  • 91
ElectricRouge
  • 1,239
  • 3
  • 22
  • 33
  • This code replaces accented characters in UTF-8 attachment with two question marks. How to fix this ? I posted this as separate question in http://stackoverflow.com/questions/27949470/how-to-read-utf-8-mail-attachmets-from-pop3 – Andrus Jan 14 '15 at 18:03
  • THANK YOU - Mange tak - Gracie - Perfecto :-) – JanBorup Feb 20 '15 at 12:30
6

for future readers there is easier way with newer releases of 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)));
                    }
                }
            }
           }
adopilot
  • 4,340
  • 12
  • 65
  • 92
4

The OpenPop.Mime.Message class has ToMailMessage() method that converts OpenPop's Message to System.Net.Mail.MailMessage, which has an Attachments property. Try extracting attachments from there.

ehird
  • 40,602
  • 3
  • 180
  • 182
Stanislav Berkov
  • 5,929
  • 2
  • 30
  • 36
  • Iv have tryed this and it does not work, OpenPop treats the whole message as attachments, but i guess its kinda correct so u can have my bounty,I might as well get a bag for giving it to you since your the only answer and going to get it any way :\ – Pomster May 14 '12 at 12:27
0

I wrote this quite a long time ago, but have a look at this block of code that I used for saving XML attachments within email messages sat on a POP server:

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");
                }
            }
        }
    }
}
Karl
  • 6,793
  • 3
  • 23
  • 21
  • 1
    Also, see www.codeproject.com/Answers/181619/How-i-can-extract-attachment-file-from-MessageRaw#answer1 and http://codingrage.blogspot.com/2008/04/fetching-and-processing-pop3-email-in.html – as9876 Nov 26 '13 at 20:02
  • Yep @AYS, that's my blog. :) – Karl Jan 23 '14 at 11:37
0
 List<Message> lstMessages = FetchAllMessages("pop.mail-server.com", 995, true,"Your Email ID", "Your Password");

The above line of code gets the list of all the messages from your email using corresponding pop mail-server.

For example, to get the attachment of latest (or first) email in the list, you can write following piece of code.

 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);
 } 
VAMSHI PAIDIMARRI
  • 236
  • 1
  • 4
  • 9
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))
    ;
-1

Just in case someone wants the code for 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