【问题标题】:Send mail with VB.Net用 VB.Net 发送邮件
【发布时间】:2018-05-13 00:01:39
【问题描述】:

我有一个类似看门狗的程序,如果满足某些条件,它应该向我自己的邮件地址发送邮件。

我有一个 gmail 帐户,所以基本上我想从我自己的 gmail 地址向同一个地址发送邮件。

这是我正在使用的代码。

Public Sub MyContactByMail(ByVal Username As String, ByVal Password As String, ByVal SmtpServerPort As Integer, ByVal SmtpServerHost As String, ByVal MailFrom As String, ByVal MailTo As String, ByVal MailSubject As String, ByVal MailText As String)

    Try
        Dim SmtpServer As New SmtpClient()
        Dim mail As New MailMessage()
        SmtpServer.Credentials = New Net.NetworkCredential(Username, Password)
        SmtpServer.Port = SmtpServerPort
        SmtpServer.Host = SmtpServerHost
        mail = New MailMessage()
        mail.From = New MailAddress(MailFrom)
        mail.To.Add(MailTo)
        mail.Subject = MailSubject
        mail.Body = MailText
        SmtpServer.Send(mail)
    Catch ex As Exception
        Console.ForegroundColor = ConsoleColor.Red
        Console.WriteLine("Class -> ClassStorage, Method -> MyContactByMail, Error -> " & ex.Message)
    End Try
End Sub



Username... My own e-mail address (gmail)
Password... My password for the gmail account
SmtpServerPort... 465
SmtpServerHost... smtp.gmail.com
MailFrom... My own e-mail address (gmail)
MailTo... My own e-mail address (gmail)
MailSubject... some Text
MailText... some Text

我从来没有尝试过用这种方式发送邮件,所以整个话题对我来说都很新鲜。

我发现这个页面很有帮助:

https://support.google.com/a/answer/176600?hl=en

我尝试了以下方法:

a)Gmail SMTP 服务器

smtp.gmail.com + port 465

这是与paping的连接测试:

看来我可以连接到这个地址+端口。

但是 VB 还是会抛出异常。

这意味着,无法从连接中读取数据。

  • InnerException {"Von der Übertragungsverbindung können keine Daten gelesen werden: net_io_connectionclosed."} System.Exception

    smtp.gmail.com + 端口 587

再次用paping测试连接

这是VB程序的例外。

  • InnerException {"Die Verbindung mit dem Remoteserver kann nicht hergestellt werden."} System.Exception

b)受限制的 Gmail SMTP 服务器

aspmx.l.google.com + port 25

我尝试使用 paping 连接到端口,但显然无法连接到它。然而,防火墙被配置为让 paping 为所欲为。

这是VB程序的例外:

它说,无法建立与远程计算机的连接...这与使用 paping 的结果几乎相同。

  • InnerException {"Die Verbindung mit dem Remoteserver kann nicht hergestellt werden."} System.Exception

目前我没有 G-Suit 帐户 - 我不明白是否必须拥有 g-suite 帐户才能完成这项工作。也许这就是问题所在。

如果可能的话,我会尽量避免为此付费。


到目前为止,我已经使用了这个教程:http://vb.net-informations.com/communications/vb.net_smtp_mail.htm


好像我有两个问题:

a) 我的开发机器上的连接问题 - 这是一台公司笔记本电脑,我无法完全控制防火墙,所以我猜有一些默认设置会否决我的设置并使端​​口 587 无法工作。

我尝试在私人笔记本电脑上连接Paping,它成功了。

b) 现在在私人笔记本电脑上,我收到了不同的错误消息:

这意味着:对于 SMTP 服务器来说,需要一个安全的连接,或者客户端没有经过身份验证。服务器的答案是:5.5.1 需要身份验证

这是我正在使用的当前代码:

Public Sub MyContactByMail(ByVal Username As String, ByVal Password As String, ByVal SmtpServerPort As Integer, ByVal SmtpServerHost As String, ByVal MailFrom As String, ByVal MailTo As String, ByVal MailSubject As String, ByVal MailText As String)

Try
    Dim SmtpServer As New SmtpClient()
    Dim mail As New MailMessage()
    SmtpServer.Credentials = New Net.NetworkCredential(Username, Password)
    SmtpServer.Port = SmtpServerPort
    SmtpServer.Host = SmtpServerHost
    SmtpServer.EnableSsl = True
    SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network
    SmtpServer.UseDefaultCredentials = False
    mail = New MailMessage()
    mail.From = New MailAddress(MailFrom)
    mail.To.Add(MailTo)
    mail.Subject = MailSubject
    mail.Body = MailText
    SmtpServer.Send(mail)
Catch ex As Exception
    Console.ForegroundColor = ConsoleColor.Red
    Console.WriteLine("Class -> ClassProcessingError, Method -> MyContactByMail, Error -> " & ex.Message)
End Try

结束子


我确实检查了我的 google 帐户中的设置,以允许使用不太安全的应用程序。 有趣的是,默认设置是允许不太安全的应用程序。

所以这个设置没有任何帮助。

我也将密码更改为强密码... 这也没有改变任何东西。

我仍然收到相同的身份验证错误消息。

