22 Vb.Net Wysyłanie E-mail

Wysyłanie E-mail

Witam w kolejnym poradniku, dziś dowiemy się jak wysłać wiadomość E-mail za pośrednictwem naszego programu. Skorzystamy z przestrzeni nazw System.Net.Mail więc najpierw zaimportujemy tą przestrzeń poleceniem:
Imports System.Net.Mail
Przy okazji muszę was powiadomić, że przeszedłem obecnie na nowszą wersję Visual Studio Community 2015. Niczego to jednak nie zmienia w naszym poradniku.
Teraz gdy mamy już aktywną przestrzeń nazw Net.Mail to napiszmy sobie kod dla przycisku:
        Dim Smtp_Server As New SmtpClient
        Dim mail As New MailMessage()
Mamy zatem zadeklarowane 2 obiekty, serwer SMTP oraz strukturę wiadomości email. Teraz otworzymy sobie blok Try Catch i w nim spróbujemy zdefiniować naszą nową wiadomość i spróbujemy ją wysłać. Blok Try Catch jest nam potrzebny aby wyłapał nam błędy odpowiedzi serwera, lub też informował nas np o braku połączenia z internetem. Przyjmijmy, że naszym testowym serwerem do sprawdzenia naszej wysłanej wiadomości będzie serwer WP (Wirtualna Polska). Napiszmy więc kod:
        Try
            Smtp_Server.UseDefaultCredentials = False
            Smtp_Server.Credentials = New Net.NetworkCredential("twój login", "twoje hasło")
            Smtp_Server.Port = 587
            Smtp_Server.Host = "smtp.wp.pl"
            Smtp_Server.Timeout = 5000
            mail = New MailMessage()
            mail.Priority = MailPriority.High
            mail.From = New MailAddress("twój adres email")
            mail.Bcc.Add("adres odbiorcy")
            mail.Subject = "temat wiadomości"
            mail.IsBodyHtml = False
            mail.Body = "Tekst wiadomości"
            Smtp_Server.Send(mail)
            MessageBox.Show("Wiadomość wysłana!")
        Catch ex As Exception
             MessageBox.Show(ex.ToString)
        End Try
