Как я могу отправить электронное письмо с кодом VB. net? - PullRequest
1 голос
/ 28 января 2020

Я использую asp. net / vb. net. Я хочу отправить электронное письмо. Мой код не отправляет письмо как есть. Мне интересно, что я здесь делаю неправильно.

Я создал файл с именем email.text, который содержит шаблон электронной почты. Остальная часть кода для отправки электронного письма приведена ниже. Я удалил личную информацию из своего кода.

Я настроил SMTP-соединение следующим образом:

Private SMTPClientConnection As SmtpClient
Sub New()
    SMTPClientConnection = New SmtpClient
    SMTPClientConnection.Host = "HOSTHERE"
    SMTPClientConnection.Port = PORTHERE
    SMTPClientConnection.DeliveryMethod = SmtpDeliveryMethod.Network
End Sub

Затем я создал функцию для отправки электронного письма:

Private Shared Function SendEmail(ByVal emailUser As String, ByVal bodyMessage As List(Of String), ByVal priority As MailPriority) As Boolean
    Dim functionReturnValue As Boolean = False

    Try

        If Not String.IsNullOrWhiteSpace(emailUser) Then

            If Regex.IsMatch(emailUser, "^([a-zA-Z0-9]+([\.+_-][a-zA-Z0-9]+)*)@(([a-zA-Z0-9]+((\.|[-]{1,2})[a-zA-Z0-9]+)*)\.[a-zA-Z]{2,6})$") Then

                Using SMTPClientConnection
                    Dim smtpMessage As MailMessage = New MailMessage()
                    Dim _with1 = smtpMessage
                    _with1.[To].Add(New MailAddress(emailUser))
                    _with1.From = New MailAddress("Test Email" & " <email@email.com>")
                    _with1.ReplyToList.Add(New MailAddress("email@email.com"))
                    _with1.Subject = "Test Email"
                    _with1.Priority = priority
                    Dim htmlView As AlternateView = AlternateView.CreateAlternateViewFromString(bodyMessage(0), Nothing, "text/html")
                    Dim plainView As AlternateView = AlternateView.CreateAlternateViewFromString(bodyMessage(1), Nothing, "text/plain")
                    _with1.AlternateViews.Add(plainView)
                    _with1.AlternateViews.Add(htmlView)
                    SMTPClientConnection.Send(smtpMessage)
                    Return True
                End Using
            Else
                Throw New SmtpException("Invalid email.")
            End If
        End If

    Catch ex As Exception
    End Try

    Return functionReturnValue
End Function

Я использую функцию в моем коде здесь:

            Dim plainBody As String = File.ReadAllText(HttpContext.Current.Server.MapPath("email.txt"))
            plainBody = plainBody.Replace("%Name%", emailName)

            Dim emailBody As List(Of String) = New List(Of String)(New String() {plainBody})
            SendEmail("email@email.com", emailBody, MailPriority.Normal)

1 Ответ

1 голос
/ 28 января 2020

Сообщение об ошибке компилятора ясно. Переменная SmtpClientConnection является переменной экземпляра (она существует как другая сущность в любом экземпляре класса, где она объявлена), но вы пытаетесь использовать внутри метода Shared (метод, который существует без экземпляр класса). Внутри такого рода методов вы не можете использовать переменные экземпляра, потому что у вас нет экземпляра, из которого метод мог бы выбрать значение переменной и использовать его.

Решением может быть удаление Shared ключевое слово из метода, а затем, когда вы хотите вызвать метод, вам нужно создать экземпляр класса, в котором переменная экземпляра SmtpClientConnection инициализирована и готова к использованию в следующем вызове SendMail метод.

Однако вы все равно можете использовать метод Shared , но следует удалить переменную экземпляра и создать ее внутри метода SmtpClient :

Private Shared Function SendEmail(ByVal emailUser As String, ByVal bodyMessage As List(Of String), ByVal priority As MailPriority) As Boolean
    Dim functionReturnValue As Boolean = False

    Try

        If Not String.IsNullOrWhiteSpace(emailUser) Then

            If Regex.IsMatch(emailUser, "^([a-zA-Z0-9]+([\.+_-][a-zA-Z0-9]+)*)@(([a-zA-Z0-9]+((\.|[-]{1,2})[a-zA-Z0-9]+)*)\.[a-zA-Z]{2,6})$") Then


               Dim SMTPClientConnection As SmtpClient = New SmtpClient
               SMTPClientConnection.Host = "HOSTHERE"
               SMTPClientConnection.Port = PORTHERE
               SMTPClientConnection.DeliveryMethod = SmtpDeliveryMethod.Network                
               Using SMTPClientConnection
                    Dim smtpMessage As MailMessage = New MailMessage()
                    ......
                    SMTPClientConnection.Send(smtpMessage)
                    Return True
                End Using
            Else
                Throw New SmtpException("Invalid email.")
            End If
        End If

    Catch ex As Exception
       ' No point in catching an exception and doing nothing here.
       ' You can log the exception somewhere and then throw it again
       LogException(ex)
       Throw
       ' or just remove the try/catch block.
    End Try
    Return functionReturnValue
End Function

Таким образом, переменная создается только тогда, когда это необходимо, и уничтожается также, когда заканчивается оператор using. Обратите также внимание на комментарии относительно блока Try / Catch.

...