有一个部分包含上次使用的设备...

有趣的是,VB.Net 应用程序甚至没有出现在那里..

它只显示浏览器连接到我的帐户的尝试。

氪,

安德烈亚斯

【问题讨论】:

  • 这个例子你学了吗? stackoverflow.com/a/32336/3424212 代码在 C# 中,但您可以了解整个想法。我看到缺少的是:SmtpServer.EnableSsl = true SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network. SmtpServer.UseDefaultCredentials = false
  • 似乎是您这边的连接问题。试过paping smtp.gmail.com -p 587 -c 4。结果:Connected to 74.125.206.109: time=29.00ms protocol=TCP port=587
  • 我已经相应地修改了我的代码,但我仍然遇到连接问题,当我使用端口 587...
  • @Andreas 你看到我的评论了吗?如果基本上存在连接问题,代码为什么要工作?
  • 是的,我确实有连接问题。我刚刚在另一台计算机上尝试了代码,我已经连接到端口 587

标签: .net vb.net email


【解决方案1】:

这可以正常工作

Try
    Dim SmtpServer As New SmtpClient()
    Dim mail As New MailMessage()
    SmtpServer.UseDefaultCredentials = False
    SmtpServer.Credentials = New Net.NetworkCredential(Username, Password)
    SmtpServer.Port = SmtpServerPort
    SmtpServer.Host = SmtpServerHost
    SmtpServer.EnableSsl = True
    SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network
    mail = New MailMessage()
    mail.From = New MailAddress(MailFrom)
    mail.To.Add(MailTo)
    mail.Subject = MailSubject
    mail.Body = MailText
    SmtpServer.Send(mail)
Catch ex As Exception
    Console.ForegroundColor = ConsoleColor.Red
    Console.WriteLine("Class -> ClassProcessingError, Method -> MyContactByMail, Error -> " & ex.Message)
End Try

【讨论】:

  • 您需要哪个 Windows? Windows 10 Pro 或 Windows Server(例如 2019)?
【解决方案2】:

答案 #1(无法连接到远程服务器)

看起来你需要添加这个(特别是第 1 行)。按指定顺序使用以下所有行:

SmtpServer.EnableSsl = true
SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network
SmtpServer.UseDefaultCredentials = false
SmtpServer.Credentials = new NetworkCredential(fromAddress.Address, fromPassword)

quote this answer below:

另外两个端口有加密; 587 使用 TLS,465 使用 SSL。

要使用 587,您应该设置 SmtpClient.EnableSsl = true。

465 不能与 SmtpClient 一起使用,它将与不推荐使用的类一起使用 改为 SmtpMail。


以下错误的答案 #2(5.5.1 需要身份验证):

SMTP 服务器需要安全连接,或者客户端没有 认证。服务器响应为:5.5.1 Authentication Required。

您需要允许您的 Google 帐户使用其他设备/应用程序发送电子邮件。 See Google Account Security:

在“安全性较低的应用程序的访问权限”部分下,您可以启用访问权限 从其他设备/应用程序到您的帐户...例如您的 C# 应用。

【讨论】:

  • 我已经编辑了我的原始消息。好像我有两个问题..我公司笔记本电脑上的连接和 b 另一台计算机上的身份验证问题。我想如果身份验证问题得到解决,它应该终于可以工作了。
  • 没有帮助,安全性较低的应用程序的访问权限被默认激活 - 这是我没想到的。
  • 在我的情况下它被禁用,因为在你的情况下已启用,这很好!很高兴看到现在一切正常!
【解决方案3】:

这段代码终于为我工作了:

在设置网络凭据之前,我必须设置 SmtpServer.UseDefaultCredentials = False。

这确实是一个愚蠢的问题 :-) 但是我很高兴它现在正在工作。

感谢大家的帮助 - 链接帮了很多忙。

Public Sub MyContactByMail(ByVal Username As String, ByVal Password As String, ByVal SmtpServerPort As Integer, ByVal SmtpServerHost As String, ByVal MailFrom As String, ByVal MailTo As String, ByVal MailSubject As String, ByVal MailText As String)

    Try
        Dim SmtpServer As New SmtpClient()
        Dim mail As New MailMessage()
        SmtpServer.UseDefaultCredentials = False
        SmtpServer.Credentials = New Net.NetworkCredential(Username, Password)
        SmtpServer.Port = SmtpServerPort
        SmtpServer.Host = SmtpServerHost
        SmtpServer.EnableSsl = True
        SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network
        mail = New MailMessage()
        mail.From = New MailAddress(MailFrom)
        mail.To.Add(MailTo)
        mail.Subject = MailSubject
        mail.Body = MailText
        SmtpServer.Send(mail)
    Catch ex As Exception
        Console.ForegroundColor = ConsoleColor.Red
        Console.WriteLine("Class -> ClassProcessingError, Method -> MyContactByMail, Error -> " & ex.Message)
    End Try
End Sub

【讨论】:

  • 我在第一个回答中说过。你有没有看到?我将编辑我的答案以显示用户凭据需要去哪里。
  • 编辑了我的答案。你能告诉我那里是否有你需要的一切吗?
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
相关资源
最近更新 更多