Невозможно отправить почту из формы VB с помощью system.net.mail

В нашей компании есть колл-центр, компьютеры которого заблокированы (нет доступа к Интернету, электронной почте, офисным приложениям), и им необходимо иметь возможность регистрировать запросы в службу поддержки со своих компьютеров.

Я создал приложение форм VB Windows, которое собирает некоторую информацию от пользователя (имя, адрес электронной почты, расширение, тема и описание проблемы), а также системную информацию, собранную из WMI.

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

Однако при попытке отправить письмо. это просто не работает.

У нас есть реле smtp, которое позволяет ретранслировать анонимную электронную почту и не требует учетных данных пользователя.

Как только я получу базовую тестовую почту для работы, я начну заполнять почту информацией, которую я получаю от пользователя. Однако в настоящее время почта выдает исключения и вообще не отправляет.

Примечание. Я абсолютный новичок, когда дело доходит до VB и .net, так как я работаю с linux/php.

Ниже мой код:

Imports System.Management
Imports System.Management.Instrumentation
Imports System.Net.Mail

Public Class Form1

    Private Property strComputer As String
    Private Property objWMIService As Object
    Private Property colItems As Object
    Private Property colComputers As Object
    Private Property strComputerRole As String
    Private Property colDisks As Object
    Private Property colOperatingSystems As Object
    Private Property IPConfigSet As Object

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim response As MsgBoxResult
        response = MsgBox("Are you sure you want to exit?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Confirm")
        If response = MsgBoxResult.Yes Then
            Me.Dispose()
        ElseIf response = MsgBoxResult.No Then
            Exit Sub
        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim strName As String
        Dim strDept As String
        Dim strEmail As String
        Dim strExt As String
        Dim strDesc As String
        Dim strAffect As String
        Dim strSubject As String

        strName = TextBox1.Text
        strDept = TextBox2.Text
        strEmail = TextBox3.Text
        strExt = TextBox4.Text
        strSubject = TextBox6.Text
        strDesc = RichTextBox1.Text
        strAffect = TextBox5.Text

        strComputer = "."
        objWMIService = GetObject("winmgmts:" _
            & "{impersonationLevel=impersonate}!\\" _
            & strComputer & "\root\cimv2")
        colItems = objWMIService.ExecQuery _
            ("Select * from Win32_ComputerSystem")
        For Each objItem In colItems
            TextBox7.Text = objItem.Name
            TextBox8.Text = objItem.Manufacturer
            TextBox9.Text = objItem.Model
            TextBox11.Text = objItem.TotalPhysicalMemory
        Next
        colComputers = objWMIService.ExecQuery _
    ("Select DomainRole from Win32_ComputerSystem")
        For Each objComputer In colComputers
            Select Case objComputer.DomainRole
                Case 0
                    strComputerRole = "Standalone Workstation"
                Case 1
                    strComputerRole = "Member Workstation"
                Case 2
                    strComputerRole = "Standalone Server"
                Case 3
                    strComputerRole = "Member Server"
                Case 4
                    strComputerRole = "Backup Domain Controller"
                Case 5
                    strComputerRole = "Primary Domain Controller"
            End Select
            TextBox10.Text = strComputerRole
        Next
        colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
        For Each objItem In colItems
            TextBox12.Text = objItem.Manufacturer
            TextBox13.Text = objItem.Name
            TextBox14.Text = objItem.MaxClockSpeed & " MHz"
        Next
        colItems = objWMIService.ExecQuery("Select * from Win32_BIOS")
        For Each objItem In colItems
            TextBox15.Text = objItem.Version
            TextBox16.Text = objItem.SerialNumber
        Next
        colItems = objWMIService.ExecQuery("Select * from Win32_VideoController")
        For Each objItem In colItems
            TextBox17.Text = objItem.Name
        Next
        colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk where DeviceID = ""C:""")
        For Each objDisk In colDisks
            TextBox18.Text = Math.Round(objDisk.Size / 1073741824) & " GB"
            TextBox19.Text = Math.Round(objDisk.Freespace / 1073741824) & " GB"
        Next
        colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
        For Each objOperatingSystem In colOperatingSystems
            TextBox20.Text = objOperatingSystem.Caption & "  " & objOperatingSystem.Version
            TextBox21.Text = objOperatingSystem.ServicePackMajorVersion & "." & objOperatingSystem.ServicePackMinorVersion
        Next
        Dim moIP As ManagementObject

        Dim myNet = New ManagementObjectSearcher _
        ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

        For Each moIP In myNet.Get
            ' Eg: Display IP address in Message Box
            TextBox22.Text = moIP("IPAddress")(0)
        Next

        Dim mail As New MailMessage()
        mail.To.Add("[email protected]")
        mail.From = New MailAddress(strEmail)

        Dim smtp As New SmtpClient()
        smtp.Host = "relay.company.local"
        smtp.EnableSsl = False

        mail.Subject = strSubject
        mail.Body = strDesc
        smtp.Send(mail)

    End Sub

    Private Function Wscript() As Object
        Throw New NotImplementedException
    End Function

    Private Function IsNull(p1 As Object) As Boolean
        Throw New NotImplementedException
    End Function


End Class

ОБНОВЛЕНИЕ: Ниже приведено исключение

An unhandled exception of type 'System.Net.Mail.SmtpException' occurred in System.dll

Additional information: Service not available, closing transmission channel. The server response was: 4.3.2 Service not available, closing transmission channel

person Stroes    schedule 11.05.2015    source источник
comment
Однако в настоящее время почта генерирует исключения Какие исключения? Это причина, по которой это не работает, помогите нам помочь вам, сказав нам :)   -  person James Thorpe    schedule 11.05.2015
comment
Также, возможно, стоит отметить, что, поскольку вы имеете опыт работы с PHP, вам может быть удобнее делать такие вещи на C#, а не на VB — они так же функциональны, как и друг друга, но синтаксис C# будет ближе к тому, что вам нужно. знаком с.   -  person James Thorpe    schedule 11.05.2015
comment
Сервис недоступен Как именно компьютеры заблокированы? Может случиться так, что то, что блокирует доступ к этим вещам, также блокирует ваш код.   -  person James Thorpe    schedule 11.05.2015
comment
Извините, я рассеян в данный момент. Я обновил исходный вопрос с исключением. Кроме того, я делал то же самое раньше, хотя пару лет назад в VB и считал, что было бы проще снова забрать его. Кроме того, это приложение будет единственным, что я буду кодировать в .net/VB, но я рассмотрю вариант C#. Просто нужно, чтобы эта штука работала   -  person Stroes    schedule 11.05.2015
comment
Они заблокированы групповыми политиками, с другой стороны, на моей машине нет объектов групповой политики, и я все еще получаю исключение.   -  person Stroes    schedule 11.05.2015
comment
Хорошо - в этом случае может показаться, что почтовый сервер настроен довольно строго, чтобы принимать соединения только от определенных вещей. Возможно, вам придется обсудить это с администратором вашего почтового сервера.   -  person James Thorpe    schedule 11.05.2015
comment
Есть ли более простой способ отправки почты с помощью VB? вместо использования вышеуказанного метода   -  person Stroes    schedule 11.05.2015
comment
Это это простой способ отправки почты - всего несколько строк!   -  person James Thorpe    schedule 11.05.2015


Ответы (1)


Возможно, вам не хватает некоторых деталей. Вот фрагмент в помощь:

    '...

    'for when not using default credentials
    Dim SMTP_Credentials As System.Net.NetworkCredential = New System.Net.NetworkCredential
    SMTP_Credentials.UserName = "UserName"
    SMTP_Credentials.Password = "Password"


    Using SMTP_Mail As New Net.Mail.SmtpClient
        With SMTP_Mail
            .EnableSsl = False
            .Host = "IP"  'ip address of smtp client
            .Port = 25  'by default SSL does not use port 25 (use port 587 for SSL)
            .UseDefaultCredentials = True
            If Not .UseDefaultCredentials Then .Credentials = SMTP_Credentials
            .Send(mailMsg) 'send email.
        End With
    End Using

    '...

Я собираюсь предложить вам сначала поиграть с настройками учетных данных по умолчанию. Я обнаружил, что это почти никогда не устанавливается так, как ожидалось... Не полагайтесь на стандартные настройки по умолчанию, если только вы не управляете сервером...

person JStevens    schedule 11.05.2015
comment
Я обнаружил, что настройки моего smtp-сервера не позволяют мне использовать ретранслятор, и мне пришлось указать приложению использовать сервер обмена, и теперь он работает. - person Stroes; 12.05.2015