Posts Tagged ‘email’

Download parts of email message

Thursday, July 8th, 2010

Some times you know you’ll receive large emails, and you only need to access some parts without downloading entire messages .

Mail.dll .NET IMAP client allows you to download only needed parts of the specified message.

First you need to get the structure of the message.
There are two methods for that: GetBodyStructureByUID and GetBodyStructure.

You can also use GetMessageInfo or GetMessageInfoByUID methods.
Both methods return more information about the email (subject, from, to and other headers) and include BodyStructure in their response.

BodyStructure contains information about plain text, html, and all attachments of the message. It does not contain any data though.

To download text parts of the email (like html or plain text) you can use: GetMimePartTextByUID or GetMimePartText.

To download attachments use: GetMimePartByUID or GetMimePart.

Here’s the full sample for this feature:

// C#

using(Imap imap = new Imap())
{
	imap.Connect("imap.server.com");
	imap.Login("user", "password");

	imap.SelectInbox();
	List<long> uidList = imap.SearchFlag(Flag.Unseen);
	foreach (long uid in uidList)
	{
		// Get the structure of the email
		BodyStructure structure = imap.GetBodyStructureByUID(uid);

		// Download only text and html parts
		string text = imap.GetMimePartTextByUID(uid, structure.Text);
		string html = imap.GetMimePartTextByUID(uid, structure.Html);

		Console.WriteLine(text);
		Console.WriteLine(html);

		// Show all attachments' filenames
		foreach(MimeStructure attachment in structure.Attachments)
		{
			Console.WriteLine(attachment.SafeFileName);
			// You can also download entire attachment
			byte[] bytes = imap.GetMimePartByUID(uid, attachment);
		}
	}
	imap.Close();
}
' VB.NET

Using imap As New Imap()
	imap.Connect("imap.server.com")
	imap.Login("user", "password")

	imap.SelectInbox()
	Dim uidList As List(Of Long) = imap.SearchFlag(Flag.Unseen)
	For Each uid As Long In uidList
		' Get the structure of the email
		Dim struct As BodyStructure = imap.GetBodyStructureByUID(uid)

		' Download only text and html parts
		Dim text As String = imap.GetMimePartTextByUID(
			uid, struct.Text)
		Dim html As String = imap.GetMimePartTextByUID(
			uid, struct.Html)

		Console.WriteLine(text)
		Console.WriteLine(html)

		' Show all attachments' filenames
		For Each attachment As MimeStructure In struct.Attachments
			Console.WriteLine(attachment.SafeFileName)
			' You can also download entire attachment
			Dim bytes As Byte() = imap.GetMimePartByUID(
				uid, attachment)
		Next
	Next
	imap.Close()
End Using

Email template engine

Friday, February 19th, 2010

Newest version of Mail.dll email client includes a easy to use template engine.

It allows you to easily create html template for your emails:

Loading and rendering such template requires one line of code:

// C# version

Contact contact = ...;

 string html = Template
     .FromFile("template.txt")
     .DataFrom(contact)
     .Render();
' VB.NET version

Dim contact As Contact = ....

Dim html As String = Template _
     .FromFile("template.txt") _
     .DataFrom(contact) _
     .Render()

This is how the template looks like:

<html>
<head>
    <title>Your order</title>
</head>
<body>
	Hi [FirstName] [LastName],
	<br />
	<p>
	Your account [if Verified]has[else]<strong>has not</strong>[end] been verified. <br/>
	Your password is: [Password].
	</p>
	<p>
	Here are your orders:
	</p>
	[foreach Orders]
		<p>
		Order sent to <strong>[Street]</strong>:
		</p>
		<table style="width: 30%;">
			[foreach Items]
				<tr style="background-color: #E0ECFF;">
					<td>[Name]</td><td>[Price]</td>
				</tr>
			[end]
		</table>
	[end]
	<p>
		Thank you for your orders.
	<p>
</body>
</html>

Here’s the sample code that loads, fills the template and sends it using Mail.dll:

// C# version

Mail.Html(Template
              .FromFile("template.txt")
              .DataFrom(_contact)
              .Render())
    .Text("This is text version of the message.")
    .From(new MailBox("alice@mail.com", "Alice"))
    .To(new MailBox("bob@mail.com", "Bob"))
    .Subject("Your order")
    .UsingNewSmtp()
    .WithCredentials("alice@example.org", "password")
    .Server("smtp.example.org")
    .WithSSL()
    .Send();
' VB.NET version

Mail.Html(Template _
               .FromFile("template.txt") _
               .DataFrom(_contact) _
               .Render()) _
     .Text("This is text version of the message.") _
     .From(New MailBox("alice@mail.com", "Alice")) _
     .[To](New MailBox("bob@mail.com", "Bob")) _
     .Subject("Your order") _
     .UsingNewSmtp() _
     .WithCredentials("alice@example.org", "password") _
     .Server("smtp.example.org") _
     .WithSSL() _
     .Send()

And this is how the data, used by template, look like:

// C# version

public class Contact
{
    public List<Order> Orders { get; private set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Verified;
    private string Password { get; set; }

    public Contact()
    {
        Orders = new List<Order>();
    }
} ;
' VB.NET version

Public Class Contact
	Public Property Orders() As List(Of Order)
		Get
			Return m_Orders
		End Get
		Private Set
			m_Orders = Value
		End Set
	End Property
	Private m_Orders As List(Of Order)

	Public Property FirstName() As String
		Get
			Return m_FirstName
		End Get
		Set
			m_FirstName = Value
		End Set
	End Property
	Private m_FirstName As String
	Public Property LastName() As String
		Get
			Return m_LastName
		End Get
		Set
			m_LastName = Value
		End Set
	End Property
	Private m_LastName As String
	Public Verified As Boolean
	Private Property Password() As String
		Get
			Return m_Password
		End Get
		Set
			m_Password = Value
		End Set
	End Property
	Private m_Password As String

	Public Sub New()
		Orders = New List(Of Order)()
	End Sub
End Class