Na przykład chcesz wysłać klientom przypomnienie o pozostałych rachunkach, a wszystkie dane dotyczące klientów, takie jak ich numery telefonów, adres, wiek itp., znajdują się w arkuszu programu Excel lub w bazie danych, a następnie zamiast robić to ręcznie, możesz napisać prosty program w Pythonie, który automatycznie zrobi to za Ciebie. W tym samouczku dowiemy się, jak działa protokół poczty e-mail i jak zautomatyzować ten proces, aby zaoszczędzić cenny czas.
Słowo o SMTP
Simple Mail Transfer Protocol (SMTP) jest skomputeryzowanym odpowiednikiem Twojej usługi pocztowej. Jest to protokół, który działa w warstwie aplikacji sieci TCP/IP. Jest to standardowy protokół wysyłania i odbierania wiadomości e-mail przez Internet. Proces przesyłania poczty składa się z serwerów pocztowych i klientów wysyłających i odbierających wiadomości e-mail do siebie nawzajem.
Na przykład masz konto GMAIL i chcesz wysłać e-mail do znajomego na jego koncie YAHOOOO. Piszesz e-mail i klikasz wyślij, ale proces zaplecza jest trochę skomplikowany i aby zrozumieć ten proces, musisz najpierw zrozumieć SMTP. Twój klient poczty e-mail SMTP wysyła jako pierwszy HELO (lub EHLO) na serwer GMAIL, możesz powiedzieć, że to polecenie lub nagłówek jest równoważny Gospodarz nagłówka w protokole HTTP i służy do identyfikacji serwera po nazwie domeny. Po HELO lub EHLO klient uwierzytelnia się na serwerze za pomocą podanej nazwy użytkownika i hasła, używając AUTH Komenda. Następnie określa adres e-mail nadawcy i odbiorcy, a następnie treść wiadomości i wysyła e-mail na serwer GMAIL. Serwer GMAIL najpierw potwierdzi, czy adres e-mail odbiorcy w YAHOO istnieje, czy nie, a następnie wyśle e-mail do serwera YAHOO, z którego odbiorca może pobrać swoje e-maile.
SMTPLIB
SMTPLIB to biblioteka Pythona, która może być używana jako klient SMTP, podobnie jak GMAIL, YAHOO, Thunderbird lub dowolny inny klient poczty e-mail i może być używana do wysyłania wiadomości e-mail. Możemy wykonać wszystkie zadania za pomocą klienta SMTPLIB, które możemy wykonać z tymi posiadającymi graficzny interfejs użytkownika.
Jest on domyślnie dostępny w Pythonie, jeśli go nie masz, możesz zainstalować za pomocą następującego polecenia.
[ochrona poczty e-mail]:~$ pip zainstaluj smtplibLUB w Pythonie3
[ochrona poczty e-mail]:~$ pip zainstaluj smtplibPisanie pierwszego e-maila w Pythonie
W tym samouczku będę używał konta GMAIL jako nadawcy, będę również korzystał z konsoli Pythona, więc będzie mi łatwiej wyjaśnić krok po kroku każdą linię kodu. Aby rozpocząć, musimy zezwolić naszemu Gmailowi na dostęp do mniej bezpiecznych aplikacji.
Więc zaloguj się na swoje konto GMAIL, a następnie przejdź do ustawień konta.
Teraz upewnij się, że dostęp dla mniej bezpiecznych aplikacji jest włączony.
Teraz otwórz konsolę Pythona i zacznij pisać swój pierwszy e-mail za pomocą Pythona
[ochrona poczty e-mail]:~$ pythonPyton 2.7.16 (domyślnie, 7 października 2019, 17:36:04)
[RWP 8.3.0] na linux2
Wpisz „pomoc”, „prawa autorskie”, „kredyty” lub „licencja”, aby uzyskać więcej informacji.
//importuj bibliotekę SMTP>>> importuj plik smtplib
//połącz się z serwerem GMAIL z nazwą domeny i numerem portu (to ustawienie jest inne dla
każdego dostawcy poczty e-mail, spójrz na poniższą tabelę)
>>> mailobj = smtplib.SMTP('smtp.gmail.com',587)
//przywitaj się z serwerem
>>> mailobj.ehlo()
(250, 'smtp.gmail.com do usług, [103.255.4.246]\nSIZE35882577\n8BITMIME\nSTARTTLS\
nKODY STATUSU ZAAWANSOWANEGO\nPIPELINING\nCHUNKING\nSMTPUTF8')
//Port 587 oznacza, że używamy szyfrowanego połączenia TLS, więc uruchom szyfrowany TLS
komunikacja za pomocą starttls(), dzięki czemu nasze dane uwierzytelniające i komunikaty nie zostaną podsłuchane
>>> mailobj.starttls()
(220, '2.0.0 Gotowy do uruchomienia TLS')
//zaloguj się do swojego konta GMAIL przy użyciu adresu e-mail i hasła
>>> mailobj.login('[email chroniony]','s3cr3t_p4ssw0rd')
(235, '2.7.0 Akceptowane”)
//podaj adres e-mail nadawcy i odbiorcy oraz treść e-maila
>>> mailobj.sendmail('[email chroniony]','[email chroniony]','Temat:
Witaj świecie! \n Witaj świecie! to jest mój pierwszy e-mail hello world w Pythonie')
// zamknij połączenie z serwerem GMAIL
>>> mailobj.porzucić()
(221, '2.0.0 połączenie zamykające b6sm4519863lfi.72 - gsmtp')
W powyższym przykładowym programie zamień podaną treść na własną. Jeśli nie jesteś użytkownikiem GMAIL, możesz użyć serwera poczty e-mail swojego dostawcy. Oto lista nazw domen i portów niektórych popularnych dostawców poczty.
Nazwa | Nazwa domeny serwera | Port |
Gmail | smtp.gmail.com | 587 |
Outlook / Hotmail | poczta smtp.perspektywy.com | 587 |
Poczta Yahoo | smtp.Poczta.wieśniak.com | 587 |
Verizon | smtp.werizonie.netto | 465 |
Comcast | smtp.comcast.netto | 587 |
Kilka słów o IMAP
Tak więc właśnie zbadaliśmy, że SMTP jest używany do wysyłania e-maili, ale czym jest IMAP (Internet Access Messaging Protocol)? SMTP nie może być używany do wyszukiwania i pobierania wiadomości e-mail z serwera, do tego celu używany jest protokół IMAP lub POP3.
IMAPCLIENT, IMAPLIB i PYZMAIL
Istnieją dwie główne biblioteki w Pythonie, które mogą być używane jako klient IMAP do wyszukiwania, pobierania i usuwania wiadomości e-mail z serwera pocztowego. Python ma domyślnie imaplib biblioteka, ale inna biblioteka zewnętrzna imaplient jest bardziej efektywny i łatwy w użyciu. W tym samouczku użyjemy imaplient pobierać e-maile z serwera pocztowego.
Problem z imaplient polega na tym, że pobiera wiadomości e-mail z serwera pocztowego w surowym formacie. Więc będziemy potrzebować pyzmail biblioteka jako parser dla przyjaznego dla użytkownika wyjścia. Aby zainstalować obie biblioteki, wpisz
[ochrona poczty e-mail]:~$ sudo pip zainstaluj imapclient[ochrona poczty e-mail]: ~ $ sudo pip zainstaluj pyzmail
Pobieranie wiadomości e-mail z serwera pocztowego
Teraz dowiemy się, jak wyszukiwać i pobierać e-maile z serwera pocztowego za pomocą imapclient. Użyjemy imapclient do wyszukiwania i pobierania wiadomości e-mail z serwera, a następnie użyjemy pyzmaila do przetworzenia nieprzetworzonej treści. chodźmy
// importuj bibliotekę imapclient>>> importuj imapclient
// Połącz się z serwerem IMAP Gmaila
>>> obj = imapclient.IMAPClient('imap.gmail.com',ssl=prawda)
// Zaloguj się na swoje konto e-mail przy użyciu swoich danych logowania
>>> obj.login('[email chroniony]','s3cr4tp4ss')
„[e-mail chroniony] uwierzytelniony (sukces)”
// Wybierz folder wiadomości do przeczytania i.e SKRZYNKA ODBIORCZA, PROJEKTY, WYSŁANE e-maile
>>> obj.select_folder('INBOX', readonly=True)
'EXISTS': 830, 'PERMANENTFLAGS': (), 'HIGHESTMODSEQ': 112999, 'UIDNEXT': 931,
'FLAGI': ('\\Answered', '\\Flagged', '\\Draft', '\\Deleted', '\\Seen',
'$NotPhishing', '$Phishing'), 'UIDVALIDITY': 1, 'TYLKO DO ODCZYTU': ["], 'OSTATNIO': 0
// Przeszukaj swoje wiadomości w skrzynce odbiorczej lub zastosuj filtr, poniżej pojawi się filtr
Ci maile otrzymane po 25.10.2019
>>> identyfikatory_e-mail = obj.search(['SINCE', '25.10.2019'])
>>> identyfikatory_e-mail
[919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930]
// Lista „mail_ids” zawiera listę identyfikatorów e-mail otrzymanych od 25 października 2019 r,
możesz pobrać wiadomość e-mail za pomocą funkcji pobierania imapclient.
>>> surowa_poczta = obj.fetch([919],['BODY[]';'FLAGI'])
// Teraz zawartość zmiennej raw_mail jest w formacie raw, nie można jej wyświetlić na
screen bezpośrednio, więc potrzebowalibyśmy parsera, aby przeanalizować tę zawartość w celu uzyskania przyjaznego dla użytkownika wyniku
>>> importuj pyzmail
>>> wiadomość = pyzmail.PyzMessage.fabryka(poczta_surowa[919]['BODY[]'])
// Teraz e-mail jest analizowany i przechowywany w zmiennej wiadomości, aby uzyskać temat
e-mail, użyj funkcji get_subject
>>> wiadomość.pobierz_temat()
u'Ubierz swoje umiejętności w te Halloween z 25% zniżką'
// Podobnie możesz zobaczyć dane nadawcy
>>> wiadomość.pobierz_adresy('z')
[(u'Usama Azad', '[email chroniony]')]
>>> wiadomość.pobierz_adresy('do')
[(u'[email chroniony]', '[email chroniony]')]
// Aby uzyskać treść wiadomości e-mail, wpisz
>>> wiadomość.część_tekstowa.get_payload().dekodować (wiadomość.część_tekstowa.zestaw znaków)
Cześć! Ciesz się mieszkaniem 25% na naszych kursach premium”
Jeśli masz konto u innego dostawcy usług poczty e-mail innego niż GMAIL, możesz zalogować się na jego serwer IMAP. Oto lista nazw domen IMAP niektórych znanych dostawców poczty.
Dostawca | Nazwa domeny dla serwera IMAP |
WIEŚNIAK | imap.Poczta.wieśniak.com |
Hotmail/Outlook | imap-mail.perspektywy.com |
Verizon | przychodzący.werizonie.netto |
Comcast | imap.comcast.netto |
AT&T | imap.Poczta.att.netto |
Usuwanie wiadomości e-mail z serwera IMAP
Podobnie jak w przypadku wyszukiwania i pobierania wiadomości e-mail z serwera, możesz również usuwać wiadomości e-mail z serwera pocztowego za pomocą ich uid. Wystarczy postępować zgodnie z podanymi krokami
// Aby usunąć wiadomość e-mail, musisz ustawić tylko do odczytu na „Fałsz”, aby uzyskać dostęp do zapisu na swoime-maile
>>> obj.select_folder('INBOX', readonly=False)
>>> identyfikatory_e-mail = obj.search(['SINCE', '25.10.2019'])
>>> identyfikatory poczty
[919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930]
// Podaj uid e-mail lub listę uid e-mail, po uruchomieniu poniższego polecenia,
Twój e-mail zniknie z INBOX.
>>> obj.usuń_wiadomości(919)
919: ('\\Widoczne', '\\Usunięte')
// To polecenie trwale usunie twoje e-maile z serwera pocztowego
>>> obj.wykreślić()
('Sukces', [])
https://techtopz.com/build-a-birthday-reminder-application-in-python-on-mac/
Tworzenie własnego przypomnienia o urodzinach
Masz urodziny swoich znajomych w najbliższych miesiącach i chcesz złożyć im życzenia urodzinowe. Ale masz dużo pracy w swoim biurze i istnieje możliwość, że zapomnisz ich życzyć. Więc to zadanie może być wykonane automatycznie za pomocą Pythona. Poniżej znajduje się kod do wykonania tego zadania.
// importowanie modułówimportuj ponownie
// moduł os służy do wykonywania zadań systemu operacyjnego i.e dostęp do katalogów
importuj system
importuj datę i godzinę
importuj smtplib
// zdefiniowanie funkcji, która będzie wysyłała e-maile
def send_mail(adres_e-mail_odbiorcy, imię):
sender_mail_address = "[email chroniony]"
passwd = "hasło nadawcy"
//połączenie z serwerem Gmail z nazwą domeny i numerem portu
obj = smtplib.SMTP('smtp.gmail.com”, 587)
obiekt.ehlo()
obiekt.starttls()
// logowanie do konta gmail
obiekt.login(sender_mail_address, passwd)
// wysyłanie poczty na adres 'reciever_mail_address'.
obiekt.sendmail(sender_mail_address, reciever_mail_address, "Temat: Mail z życzeniami urodzin\n\n HappyBirthday "+name)
// kończę połączenie
obiekt.porzucić()
// Główny korpus
// przejście do katalogu, w którym znajduje się plik zawierający dane
os.chdir("ścieżka_do_pliku_danych_urodzin")
podczas gdy 1:
// pobieranie daty i czasu chwili obecnej
dzisiaj = data/godzina.data i godzina.dzisiaj()
dzisiaj = str(dzisiaj)
// pobieranie bieżącego roku, miesiąca, dnia, godziny, minuty i sekundy
bieżący_rok = dzisiaj[0:4]
bieżący_miesiąc = dzisiaj[5:7]
bieżący_dzień = dzisiaj[8:10]
bieżąca_godzina = dzisiaj[11:13]
bieżąca_minuta = dzisiaj[14:16]
current_sec = dzisiaj[17:19]
// otwieranie pliku urodzin w obiekcie 'birthday_file' w trybie odczytu
plik_urodzin = otwórz('plik_urodzin','r')
// zapisanie wszystkich linii 'birthday_file' na liście linii
linie = plik_urodzin.readlines()
// zamknięcie obiektu 'birthday_file''
plik_urodziny.blisko()
// czytanie każdej linii za pomocą pętli for
dla linii w liniach:
// tworzenie wyrażenia regularnego w celu znalezienia daty w 'birthday_file'
dataEx = re.kompiluj(r"\d4-\d2-\d2")
findDate=dataEx.szukaj(wiersz)
data = znajdźDatę.Grupa()
// pobieranie miesiąca_urodzin i dnia_urodzin z pliku
miesiąc_urodzin = data[5:7]
dzień_urodzin = data[8:10]
// tworzenie wyrażenia regularnego, aby znaleźć adres e-mail z pliku_urodzin
mailEx = re.kompiluj(r"\w*@\w*.pl")
findMail = pocztaEx.szukaj(wiersz)
odbiorca_mail = znajdźPocztę.Grupa()
//tworzenie wyrażenia regularnego, aby znaleźć imię osoby
nazwaEx = re.kompiluj(r"\w*")
findName = nazwaEx.szukaj(wiersz)
nazwa = znajdźNazwę.Grupa()
// sprawdzanie czy ktoś ma urodziny czy nie
if bieżący_miesiąc == urodziny_miesiąc i =bieżący_dzień == urodziny_dzień:
// wysłanie maila dokładnie o 08:00
if bieżąca_godzina == '08' i bieżąca_minuta == '00' i bieżąca_s == '00':
// wywołanie funkcji 'send_mail'
send_mail(recever_mail, imię)
Teraz tworzymy 'plik_urodzinowy', w którym zapisujemy imiona, adresy e-mail i ich datę urodzenia. To jest prosty plik tekstowy i wygląda tak.
Wyjaśnienie
Przeczytamy ten plik za pomocą skryptu python i sprawdzimy, czyje urodziny nadchodzą i życzymy im. Przede wszystkim zaimportujemy niektóre moduły. Moduł DATETIME posiada funkcje, które podają nam aktualną datę i godzinę oraz wiele innych. Ale użyjemy tego tylko do znalezienia aktualnej daty i godziny. Moduł SMTPLIB służy do wysyłania poczty i został wyjaśniony powyżej. Moduł RE posiada funkcje, które służą do znajdowania wyrażenia regularnego z ciągu znaków.
W tym skrypcie definiujemy funkcję 'send_mail', która wysyła pocztę na adres 'reciever_mail_address', którego nazwa to 'name'. Oba argumenty są przekazywane do funkcji z głównego ciała msg. W głównej części skryptu zobaczymy, jak znajdujemy 'reciever_mail_address' i 'name'.
Wysyłanie e-maili za pomocą smtplib zostało wyjaśnione powyżej, więc możesz je przeczytać i nie będzie tutaj omawiane.
W głównym ciele przechodzimy do katalogu, w którym zapisaliśmy 'birthday_file' za pomocą 'os.chdir()'. Następnie mamy pętlę while, która zawsze jest prawdziwa, więc będzie stale sprawdzać urodziny. Teraz otrzymujemy aktualną datę i godzinę i zapisujemy ją w zmiennej „dzisiaj”. To wygląda tak.
2019-11-01 16:19:07.144925Wyodrębnimy rok, miesiąc, dzień, godzinę, minuty i sekundy za pomocą wskaźników tych wielkości. Następnie otworzymy plik_urodzinowy w obiekcie 'plik_urodzinowy' w trybie odczytu, więc możemy go tylko odczytać. Teraz zapiszemy wszystkie wiersze tego pliku na liście wierszy. 'plik_urodzinowy.readlines()' zapisze każdą linię na liście 'lines'. Następnie zamkniemy plik_urodzin za pomocą „plik_urodzin”.funkcja close()'.
Teraz przeczytamy każdą linię po kolei za pomocą pętli for. W każdym wierszu dostępne są tylko dane jednej osoby w pliku 'birthday_file', więc w tej pętli odczytujemy dane tylko jednej osoby na raz.
Następnie wyodrębnimy datę urodzenia, adres e-mail i imię osoby korzystającej z modułu RE. Jak zapisaliśmy datę w następującym formacie
RRRR-MM-DDUtworzymy więc wyrażenie regularne 'dateEx', które znajdzie ten format w wierszu.
re.kompiluj(r”\d4-\d2-\d2”)Powyższe polecenie znajdź ciąg, który ma „4 cyfry”, po których następuje „-”, a następnie „2 cyfry”, a następnie „-” i „2 cyfry”. To da nam datę urodzenia osoby, więc z tego wyrażenia wyodrębnimy dzień_urodzenia i miesiąc_urodzenia.
Podobnie znajdziemy adres e-mail za pomocą wyrażeń regularnych. Następnie porównamy urodziny_miesiąc i bieżący_miesiąc oraz urodziny_dzień i bieżący_dzień. Jeśli te warunki są spełnione, wyślemy wiadomość urodzinową za pomocą funkcji „send_mail” dokładnie o godzinie „08:00”.
Automatyczne uruchamianie skryptu przez Cronjob
Teraz upewnimy się, że ten skrypt Pythona będzie działał za każdym razem. W tym celu dodamy to zadanie do crontab. Crontab w Linuksie służy do automatycznego wykonywania zadań. Musimy tylko dodać zadanie do crontab. Aby to zrobić, wykonaj podane kroki.
- Otwórz crontab, aby dodać zadanie w terminalu za pomocą następującego polecenia
- Na końcu tego pliku wpisz następujące polecenie bez #
Powyższe polecenia umożliwią Twojemu systemowi uruchomienie skryptu Pythona za każdym razem, gdy ponownie uruchomisz system. W ten sposób twój system będzie uruchamiał skrypt Pythona za każdym razem, gdy twój system jest włączony.