【发布时间】: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