如何在 vb.net 中发送 gmail 电子邮件?
Posted
技术标签:
【中文标题】如何在 vb.net 中发送 gmail 电子邮件?【英文标题】:How do I send a gmail email in vb.net? 【发布时间】:2013-08-11 18:57:52 【问题描述】:我想发送一封电子邮件,但它给了我一个错误。
我有这个代码:
Sub sendMail(ByVal title As String, ByVal content As String)
Dim SmtpServer As New SmtpClient("smtp.gmail.com", 25)
SmtpServer.Credentials = New Net.NetworkCredential("name@gmail.com", "password")
Dim mail As New MailMessage("name@gmail.com", "name@gmail.com", title, content)
SmtpServer.Send(mail)
End Sub
我有一个 try catch 尝试调用此方法,但它不起作用,因此 catch 运行并出现异常:System.Net.Mail.SmtpException: The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first. b6sm3176487lae.0 - gsmtp
为什么会出现此错误?以及如何解决?
【问题讨论】:
【参考方案1】:Gmail 在端口 465 上使用 SMTP over SSL。
尝试做:
Dim SmtpServer As New SmtpClient("smtp.gmail.com", 465)
...
SmtpServer.EnableSsl = True
...
【讨论】:
是的,我认为是端口的问题,谢谢 好吧,我使用的端口是正确的,但它是我需要的 EnableSsl。【参考方案2】:试试这个 - 我知道它有效。
Dim Mail As New MailMessage
Dim SMTP As New SmtpClient("smtp.gmail.com")
Mail.Subject = "Security Update"
Mail.From = New MailAddress("name@gmail.com")
SMTP.Credentials = New System.Net.NetworkCredential("name@gmail.com", "password") '<-- Password Here
Mail.To.Add(address & "@gmail.com") 'I used ByVal here for address
Mail.Body = "" 'Message Here
SMTP.EnableSsl = True
SMTP.Port = "587"
SMTP.Send(Mail)
【讨论】:
要注意的是 SMTP 端口。我以为是 587,而不是 465 或 25。 那么应该是587还是465?【参考方案3】:谷歌账号有问题,需要关闭一些安全设置。一遍又一遍地发送电子邮件后,我在我的一个支持帐户(用于谷歌)上收到了电子邮件,电子邮件是:
You recently changed your security settings so that your Google Account [trdjoko@gmail.com] is no longer protected by modern security standards.
If you did not make this change
Please review your Account Activity page at https://security.google.com/settings/security/activity to see if anything looks suspicious. Whoever made the change knows your password; we recommend that you change it right away.
If you made this change
Please be aware that it is now easier for an attacker to break into your account. You can make your account safer again by undoing this change at https://www.google.com/settings/security/lesssecureapps then switching to apps made by Google such as Gmail to access your account.
Sincerely,
The Google Accounts team
所以我切换了额外的安全性并且我工作得很好。
【讨论】:
【参考方案4】:将端口更改为 587。端口 25 不支持 SSL。
【讨论】:
【参考方案5】:使用IFTTT 和我的IFTTT Maker.net libary 是一种超级简单的方法(无需更改任何安全设置)
首先,在 IFTTT 中创建一个由 Maker 频道触发的新配方,并将事件命名为“send_gmail”。
然后,选择 Gmail 引擎并点击“发送电子邮件”,将 To 替换为 value1,将主题替换为 value2,将消息/正文替换为 value3
之后,在 Visual Studio 中,将 ifttt.vb 添加到您的项目中。现在看代码:
Try
makechannel.scode = "your account ID"
makechannel.fireevent("send_gmail", "TO", "SUBJECT", "MESSAGE")
'code goes here if done
Catch ex As Exception
'code goes here if it fails
End Try
然后填写您的帐户 ID。您可以在 ifttt.com/maker 上找到它
就是这样!
【讨论】:
【参考方案6】:我已经编写了可以轻松执行此任务的类。
Imports System.Net.Mail
Public Class GGSMTP_GMAIL
Dim Temp_GmailAccount As String
Dim Temp_GmailPassword As String
Dim Temp_SMTPSERVER As String
Dim Temp_ServerPort As Int32
Dim Temp_ErrorText As String = ""
Dim Temp_EnableSSl As Boolean = True
Public ReadOnly Property ErrorText() As String
Get
Return Temp_ErrorText
End Get
End Property
Public Property EnableSSL() As Boolean
Get
Return Temp_EnableSSl
End Get
Set(ByVal value As Boolean)
Temp_EnableSSl = value
End Set
End Property
Public Property GmailAccount() As String
Get
Return Temp_GmailAccount
End Get
Set(ByVal value As String)
Temp_GmailAccount = value
End Set
End Property
Public Property GmailPassword() As String
Get
Return Temp_GmailPassword
End Get
Set(ByVal value As String)
Temp_GmailPassword = value
End Set
End Property
Public Property SMTPSERVER() As String
Get
Return Temp_SMTPSERVER
End Get
Set(ByVal value As String)
Temp_SMTPSERVER = value
End Set
End Property
Public Property ServerPort() As Int32
Get
Return Temp_ServerPort
End Get
Set(ByVal value As Int32)
Temp_ServerPort = value
End Set
End Property
Public Sub New(ByVal GmailAccount As String, ByVal GmailPassword As String, Optional ByVal SMTPSERVER As String = "smtp.gmail.com", Optional ByVal ServerPort As Int32 = 587, Optional ByVal EnableSSl As Boolean = True)
Temp_GmailAccount = GmailAccount
Temp_GmailPassword = GmailPassword
Temp_SMTPSERVER = SMTPSERVER
Temp_ServerPort = ServerPort
Temp_EnableSSl = EnableSSl
End Sub
Public Function SendMail(ByVal ToAddressies As String(), ByVal Subject As String, ByVal BodyText As String, Optional ByVal AttachedFiles As String() = Nothing) As Boolean
Temp_ErrorText = ""
Dim Mail As New MailMessage
Dim SMTP As New SmtpClient(Temp_SMTPSERVER)
Mail.Subject = Subject
Mail.From = New MailAddress(Temp_GmailAccount)
SMTP.Credentials = New System.Net.NetworkCredential(Temp_GmailAccount, Temp_GmailPassword) '<-- Password Here
Mail.To.Clear()
For i As Int16 = 0 To ToAddressies.Length - 1
Mail.To.Add(ToAddressies(i))
Next i
Mail.Body = BodyText
Mail.Attachments.Clear()
If AttachedFiles IsNot Nothing Then
For i As Int16 = 0 To AttachedFiles.Length - 1
Mail.Attachments.Add(New Attachment(AttachedFiles(i)))
Next
End If
SMTP.EnableSsl = Temp_EnableSSl
SMTP.Port = Temp_ServerPort
Try
SMTP.Send(Mail)
Return True
Catch ex As Exception
Me.Temp_ErrorText = ex.Message.ToString
Return False
End Try
End Function
End Class
它的方式,如何使用类:
Dim GGmail As New GGSMTP_GMAIL("MyFromAddress1@gmail.com", "AccPassword", )
Dim ToAddressies As String() = "ToAddress1@gmail.com", "ToAddress2@gmail.com"
Dim attachs() As String = "d:\temp_Excell226.xlsx", "d:\temp_Excell224.xlsx", "d:\temp_Excell225.xlsx"
Dim subject As String = "My TestSubject"
Dim body As String = "My text goes here ...."
Dim result As Boolean = GGmail.SendMail(ToAddressies, subject, body, attachs)
If result Then
MsgBox("mails sended successfully", MsgBoxStyle.Information)
Else
MsgBox(GGmail.ErrorText, MsgBoxStyle.Critical)
End If
希望这会有所帮助。好编码
【讨论】:
以上是关于如何在 vb.net 中发送 gmail 电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 Angular5 应用程序中发送带有附件的电子邮件(gmail)?
如何在 VB.NET 中自动获取 SMTP 详细信息,如在 Thunderbird 中
如何配置 WAMP (localhost) 以使用 Gmail 发送电子邮件?