Archive for the ‘Mail.dll’ Category

Aruba.it (@custom-domain.ext) settings

Tuesday, October 27th, 2020

For @aruba.it and @technet.it mailbox formats go here:
@aruba.it and @technet.it IMAP, POP3, SMTP settings

POP3

Server: pop3s.aruba.it
SSL: true-implicit
Port: 995 (default)
User :  email address (e.g.: name@aruba.it or name@technet.en)

using (Pop3 client = new Pop3())
{
    client.ConnectSSL("pop3s.aruba.it");
    client.UseBestLogin("user@custom-domain.ext", "password");

    // ...

    client.Close();
}

Next step: receive emails using POP3.

IMAP

Server:  imaps.aruba.it
SSL: true-implicit
Port: 993 (default)
User: email address (e.g.: name@aruba.it or name@technet.en)

using (Imap client = new Imap())
{
    client.ConnectSSL("imaps.aruba.it");
    client.UseBestLogin("user@custom-domain.ext", "password");

    // ...

    client.Close();
}


Next step: receive unseen using IMAP.

SMTP

Server:  smtps.aruba.it
SSL: true-implicit
Port:  465 (default)
User: email address (e.g.: name@aruba.it or name@technet.en)

using (Smtp client = new Smtp())
{
    client.ConnectSSL("smtps.aruba.it");
    client.UseBestLogin("user@custom-domain.ext", "password");

    // ...

    client.Close();
}


OAuth 2.0 with Office365/Exchange IMAP/POP3/SMTP

Tuesday, June 23rd, 2020

First you need to register your application in Azure Portal.

Here’s a detailed guide how to do that:
https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app

Remember to add authentication entries (localhost is needed for .net core):

Then you need to apply correct API permissions and grant the admin consent for your domain.

In the API permissions / Add a permission wizard, select Microsoft Graph and then Delegated permissions to find the following permission scopes listed:

  • offline_access
  • email
  • IMAP.AccessAsUser.All
  • POP.AccessAsUser.All
  • SMTP.Send

Remember to grant admin consent.

Use Microsoft Authentication Library for .NET (MSAL.NET) nuget package to obtain an access token:

https://www.nuget.org/packages/Microsoft.Identity.Client/

var pcaOptions = new PublicClientApplicationOptions
{
    ClientId = "Application (client) ID",

    TenantId = "Directory (tenant) ID",
    // -or-
    // for @outlook.com/@hotmail accounts instead of setting TenantId use:
    // AadAuthorityAudience = AadAuthorityAudience.PersonalMicrosoftAccount, 

    RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient"
    // RedirectUri = "http://localhost" // for .net core
};

var pca = PublicClientApplicationBuilder
    .CreateWithApplicationOptions(pcaOptions)
    .Build();

var scopes = new string[] 
{
    "offline_access",
    "email",
    "https://outlook.office.com/IMAP.AccessAsUser.All",
    "https://outlook.office.com/POP.AccessAsUser.All",
    "https://outlook.office.com/SMTP.Send",
};

In addition, you can request for offline_access scope. When a user approves the offline_access scope, your app can receive refresh tokens from the Microsoft identity platform token endpoint. Refresh tokens are long-lived. Your app can get new access tokens as older ones expire.

Now acquire the access token and user email address:

var authResult = pca.AcquireTokenInteractive(scopes).ExecuteAsync().Result;

string user = authResult.Account.Username;
string accessToken = authResult.AccessToken;

Finally you can connect to IMAP/POP3/SMTP server and authenticate:

using (Imap client = new Imap())
{
    client.ConnectSSL("outlook.office365.com");
    client.LoginOAUTH2(user, accessToken);
 
    client.SelectInbox();

    // ...

    client.Close();
} 

As this is fairly new feature for Exchange/Office365, here are some useful links:

https://docs.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth

https://stackoverflow.com/questions/29747477/imap-auth-in-office-365-using-oauth2

https://stackoverflow.com/questions/43473858/connect-to-outlook-office-365-imap-using-oauth2

https://stackoverflow.com/questions/61597263/office-365-xoauth2-for-imap-and-smtp-authentication-fails

Helpful POP3 and IMAP Exchange 2016 links

Wednesday, January 8th, 2020

Here is the list of some helpful links regarding IMAP and POP3 protocols in Exchange 2016:

Enable IMAP4 in Exchange 2016

Enable POP3 in Exchange 2016

POP3 and IMAP4

