VBA – jak wysyłać automatycznie maile ze skrzynki innej niż domyślna ?
2017-11-06Witam :)
Ostatnio na prowadzonym przeze mnie szkoleniu VBA pojawił się ciekawy temat. Kursanci, chcieli zautomatyzować wysyłanie wiadomości mailowych za pomocą VBA ale nie ze skrzynki domyślnej. Problem sam w sobie case nie jest skomplikowany, tylko ten wybór konta z którego ma nastąpić wysyłka wymagało od nas kilku dodatkowych linijek kodu i je właśnie chciałem tu opisać :)
Najpierw standardowe kroki potrzebne do napisania makra które wysyła emaile. Żeby ten post nie rozrósł się do rozmiarów scenariusza „Gry o tron” na razie zajmę się jedynie najprostszą wersją programu czyli wysyłaniem wiadomości w postaci czystego tekstu i bez stopki.
Bardziej rozbudowane makro czyli np.:
– wysyłające wiadomości w postaci ładnie sformatowanego tekstu z kolorkami, wcięciami obrazkami itd.
– zamieniające fragment arkusza Excela (np. tabelkę) na kod HTML i wrzucające go do wiadomości
– dołączające automatycznie sygnaturkę/podpis, który mamy zdefiniowany w Outlooku
omówię w osobnym poście :)
No to jedziemy:
1. Otwieramy Excela, przechodzimy do edytora VBA i dodajemy nowy moduł
2. Żeby nie było problemów z wersjami Outlooka nie będę dodawał referencji z menu tools–>references, tylko skorzystam z późnego wiązania (czym się różni późne od wczesnego również opiszę w odrębnym poście :)
3. Piszemy więc taką procedurkę
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub wysylaczka() '1. start makra '2. stworz zmienne Dim aplikacja_outlooka As Object Dim mailik As Object '3. wpisz wartosci do zmiennych '"wystartuj Outlooka" Set aplikacja_outlooka = CreateObject("OUTLOOK.Application") 'utworz "nowego/pustego" emaila (to zero w nawiasie oznacza wlasnie e-mail) Set mailik = aplikacja_outlooka.CreateItem(0) With mailik .To = "jakis_adres@gmail.com" .Subject = "Jakis tam temat" .Body = "To jest tresc wiadomosci" .Send 'send wysyla wiadomosc End With End Sub |
Powyższy kod wyśle wiadomość z adresu, który jest ustawiony jako domyślny w naszym Outlooku. Żeby móc skorzystać z innych adresów trzeba użyć .SendUsingAccount. Właściwość ta pojawiła się w Office 2007 :)
Używamy jej następująco:
1 2 3 4 5 6 7 8 9 10 11 |
With mailik .To = "jakis_adres@gmail.com" .Subject = "Jakis tam temat" .Body = "To jest tresc wiadomosci" '------- wybieramy konto z którego zostanie wyslana wiadomosc ------------ set .SendUsingAccount = aplikacja_outlooka.Session.Accounts.Item(2) 'ten numerek 2 oznacza numer konta z którego chcę wysyłać wiadomość '------------------------------------------------------------------------- .Send 'send wysyla wiadomosc End With |
Bardzo ciekawe jest użycie SET przed .SendUsingAccount (żeby było śmieszniej SET jest konieczny w Office 2016 a w 2013 działa bez seta… :)
Ok a skąd mamy wiedzieć które konto ma jaki numer ? Co mamy wpisać w nawiasie po słowie Item w linii
1 |
aplikacja_outlooka.Session.Accounts.Item(2) |
Najprościej będzie przejść w pętli przez wszystkie po kolei konta i wypisać je np. w oknie immediate window :) czyli np. tak:
1 2 3 4 5 6 7 8 9 10 11 |
Sub sprawdzarka() Dim licznik Dim aplikacja_outlooka As Object Set aplikacja_outlooka = CreateObject("OUTLOOK.Application") For licznik = 1 To aplikacja_outlooka.Session.Accounts.Count Debug.Print aplikacja_outlooka.Session.Accounts.Item(licznik) & vbTab & " ma numer " & licznik Next licznik End Sub |
Po wykonaniu powyższego kodu wystarczy że zerkniemy do okna immediate (skrót ctrl+g) i odczytamy które konto ma jaki numer :)
Załóżmy że chcemy wysyłać emaile z konta które określone jest numerem 3, kod wysyłania będzie wyglądał tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub wysylaczka() '1. start makra '2. stworz zmienne Dim aplikacja_outlooka As Object Dim mailik As Object '3. wpisz wartosci do zmiennych '"wystartuj Outlooka" Set aplikacja_outlooka = CreateObject("OUTLOOK.Application") 'utworz "nowego/pustego" emaila (to zero w nawiasie oznacza wlasnie e-mail) Set mailik = aplikacja_outlooka.CreateItem(0) With mailik .To = "jakis_adres@gmail.com" .Subject = "Jakis tam temat" .Body = "To jest tresc wiadomosci" set .SendUsingAccount = aplikacja_outlooka.Session.Accounts.Item(3) .Send 'send wysyla wiadomosc End With End Sub |
Mam nadzieję, że wam się przyda ten case :)
Pozdrawiam
Michał Dąbrowski