16

我正在尝试通过 SmtpClient 连接到 iCloud

我使用的设置如下:

服务器名称:smtp.mail.me.com
SSL 要求:是
如果您在使用 SSL 时看到错误消息,请尝试改用 TLS 或 STARTTLS。
端口:587
需要 SMTP 身份验证:是 - 使用相关的用户名和密码

如果我使用 SSL,我会得到“由于意外的数据包格式而导致握手失败”

如果我不使用 SSL,Visual Studio 调试器会挂起连接。

我认为问题在于我没有告诉 SmtpClient 使用 tls,但我找不到有关如何执行此操作的文档。

代码如下:

using (var client = new SmtpClient()) {
    client.Timeout = 1000 * 20;
    //client.Capabilities.
    client.AuthenticationMechanisms.Remove ("XOAUTH2");

    client.Connect("SMTP.mail.me.com", 587, false); //dies here
    //client.Connect(servername, port, useSsl);
    //can I set tls or starttls here??
    client.Authenticate(username, password);
    client.Send(FormatOptions.Default, message);
}

我可以手动设置 TLS 或 StartTLS。我尝试过的一件事是以下,但它似乎没有用

client.Connect(new Uri("smtp://" + servername + ":" + port + "/?starttls=true"));

感谢您对此的任何帮助。

4

4 回答 4

27

您使用的Connect()方法仅允许启用/禁用 SSL 包装的连接,这与 StartTLS 不同。

由于混乱,我实现了一个单独的Connect()方法,使这更明显的是发生了什么:

using (var client = new SmtpClient()) {
    // Note: don't set a timeout unless you REALLY know what you are doing.
    //client.Timeout = 1000 * 20;

    client.Connect ("smtp.mail.me.com", 587, SecureSocketOptions.StartTls);
    client.Authenticate (username, password);
    client.Send (message);
}

试试看。

于 2015-07-22T14:17:31.240 回答
4

您可以将选项设置为“SecureSocketOptions.Auto”,如下所示

await client.ConnectAsync(mailService.Host, mailService.Port,   SecureSocketOptions.Auto);

MailKit 将自动决定使用 SSL 或 TLS。

于 2016-08-11T14:21:11.133 回答
1

根据MailKit 文档

Connect(string host,int port,bool useSsl,CancellationToken cancellationToken = null)

useSsl 参数仅控制客户端是否进行 SSL 包装连接。也就是说,即使useSsl 参数为 false,如果邮件服务器支持 STARTTLS 扩展,仍然可以使用 SSL/TLS 。

于 2019-05-28T05:54:13.330 回答
0

这比前面提到的 SecureSocketOptions.Auto 选项对我有用:

    client.Connect(host, port, SecureSocketOptions.None);
于 2020-06-02T11:51:28.090 回答