Uploading emails using IMAP

Uploading emails to the IMAP server is fairly easy with Mail.dll IMAP client

First we’ll use Mail.dll to upload an existing email in eml format to the IMAP server:

// C# code

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

    string eml = File.ReadAllText("email.eml", Encoding.GetEncoding(1252));

    // The name of the folder depends on your IMAP server
    imap.UploadMessage("[Gmail]/Sent Mail", eml);

    imap.Close();
}
' VB.NET code

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

	Dim eml As String = File.ReadAllText("email.eml", Encoding.GetEncoding(1252))

	' The name of the folder depends on your IMAP server
	imap.UploadMessage("[Gmail]/Sent Mail", eml)

	imap.Close()
End Using

Second sample shows how to create new email message and upload it to IMAP server.

// C# code

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

    // Create new mail message
    MailBuilder builder = new MailBuilder();
    builder.Subject = "subject";
    builder.From.Add(new MailBox("alice@email.com", "Alice"));
    builder.To.Add(new MailBox("bob@email.com", "Bob"));
    builder.Text = "This is plain text email";

    // Upload
    // The name of the folder depends on your IMAP server
    imap.UploadMessage("[Gmail]/Sent Mail", builder.Create());

    imap.Close();
}
' VB.NET code

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

	' Create new mail message
	Dim builder As New MailBuilder()
	builder.Subject = "subject"
	builder.From.Add(New MailBox("alice@email.com", "Alice"))
	builder.[To].Add(New MailBox("bob@email.com", "Bob"))
	builder.Text = "This is plain text email"

	' Upload
	' The name of the folder depends on your IMAP server
	imap.UploadMessage("[Gmail]/Sent Mail", builder.Create())

	imap.Close()
End Using

Please note that only few IMAP servers are going to send the message to the actual recipients. Most servers will only upload the message without sending it.
You should use SMTP protocol for this.
You can download Mail.dll IMAP client here.

Tags: , ,

8 Responses to “Uploading emails using IMAP”

  1. Roberto Says:

    Hello,
    I try to submit an email, through this method, with many attachments (total size approx. 19MB) and I jump an error: “Unable to write data to the transport connection: An error occurred during connection attempt because the connected party did not properly respond after a period of time, or failed to established connection and connected host has failed to respond. ”
    You know that it can be? The mail then you are on gmail.
    Thanks

  2. Limilabs support Says:

    @Roberto,
    1.
    Uploading message to IMAP server is a different thing than sending email.
    You should use SMTP server if you want to send an email.

    2.
    I don’t know how your code looks like, you might have simply reached Gmail’s 25MB message limit.
    (Typically, encoding makes the size of the files grow slightly 19 * 1,33 = 25,27)

    3.
    Could you please contact us directly, and provide a bit more info (code, stack trace, log)

    [Edit]
    In fact I was able to upload 10MB, 15MB, 18 MB and 19MB messages.
    With 19MB Gmail randomly disconnected without any error message.
    Seems it’s their bug.

  3. Daryl Says:

    Hello,
    vb.net 2010

    I want to upload an email using imap but mark it as unread

    imap.UploadMessage("Inbox", builder2.Create())
    

    works as described

    BUT

    Dim messageinfo As New Limilabs.Client.IMAP.UploadMessageInfo
    messageinfo.Flags.Add(Limilabs.Client.IMAP.Flag.Unseen)
    imap.UploadMessage("Inbox", builder2.Create(),messageinfo)
    

    gives the error:


    Expected more data request, but received: e9f70402ea13473e BAD APPEND

    Any help would be appreciated – thanks

  4. Limilabs support Says:

    @Daryl

    Most likely Unseen flag can not by used in this way by your IMAP server.

    Some server accepts negative flags in this context (hMailServer) others don’t (Gmail).

    Please simply remove messageinfo.Flags.Add(Limilabs.Client.IMAP.Flag.Unseen) line:

    Dim messageinfo As New Limilabs.Client.IMAP.UploadMessageInfo
    imap.UploadMessage(“Inbox”, builder2.Create(),messageinfo)
    

    It should work as expected.

  5. Michael Says:

    Hi,

    If I use Mail.dll Smtp to send email (using fluent interface or not) and want a “copy” of the message placed in the online mail client (e.g. Gmail) sent mail folder, is it safe to use Imap.UploadMessage for this, or do I risk the message being sent twice? Once by using Smtp and once when uploading the message like this (where some Imap servers apparently decide to also send the message).

    Thanks,
    Michael

  6. Limilabs support Says:

    @Michael,

    By default, uploading to ‘sent’ folder should not send the message. RFC3501 is very precise about this “The APPEND command is not used for message delivery, because it does not provide a mechanism to transfer [SMTP] envelope information.”

  7. Michael Says:

    Ok, I see. Thanks. I also found that sending through Gmails SMTP server did the “copying” to the sent messages folder automatically, so no problem there.

  8. Limilabs support Says:

    @Michael,

    You are right: when you send an email using Gmail’s SMTP server it automatically appears in “Sent Mail” folder.

Leave a Reply