Отправка электронной почты с помощью 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 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

Ответ 1

Попробуйте использовать другой номер порта. Вы не можете использовать порт 465 с System.Net.Mail, поскольку он поддерживает только "Явный SSL". Посмотрите эту страницу для получения дополнительной информации об этом.

Gmail принимает порт 25 или 587 при отправке почты через VB.NET, но время с использованием порта 465.

Также убедитесь, что у вас есть UseDefaultCredentials = False

Также посмотрите этот пример о том, как отправлять почту с помощью GMail на С#, это может дать вам еще несколько подсказок.

Ответ 2

У меня была аналогичная проблема, в моем случае я просто забыл указать протокол, поэтому вместо smtp.gmail.com мне пришлось поставить ssl://smtp.gmail.com.