在vb.net 2010中发送电子邮件时出错

时间:2013-09-13 13:39:43

标签: vb.net vb.net-2010

我必须遵循以下代码:

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

由于您收到SmtpExceptionSmtpClient.Send Method (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

答案 2 :(得分:0)

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

由于出于多种原因而不推荐使用STARTS支持STARTSLS,这并不奇怪,其中大多数原因与新老客户端和服务器之间的无缝互操作性有关。

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,如果服务器软件支持它,服务管理员选择启用它。这就是为什么互联网上发布此问题的许多人都注意到他们能够通过将端口从465更改为587来使SmtpClient工作。


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