【问题标题】:Mailkit SMTP - StartTLS & TLS flagsMailkit SMTP - StartTLS 和 TLS 标志
【发布时间】:2015-10-11 16:52:21
【问题描述】:

我正在尝试通过 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"));

感谢您对此的任何帮助。

【问题讨论】:

  • 如果你说你需要SSL,你为什么要为useSSL标志传递false
  • @Rob 我尝试过使用 true,但由于数据包格式意外,握手失败。 iCloud 建议:“如果您在使用 SSL 时看到错误消息,请尝试改用 TLS 或 STARTTLS。”

标签: c# mailkit


【解决方案1】:

您使用的 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);
}

试试看。

【讨论】:

  • @jstedfast imap 客户端有时会挂起连接。直到windows服务被强制重启。有没有办法让它超时,让它自己重新启动
  • 取决于它挂在哪里。如果它在 socket.Connect() 调用中,那么没有。如果它在 socket.Connect() 之后读取问候语等的代码中,那么是的 - 设置 client.Timeout 值。
【解决方案2】:

您可以将选项设置为“SecureSocketOptions.Auto” 像这样的

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

MailKit 将自动决定使用 SSL 还是 TLS。

【讨论】:

  • 它用什么来决定?端口号?
  • 必须在模型中设置的端口号。它只是来自谷歌邮件或其他任何东西的端口号。所以我只是打电话给我的模型并从我的数据库中询问端口和主机......但这里重要的是“SecureSocketOptions.Auto”
  • @PaulKnopf 是的,MailKit 使用端口来决定。它不是世界上最好的系统,但它在 99% 的时间里都能正常工作。
【解决方案3】:

根据MailKit Doc

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

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

【讨论】:

    【解决方案4】:

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

        client.Connect(host, port, SecureSocketOptions.None);
    

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 2013-06-21
      • 2022-01-18
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 2013-08-21
      相关资源
      最近更新 更多