3

我必须遵循代码:

Try
    Dim mail As New MailMessage()
    Dim SmtpServer As New SmtpClient("smtp.gmail.com")
    mail.From = New MailAddress(txtid.Text)
    mail.[To].Add(TextBox1.Text)
    mail.Subject = txtsub.Text
    mail.Body = txtmess.Text
    ' mail.Attachments.Add(New Attachment(OpenFileDialog1.FileName))
    SmtpServer.Port = 587
    SmtpServer.Credentials = New System.Net.NetworkCredential(txtid.Text, txtpass.Text)
    SmtpServer.EnableSsl = True

    SmtpServer.Send(mail)
    MsgBox("E-mail Has Been Send Successfully !")
Catch ex As Exception
    MsgBox(ex.Message)
End Try

在台阶上

SmtpServer.Send(mail)

我总是收到错误消息:发送邮件失败

知道如何解决吗?

请注意,我使用的是 VB.NET

4

3 回答 3

2

尝试在端口 465(使用 SSL)和端口 587(使用 TLS)上配置您的 SMTP 服务器,这对我有用。

于 2013-09-13T19:55:50.687 回答
1

由于您收到的是SmtpException,因此SmtpClient.Send 方法 (MailMessage)文档指出以下原因可能是原因:

  • 与 SMTP 服务器的连接失败。
  • 身份验证失败。
  • 操作超时。
  • EnableSsl设置为true,但DeliveryMethod属性设置为SpecifiedPickupDirectoryPickupDirectoryFromIis
  • EnableSsl设置为true,但 SMTP 邮件服务器未在对 EHLO 命令的响应中通告 STARTTLS。

我将使用Trim()您的用户名和密码文本值来删除任何潜在的前导或尾随空格,如下所示:

SmtpServer.Credentials = New System.Net.NetworkCredential(txtid.Text.Trim(), 
                                                          txtpass.Text,Trim())

我还建议强制DeliveryMethod使用 SMTP 服务器,如下所示:

SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network
于 2013-09-13T13:51:19.713 回答
0

我自己的实验表明.NET 的 SmtpClient 类实际上并不支持 SMTP over SSL (SMTPS)。切换客户端对象上的 .EnableSsl 标志将导致客户端使用 STARTTLS。

这并不奇怪,因为 SMTPS 已被 STARTTLS 弃用,原因有很多,其中大部分与新旧客户端和服务器之间的无缝互操作性有关。

SMTPS:客户端打开与目标服务器的 TCP 连接。两者立即开始 SSL 握手,然后使用常规 SMTP 协议(​​EHLO、AUTH 等)通过该 SSL 隧道进行通信。

STARTTLS:客户端打开与目标服务器的 TCP 连接。客户端发出 EHLO,然后发出 STARTTLS。这是使用纯文本完成的。STARTTLS 命令提示客户端和服务器在已经打开的套接字上启动 SSL 握手。所有未来的通信(AUTH 命令及以后)都是通过现在建立的 SSL 隧道完成的。

当 SmtpClient 对象连接到需要 SMTPS 的服务器时,这会出现问题。客户端将在打开其套接字后发送 EHLO,而不是立即启动 SSL 握手,这将导致服务器认为 SSL 握手失败并且连接将停止或终止。客户端将超时,您将收到 SmtpException。

任何侦听端口 465 的 SMTP 服务器都可能期待 SMTPS。SMTPS 有自己的专用端口,并且不能选择性地支持 STARTTLS,因为根据定义,STARTTLS 要求服务器在使用 SSL 之前接受并响应打开的 EHLO 和 STARTTLS 命令。

但是,如果服务器软件支持它并且服务管理员选择启用它,那么传统端口(如 587 或 25)上的 SMTP 服务器可以选择支持 STARTTLS。这就是为什么在 Internet 上发布有关此问题的许多人指出,他们能够通过将端口从 465 更改为 587 来使 SmtpClient 工作。


简短版本: SmtpClient 类支持 STARTTLS 而不是 SMTP over SSL (SMTPS)。如果您想在客户端对象上使用 .EnableSsl 标志,请确保您连接的服务器和端口支持 STARTTLS。如果服务器和端口正在侦听并期待真正的 SMTPS,则客户端对象将无法成功连接并且发送将失败。端口 465 几乎专门用于 SMTPS。当 STARTTLS 可用(可选)时,端口 25 和 587 用于常规 SMTP 或带 STARTTLS 支持的 SMTP。

于 2014-02-06T18:11:46.873 回答