Public folders in Exchange 2016
Public folders and IMAP

Shared mailboxes in Exchange 2016
Accessing shared and delegated mailboxes

Using App Passwords with Gmail

Friday, October 18th, 2019

Go to your Google Account and on the left navigation panel, choose Security.

On the “Signing in to Google” panel, make sure I that 2-Step Verification is turned on and choose App Passwords. …

Select device and choose the device you’re using. Choose Generate.

Copy the generated password:

Log in to your IMAP, SMTP, POP3 account using your email and the generated password (instead of your email’s password):

Remember – no spaces!

C# code:

using (Imap client = new Imap()) 
{ 
    client.ConnectSSL("imap.gmail.com"); 
    client.UseBestLogin("XXXXX@gmail.com", "kvrcdzlicajaupje"); 

    // ... 

    client.Close(); 
}

VB.NET code:

Using imap As New Imap 
    imap.ConnectSSL("imap.gmail.com") 
    imap.UseBestLogin("XXXXX@gmail.com", "kvrcdzlicajaupje") 

    ' ... 

    imap.Close() 
End Using

Sending Apple Watch specific content

Tuesday, July 2nd, 2019

There are two main content types used in all HTML emails: text/plain and text/html MIME types.

You should always include a plain text version of your email that closely matches to the HTML version of your email. Mail.dll will generate (extract) plain text automatically, if you provide HTML text only.

Usually Apple watch displays only the plain text part of your email. In most cases it considers the HTML too complicated (e.g. external images are referenced), so it shows the plain text version instead.

External image is an image that isn’t embedded in the email, using cid: protocol, but loaded from a remote HTTP server using a standard <img src=’…’ /> tag.

You can use ‘text/watch-html’ type to send a limited HTML version of your message to Apple Watch users, resulting in rich text-like messages on Apple Watch devices.

Here’s how to create and add such MIME entity using Mail.dll:

MailBuilder builder = new MailBuilder();
builder.Subject = "Apple Watch Example";
builder.From.Add(new MailBox("alice@example.com"));
builder.To.Add(new MailBox("bob@example.com"));

builder.Html = "This is <strong>HTML<strong> text.";
builder.Text = "Plain text.";

MimeText appleWatchText = new MimeFactory().CreateMimeText();
appleWatchText.ContentType = ContentType.Parse("text/watch-html");
appleWatchText.Text = "This is <strong>Watch HTML<strong> text.";

builder.Alternatives.Add(appleWatchText);

IMail mail = builder.Create();

Please have in mind that apple watch supports limited version of HTML only.

Using the above code will create an email with following content:

Content-Type: multipart/alternative;
 boundary="----=_NextPart_19511516.440335455040"
MIME-Version: 1.0
Date: Tue, 02 Jul 2019 15:38:53 +0200
Message-ID: <d65fcc07-c988-48e1-a466-166e18998d02@mail.dll>
Subject: Apple Watch Example
From: <alice@example.com>
To: <bob@example.com>

------=_NextPart_19511516.440335455040
Content-Type: text/plain;
 charset="utf-8"
Content-Transfer-Encoding: 7bit

Plain text.
------=_NextPart_19511516.440335455040
Content-Type: text/html;
 charset="utf-8"
Content-Transfer-Encoding: 7bit

This is <strong>HTML<strong> text.
------=_NextPart_19511516.440335455040
Content-Type: text/watch-html;
 charset="utf-8"
Content-Transfer-Encoding: 7bit

This is <strong>Watch HTML<strong> text.
------=_NextPart_19511516.440335455040--

Entire sample, including sending process:

MailBuilder builder = new MailBuilder();
builder.Subject = "Apple Watch Example";
builder.From.Add(new MailBox("alice@example.com"));
builder.To.Add(new MailBox("bob@example.com"));

builder.Text = "Plain text";
builder.Html = "This is <strong>HTML<strong> text.";

MimeText appleWatchText = new MimeFactory().CreateMimeText();
appleWatchText.ContentType = ContentType.Parse("text/watch-html");
appleWatchText.Text = "This is <strong>Watch HTML<strong> text.";

builder.Alternatives.Add(appleWatchText);

IMail mail = builder.Create();

// Send the message
using (Smtp smtp = new Smtp())
{
    smtp.Connect("server.example.com");   // or ConnectSSL for SSL
    smtp.UseBestLogin("user", "password"); // remove if not needed

    smtp.SendMessage(mail);

    smtp.Close();
}