Download email attachments in .NET
Monday, January 25th, 2010
First you’ll need an IMAP client or POP3 client to download emails from the server.
The email attachments are downloaded as a part of the message. Attachments are stored within the email as part of a mime tree. Usually Quoted-Printable or Base64 encoding are used. Mail.dll is going to parse such tree for you and expose all attachments as well known .NET collections.
ISimpleMailMessage uses 2 collections for storing attachments:
- Attachments - contains all attached documents
- Visuals - contains files that should be ‘displayed’ to the user (like images or music that should be played in background)
Following you’ll find samples of how you can save all attachments to disk using C# and VB.NET via POP3 and IMAP protocols.
When you use IMAP server:
// C# version
using(Imap imap = new Imap())
{
imap.Connect("server");
imap.User = "user";
imap.Password = "password";
imap.Login();
imap.SelectInbox();
List<long> uids = imap.SearchFlag(Flag.All);
foreach (long uid in uids)
{
string eml = imap.GetMessageByUID(uid);
ISimpleMailMessage email = new SimpleMailMessageBuilder()
.CreateFromEml(eml);
Console.WriteLine(email.Subject);
// save all attachments to disk
email.Attachments.ForEach(mime => mime.Save(mime.FileName));
email.Visuals.ForEach(mime => mime.Save(mime.FileName));
}
imap.Close(true);
}
You can also save attachment to stream: void MimeData.Save(Stream stream)
Or get direct access to it: MemoryStream MimeData.GetMemoryStream()
' VB.NET version
Using imap As New Imap()
imap.Connect("server")
imap.User = "user"
imap.Password = "password"
imap.Login()
imap.SelectInbox()
Dim uids As List(Of Long) = imap.SearchFlag(Flag.All)
For Each uid As Long In uids
Dim eml As String = imap.GetMessageByUID(uid)
Dim email As ISimpleMailMessage = New SimpleMailMessageBuilder()_
.CreateFromEml(eml)
Console.WriteLine(email.Subject)
' save all attachments to disk
email.Attachments.ForEach(Function(mime) mime.Save(mime.FileName))
email.Visuals.ForEach(Function(mime) mime.Save(mime.FileName))
Next
imap.Close(True)
End Using
When you use POP3 server:
// C# version
using(Pop3 pop3 = new Pop3())
{
pop3.Connect("server");
pop3.User = "user";
pop3.Password = "password";
pop3.Login();
pop3.GetAccountStat();
for (int i = 1; i <= pop3.MessageCount; i++)
{
string eml = pop3.GetMessage(i);
ISimpleMailMessage email = new SimpleMailMessageBuilder()
.CreateFromEml(eml);
Console.WriteLine(email.Subject);
// save all attachments to disk
email.Attachments.ForEach(mime => mime.Save(mime.FileName));
email.Visuals.ForEach(mime => mime.Save(mime.FileName));
}
pop3.Close(true);
}
' VB.NET version
Using pop3 As New Pop3()
pop3.Connect("server")
pop3.User = "user"
pop3.Password = "password"
pop3.Login()
pop3.GetAccountStat()
For i As Integer = 1 To pop3.MessageCount
Dim eml As String = pop3.GetMessage(i)
Dim email As ISimpleMailMessage = New SimpleMailMessageBuilder()_
.CreateFromEml(eml)
Console.WriteLine(email.Subject)
' save all attachments to disk
email.Attachments.ForEach(Function(mime) mime.Save(mime.FileName))
email.Visuals.ForEach(Function(mime) mime.Save(mime.FileName))
End While
pop3.Close(True)
End Using