Jak nietrudno się domyślić linie kodu 2-6 odpowiadają za skonfigurowanie serwera wychodzącego SMTP, następne linie definiują samą wiadomość, po czym linia 14 wysyła tak skonfigurowaną wiadomość do adresata. Kolejna linia za pomocą MessageBox'a informuje o prawidłowo zakończonym procesie lub przeskakuje do Exception i wyświetla rodzaj problemu podczas wysyłania.
Gdyby ktoś próbował w ten sposób do wysyłania poczty ustawić serwer Gmail to od razu może o tym zapomnieć. Serwery Gmail akceptują w tej chwili wyłącznie własne aplikacje do wysyłania poczty. Tłumaczą to względami bezpieczeństwa. Każdy jednak tłumaczy sobie to na swój sposób. Wracając do tematu.
Do tak skonfigurowanej wiadomości można w prosty sposób dołączyć jeszcze Attachment czyli załącznik. Żeby sobie trochę utrudnić życie a wam ułatwić, stworzymy sobie nowy przycisk i dodamy do formy kontrolkę ListView, która zrobi nam listę załączników  oraz kontrolkę OpenFileDialog. Napiszę więc kod na nowo, dodając potrzebne zmienne, i kontrolki. Poniżej przedstawię pełny kod:
Imports System.Net.Mail
Public Class form1
    Private ListAttachments As ArrayList

    Private Sub BtnSend_Click(sender As Object, e As EventArgs) Handles BtnSend.Click
        Dim Smtp_Server As New SmtpClient
        Dim mail As New MailMessage()
        Try
            Smtp_Server.UseDefaultCredentials = False
            Smtp_Server.Credentials = New Net.NetworkCredential("twój login", "twoje hasło")
            Smtp_Server.Port = 587
            Smtp_Server.Host = "smtp.wp.pl"
            Smtp_Server.Timeout = 5000
            mail = New MailMessage()
            mail.Priority = MailPriority.High
            mail.From = New MailAddress("twój adres email")
            mail.Bcc.Add("adres odbiorcy")
            mail.Subject = "temat wiadomości"
            mail.IsBodyHtml = False
            mail.Body = "Tekst wiadomości"
            If Not IsNothing(ListAttachments) Then
                Dim mailAttachment As Attachment
                For Each mailAttachment In ListAttachments
                    mail.Attachments.Add(mailAttachment)
                Next
            End If
            Smtp_Server.Send(mail)
            MessageBox.Show("Wiadomość wysłana!")
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
        End Try
    End Sub

    Private Sub BtnAttachment_Click(sender As Object, e As EventArgs) Handles BtnAttachment.Click
        With OpenFileDialog1
            .Filter = "All Files (*.*)|*.*|HTML Files (*.htm;*.html)|*.htm|Microsoft Mail Documents (*.msg)|*.msg|Word Documents (*.doc)|*.doc|Excel Files(*.xl*)|*.xl*|Excel Worksheets (*.xls)|*.xls|Excel Charts (*.xlc)|*.xlc|PowerPoint Presentations (*.ppt)|*.ppt|Text Files (*.txt)|*.txt"
            .FilterIndex = 1
            If .ShowDialog() = Windows.Forms.DialogResult.OK Then
                If IsNothing(ListAttachments) Then
                    ListAttachments = New ArrayList()
                    ListBoxAtt.Items.Clear()
                End If
                ListAttachments.Add(New Attachment(.FileName))
                Dim strFileName() As String = .FileName.Split(New Char() {CChar("\")})
                System.Array.Reverse(strFileName)
                ListBoxAtt.Items.Add(strFileName(0))
            End If
        End With
    End Sub
End Class
W przycisku BtnAttachment zdefiniowaliśmy sobie na początku przykładowy filtr rozszerzeń plików, które można będzie dołączyć do naszego maila. Następnie otwieramy sobie kontrolkę OpenFileDialog i każdy kolejny plik dodajemy sobie osobno do naszej listy załączników. Następnie jeśli funkcja sprawdzająca z przycisku BtnSend wykryje, że lista nie jest pusta to zdefiniuje nowy obiekt Attachment i za pomocą pętli For Each doda każdy element ze zdefiniowanej tablicy ArrayList.
Myślę, że wyczerpaliśmy w tym poradniku temat wysyłania E-maili. Zapraszam więc w przyszłości do kolejnych poradników.



Utworzono 15.10.2015

Zmodyfikowano 05.05.2016
Dorzucam przykładową solucję do odtworzenia w swoim VS
Link do solucji

5 komentarzy:

  1. Można prosić o fotkę jak wyglądałaby formatka?
    Czytając kod widzę przyciski:
    BtnSend - wyślij
    BtnAttachment - listview załącznik
    dalej..
    mail.Bcc.Add - textbox adresu
    mail.Subject - textbox temat
    mail.Body - textbox wiadomości

    Dobrze rozumiem?
    Pozdrawiam
    andrew

    OdpowiedzUsuń
    Odpowiedzi
    1. Witaj, dobrze rozumiesz. Wrzuciłem na szybko zrobioną solucję do pobrania, mam nadzieje, że zadziała :) Pozdrawiam

      Usuń
    2. :) Dzięki
      Nie rozumiałem za bardzo "listview", można by było pokombinować, żeby "BtnAttachment"
      otwierał mini formatkę z "listview".
      Pozdrawiam
      andrew

      Usuń
  2. Tego szukałem, mam jednak problem z wysłaniem maila, dostaję komunikat Time Out, poczta na wp zmieniałem też port na 465, w innych to samo. Co może być przyczyną ?

    OdpowiedzUsuń
  3. wszystkie dane podalem poprawne nawet poczta nadawcy taka sama (wp) i jest timed out

    OdpowiedzUsuń