JiKra
JiKra

Reputation: 1800

ActiveUp.Pop3Client Authenticate results to -ERR Protocol error. 14

I'm using MailSystem.NET library for sendting and recieving e-mails. Everything works fine except Pop3Client authentication using SSL when there is a backslash in the username.

Let's say that I have the following code:

var client = new Pop3Client();
var username = @"xxx\admin";
var password = @"passW0rd";
var host = @"abc.def.gh";
var port = 995;

var result = client.ConnectSsl(host, port, true);
Console.WriteLine(result);

result = client.Authenticate(username, password, SaslMechanism.Login);
Console.WriteLine(result);

And the output is:

+OK The Microsoft Exchange POP3 service is ready.
Command "auth login" failed : -ERR Protocol error. 14

So, what the heck? When I try to connect and authenticate e.g. to a google with username such a [email protected], it works. But if there is a backslash in it and I go against MS Exchange, it doesn't work.

The credentials are ok, I doublechecked them using PegasusMail. Can someone explain what could be wrong?

Upvotes: 1

Views: 1804

Answers (1)

JiKra
JiKra

Reputation: 1800

Ok, answer is simple.

Since 2003, Exchange does not support obsolete SASL mechanism AUTH LOGIN. There must be used at least AUTH PLAIN. But to do it, the whole authentication must be reworked.

After AUTH PLAIN there should be username and password in one command with \000 char as a leading and as a separator. So, the resulting command should be base64 encoded string like:

\000username\000password

see Connecting to POP/SMTP Server via Telnet

So, what I did was simple. I extended Pop3Client class and created a new method Authenticate(string username, string password) without SaslMechanism.

public class Pop3ClientExt : Pop3Client
{
    public string Authenticate(string username, string password)
    {
        var nullchar = '\u0000';
        var auth = nullchar + username + nullchar + password;

        this.Command("auth plain");
        string response = this.Command(System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("iso-8859-1").GetBytes(auth)));

        return response;
    }
}

And now, in case of Microsoft Exchange server, I'll call this Authenticate method instead of the old one.

Upvotes: 1

Related Questions