1

我正在使用 MailSystem.NET 库来发送和接收电子邮件。一切正常,除了当用户名中有反斜杠时使用 SSL 的 Pop3Client 身份验证。

假设我有以下代码:

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);

输出是:

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

那么,到底是什么?当我尝试使用 johnnyboy@gmail.com 之类的用户名连接并验证例如谷歌时,它可以工作。但是,如果其中有反斜杠并且我反对 MS Exchange,则它不起作用。

凭据没问题,我使用 PegasusMail 仔细检查了它们。有人可以解释什么可能是错的吗?

4

1 回答 1

1

好的,答案很简单。

自 2003 年起,Exchange 不再支持过时的 SASL 机制 AUTH LOGIN。至少必须使用 AUTH PLAIN。但要做到这一点,必须重新设计整个身份验证。

在 AUTH PLAIN 之后,一个命令中应该有用户名和密码,其中 \000 字符作为前导和分隔符。因此,生成的命令应该是 base64 编码的字符串,例如:

\000username\000password

请参阅通过 Telnet 连接到 POP/SMTP 服务器

所以,我所做的很简单。我扩展了 Pop3Client 类并创建了一个没有 SaslMechanism 的新方法 Authenticate(string username, string password)。

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;
    }
}

现在,对于 Microsoft Exchange 服务器,我将调用此 Authenticate 方法而不是旧方法。

于 2014-07-24T16:29:26.940 回答