使用Gmail发送电子邮件会导致超时错误

我们正在测试一些代码,使用Gmail从表单发送电子邮件,但发现超时错误。

你能告诉我们这个代码中缺少什么来获得发送的电子邮件吗?

    Try
        Dim SmtpServer As New SmtpClient()
        Dim mail As New MailMessage()

        SmtpServer.EnableSsl = True
        SmtpServer.Credentials = New Net.NetworkCredential("[email protected]", "MyPasswordGoesHere")
        SmtpServer.Port = 465
        SmtpServer.Host = "smtp.gmail.com"

        mail.From = New MailAddress("[email protected]")
        mail.To.Add("[email protected]")
        mail.Subject = "Test Mail"
        mail.Body = "This is for testing SMTP mail from GMAIL"

        SmtpServer.Send(mail)

        MsgBox("mail sent")

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try

更新: 使用MailBee更改代码。这就是我们向所有客户发送电子邮件的方式:

    Dim strSqlStatement As String = "Select CustomerName, Email " & _
                               "From Customers " & _
                              "Where Email Is Not Null"
    If IsConnected() Then

        ' Set up the sql command and lookup the parent.
        '----------------------------------------------
        Using objSqlCommand As SqlCommand = New SqlCommand(strSqlStatement, ObjConnection)

            With objSqlCommand

                ' Open the SqlConnection before executing the query.
                '---------------------------------------------------
                Cursor = Cursors.WaitCursor

                ObjConnection.Open()

                Dim objDataReader As SqlDataReader = .ExecuteReader()

                ' Go through all the customers and send out the promotion emails.
                '----------------------------------------------------------------
                If objDataReader.HasRows Then

                    MailBee.Global.LicenseKey = "My license key goes here."

                    Dim objSMTP As New Smtp
                    Dim server As New SmtpServer(TextBoxSMTPServer.Text, TextBoxUserName.Text, TextBoxPassword.Text)

                    'SmtpServer.Host = TextBoxSMTPServer.Text
                    'SmtpServer.Port = TextBoxPort.Text
                    'SmtpServer.Timeout = 100

                    'If TextBoxUseSSL.Text = "Yes" Then
                    '    SmtpServer.EnableSsl = True
                    'Else
                    '    SmtpServer.EnableSsl = False
                    'End If

                    'If TextBoxUseDefaultCredentials.Text = "Yes" Then
                    '    SmtpServer.UseDefaultCredentials = True
                    'Else
                    '    SmtpServer.UseDefaultCredentials = False
                    'End If

                    'SmtpServer.Credentials = New Net.NetworkCredential(TextBoxUserName.Text, TextBoxPassword.Text)


                    objSMTP.SmtpServers.Clear()
                    objSMTP.SmtpServers.Add(server)

                    While objDataReader.Read()
                        If objDataReader("Email").ToString <> "" Then

                            objSMTP.Message.From.AsString = TextBoxEmailFrom.Text
                            objSMTP.Message.To.AsString = objDataReader("Email").ToString
                            objSMTP.Message.Subject = "Promotion: " & TextBoxID.Text
                            objSMTP.Message.BodyPlainText = "Dear " & objDataReader("CustomerName") & "," & vbCrLf & vbCrLf & TextBoxPromotionBodyText.Text

                            Try
                                objSMTP.Send()

                            Catch exBadPassword As MailBeeSmtpLoginBadCredentialsException
                                MsgBox("The login name or password is not correct.", MsgBoxStyle.Exclamation, "Email")
                                blnThereWereErrors = True

                            Catch exBadFromAddress As MailBeeSmtpRefusedSenderException
                                MsgBox("The sender email must be the same as the user's email address.", MsgBoxStyle.Exclamation, "Email")
                                blnThereWereErrors = True

                            Catch ex As Exception
                                MsgBox(ex.Message)
                                blnThereWereErrors = True
                            End Try
                        End If

                        If blnThereWereErrors Then
                            Exit While
                        End If
                    End While

                    If blnThereWereErrors = False Then
                        MessageBox.Show("Mass emailing has completed." & vbCrLf, _
                                "Email Message.", _
                                MessageBoxButtons.OK, _
                                MessageBoxIcon.Information)
                    End If
                End If

                objDataReader.Close()
                ObjConnection.Close()

                Cursor = Cursors.Default
            End With ' objSqlCommand
        End Using ' objSqlCommand
11
额外 编辑
意见: 1
谢谢回复。我尝试过,但仍然超时。
额外 作者 Emad-ud-deen,
感谢kcbeard的回复。我试图在telnet smtp.gmail.com 465,它似乎卡住显示:连接到smtp.gmail.com ...只是显示一个闪烁的光标,然后它sais:连接到主机丢失。我能够连接到towel.blinkenlights.nl并且工作。不确定为什么gmail有问题。我始终在电子邮件客户端软件中使用Gmail,没有任何问题。是否有我可以在我的表单中使用的开放源代码控件?
额外 作者 Emad-ud-deen,
我能够通过使用另一个电子邮件服务器来工作。不确定为什么Gmail有问题。
额外 作者 Emad-ud-deen,
我正在使用Mac上运行Windows7的Parallels虚拟机。我使用bluebottle.com作为完美的电子邮件服务器。至少我知道代码的作品。
额外 作者 Emad-ud-deen,
我们尝试使用MailBee,所有电子邮件问题都消失了。不知道为什么,但我认为它通过端口号循环,找到最好的使用。我正在更新帖子中的代码以显示正在使用的MailBee。
额外 作者 Emad-ud-deen,
代码看起来不错。也许这是一个UAC问题?
额外 作者 Keith Beard,
事实上,尝试通过命令行连接telnet smtp.gmail.com 465,如果您可以连接,则尝试设置UseDefaultCredentials = False
额外 作者 Keith Beard,
我猜测它可能不是Google,这很奇怪。你工作的环境是什么样的。你们有防火墙还是某种硬墙?
额外 作者 Keith Beard,

2 答案

尝试使用不同的端口号。您不能使用带有 System.Net.Mail 的端口465,因为它只支持“显式SSL”。查看此页面获取更多信息。

通过VB.NET发送邮件时,Gmail将接受端口25或587,但使用端口465超时。

Also make sure you have UseDefaultCredentials = False

另请参阅此示例,了解如何使用C#中的GMail发送邮件它可能会给你更多的线索。

14
额外
谢谢您的帮助。 :-)
额外 作者 Emad-ud-deen,
是的,我使用端口465时遇到了同样的问题。我使用587修复了它
额外 作者 Yohannis,

我有类似的问题,在我的情况下,我忘了指定协议,所以而不是 smtp.gmail.com 我必须把 ssl://smtp.gmail.com

1
额外