Pisząc aplikację niejednokrotnie będziemy chcieli wysłać wiadomość e-mail. Może to być krótki raport do administratora o jakimś wydarzeniu, informacja do pracownika o konieczności przedłużenia wygasających badań lekarskich albo informacja do klienta biura rachunkowego dotycząca wysokości naliczonych składek na poczet podatku dochodowego.
Najwygodniejszym sposobem na wysłanie wiadomości e-mail jest skorzystanie z obiektu Outlook.Application. Zaletą jest prostota w implementacji funkcji wysyłającej wiadomość e-mail oraz fakt, że nie musimy się martwić różnego rodzaju niespodziankami (brak połączenia z Internetem, chwilowe problemy z serwerem pocztowym, nietypowe metody uwierzytelniania itp.) gdyż utworzona wiadomość jest dodawana do folderu Skrzynka nadawcza w programie Outlook i to program Outlook jest odpowiedzialny za wszystkie techniczne kwestie. Wiadomość zostanie wysłana z domyślnego konta e-mail.
Wadą jest konieczność posiadania zainstalowanego i skonfigurowanego programu Outlook.
Oto najprostsza funkcja odpowiedzialna za wysłanie wiadomości e-mail.
Function ZwyklaWiadomosc(mSubject As String, mBody As String, mTo As String) As Boolean
On Error GoTo Err
Dim OutApp As Object
Dim OutMail As Object
' Nawiązanie komunikacji z programem Outlook
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
' Ustawienie parametrów wiadomości
With OutMail
.To = mTo
.Subject = mSubject
.Body = mBody
' Wysłanie wiadomości
.Send
End With
Set OutMail = Nothing
Set OutApp = Nothing
ZwyklaWiadomosc = True
Exit Function
Err:
MsgBox "Nie udało się wysłać maila do: " + mTo + vbCrLf + "Opis błędu: " + Err.Description, vbExclamation
ZwyklaWiadomosc = False
End Function
Przykład wywołania funkcji:
Sub TestOutlooka()
Dim Temat As String
Dim Treść As String
Dim Adresat As String
Temat = "Zaproszenie na szkolenie"
Treść = "W dniu 20.08.2024 odbędzie się odnowienie uprawnień BPH. Prosimy o potwierdzenie obecności"
Adresat = "jan.kowalski@example.com"
If ZwyklaWiadomosc(Temat, Treść, Adresat) = True Then
MsgBox "Wysłano wiadomość", vbInformation
Else
'Dodać procedurę obsługi błędu
'np. zapisanie w logach adnotacji o nie wysłaniu wiadomości
MsgBox "Nie wysłano powiadomienia", vbExclamation
End If
End Sub
Najbardziej nas interesują instrukcje w bloku instrukcji pomiędzy With OutMail a End With. Znajduje się tam kod odpowiedzialny za przekazanie parametrów nowo tworzonej wiadomości (Temat, Treść, Adresat) oraz najważniejsze na końcu mamy wywołanie metody .Send, która jest odpowiedzialna za wysłanie (w tle) tworzonej wiadomości. Jeśli nie masz pewności, czy Twoje makro działa poprawnie (np. czy wiadomości są adresowane do właściwych osób) to możesz na czas przeprowadzanych testów zmienić wywołanie metody .Send na .Dysplay. Wtedy wiadomość nie będzie od razu wysyłana a jedynie pojawi się okno nowo utworzonej wiadomości (wtedy możesz taką wiadomość ręcznie wysłać, albo usunąć).
Tę samą wiadomość można wysłać do kilku osób, wystarczy adresy e-mail oddzielić od siebie średnikami. Przykładowo w procedurze TestOutlooka można zmienić linię
Adresat = "jan.kowalski@example.com"
Na
Adresat = "jan.kowalski@example.com; anna.nowak@example.com"
Uwaga: należy mieć zainstalowaną „klasyczną” wersję programu Outlook. Niestety, ale „Nowy program Outlook” nie posiada mechanizmu COM przez co nie ma możliwości napisania makra, które komunikuje się z nową wersją programu Outlook.
Uwaga: funkcja ZwyklyMail zwraca wartość True wtedy, gdy uda się poprawnie skomunikować z programem Outlook i utworzyć nową wiadomość w skrzynce nadawczej. Natomiast zwrócenie wartości True przez tę funkcję nie gwarantuje, że wiadomość dotrze (nie ma prostego sposobu na sprawdzenie, czy wiadomość faktycznie dotarła do adresata).
Wysyłanie wiadomości w formacie HTML
Zwykła wiadomość e-mail jest w formacie tekstowym. Wiadomości w formacie HTML mogą zawierać tekst sformatowany (rozmiar, krój oraz kolor czcionki) a także takie obiekty jak np. tabele. Temat ten wykracza poza poziom tego szkolenia, ale osoby zainteresowane mogą zapoznać się z dowolnym kursem języka HTML.
Aby wiadomość była wysłana w formacie HTML wystarczy w blogu With zmienić linię .Body = mBody na .HTMLBody = mBody
Oto przykładowa funkcja wraz z przykładem dotyczącym wysyłki wiadomości w formacie HTML
Function WiadomoscHTML(mSubject As String, mBody As String, mTo As String) As Boolean
On Error GoTo Err
Dim OutApp As Object
Dim OutMail As Object
' Nawiązanie komunikacji z programem Outlook
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
' Ustawienie parametrów wiadomości
With OutMail
.To = mTo
.Subject = mSubject
.Body = mBody
.HTMLBody = mBody
' Wysłanie wiadomości
.Send
End With
Set OutMail = Nothing
Set OutApp = Nothing
WiadomoscHTML = True
Exit Function
Err:
MsgBox "Nie udało się wysłać maila do: " + mTo + vbCrLf + "Opis błędu: " + Err.Description, vbExclamation
WiadomoscHTML = False
End Function
Sub TestWiadomoscHTML()
Dim Temat As String
Dim Treść As String
Dim Adresat As String
Temat = "Zaproszenie na szkolenie"
Treść = "<p>W dniu <b>20.08.2024</b> odbędzie się odnowienie uprawnień BPH.</p>"
Treść = Treść = "<p>Prosimy o potwierdzenie obecności</p>"
Adresat = "damian.daszkiewicz@gmail.com"
If WiadomoscHTML(Temat, Treść, Adresat) = True Then
MsgBox "Wysłano wiadomość", vbInformation
Else
'Dodać procedurę obsługi błędu
'np. zapisanie w logach adnotacji o nie wysłaniu wiadomości
MsgBox "Nie wysłano powiadomienia", vbExclamation
End If
End Sub
Dodanie pól DW (CC) i UDW (BCC)
Wysyłając wiadomość np. do pracownika z zaproszeniem na szkolenie bardzo często w polu DW (do wiadomości) dołącza się adres e-mail przełożonego, aby wiedział, że pracownik otrzymał daną wiadomość. W naszym przypadku możemy w bloku With…End With dopisać następujące linie kodu:
.CC = "kierownik@exaple.com"
i/lub
.BCC = "kierownik@exaple.com"
Dodawanie pola ReplayTo
Jeśli wysyłasz wiadomość z „technicznego” adresu e-mail np. no-reply@domena.pl a chcesz, aby klient klikając w programie pocztowym w przycisk odpowiedz odpisał na inny adres e-mail należy w bloku między With a End With dodać następującą linijkę:
.ReplyRecipients.Add ("adres@e-mail.pl")
Wysyłanie wiadomości z wysokim priorytetem
Aby wiadomość miała wysoki priorytet należy w boku With…End With dodać następującą linijkę:
.Importance = 2
Dodawanie załączników
Do wiadomości możemy dodać dowolną liczbę załączników. Załączniki mogą być plikami na dysku twardym (np. c:\raporty\2024.xlsx) jak i plikami na dysku sieciowym np. \\prezes\raporty\raport.xlsx
Dla każdego załącznika należy dodać w bloku Widh…End With następująca linię:
.Attachments.Add Plik
Gdzie w zmiennej Plik jest podana ścieżka do pliku (warto jest sprawdzić, czy dany plik istnieje, gdyż w przeciwnym przypadku funkcja wysyłająca wiadomość e-mail zwróci błąd). Jeśli potrzebujesz dodać kilka załączników, należy metodę Attachmens.Add dodać kilka razy w tym bloku np.
.Attachments.Add Plik
.Attachments.Add Plik2
.Attachments.Add Plik3
Wysyłanie wiadomości z opóźnieniem
Jeśli obawiasz się, że użytkownik wyśle wiadomość przez przypadek, a metoda Display nie wchodzi w grę (bo np. generujemy kilkanaście wiadomości e-mail a otwieranie kilkunastu okienek nowej wiadomości w programie Outlook nie jest dobrym pomysłem) to możemy „zapisać” wygenerowane wiadomości w skrzynce nadawczej i ustawić im wysyłkę np. na za 15 minut. Wtedy gdy użytkownik nieopatrznie kliknie w jakiś przycisk w naszej aplikacji to ma aż 15 minut, aby uświadomić sobie jakie głupstwo popełnił a następnie może usunąć te wiadomości ze skrzynki nadawczej w programie Outlook. Aby zapisać wysłanie wiadomości z opóźnieniem należy w bloku Widh…End With dodać następująca linię:
.DeferredDeliveryTime = Now + TimeValue("00:15:00")
Uwaga: niestety, ale Outlook ma takie dziwactwo, że jeśli wejdziesz do skrzynki nadawczej i dwa razy klikniesz w wiadomość (aby np. zobaczyć czy poprawnie została wygenerowana treść wiadomości) to tak jakby zostanie skasowana informacja o opóźnionym dostarczeniu i ta konkretna wiadomość będzie tkwiła w skrzynce nadawczej w nieskończoność (chyba, że wcześniej sam ją jeszcze raz ręcznie otworzysz i klikniesz w przycisk Wyślij).
Uwaga2: jeśli wiadomość jest zapisywana lokalnie na komputerze a nie np. na serwerze Exchange to wiadomość będzie zapisana jako do wysłania nie wcześniej niż np. za 15 minut od teraz. Jeśli zamkniesz program Outlook i wyłączysz komputer bo właśnie wyjeżdżasz na weekend to wiadomość będzie tkwiła w skrzynce nadawczego programu Outlook do czasu aż ponownie nie zostanie włączony program Outlook.