CodeGym /Kursy /Python SELF PL /Praca z pocztą elektroniczną

Praca z pocztą elektroniczną

Python SELF PL
Poziom 24 , Lekcja 2
Dostępny

8.1 Czytanie poczty

Myślę, że już wystarczająco dobrze zrozumieliśmy podstawy działania sieci. Zajmijmy się czymś bardziej interesującym — w końcu w sieci jest tyle ciekawych rzeczy. Co powiesz na czytanie i wysyłanie poczty?

E-mail pojawił się 50 lat temu, 20 lat przed pojawieniem się pierwszej przeglądarki. Wówczas do wysyłania poczty używano specjalnych programów. Co to dla nas oznacza? To, że standard (protokół) obsługi poczty jest prosty jak drut.

Protokół POP3 (Post Office Protocol version 3) jest używany do odbierania wiadomości e-mail z serwera pocztowego. W przeciwieństwie do IMAP, POP3 zwykle pobiera wiadomości na lokalny komputer i usuwa je z serwera. W Pythonie do pracy z POP3 można używać biblioteki poplib.

Uwaga: W przeciwieństwie do POP3, protokół IMAP (Internet Message Access Protocol) pozwala przechowywać wiadomości na serwerze i synchronizować ich stan między urządzeniami. IMAP jest bardziej wygodny, jeśli czytasz pocztę z różnych urządzeń, natomiast POP3 lepiej nadaje się do przechowywania wiadomości lokalnie na jednym urządzeniu.

Główne kroki uzyskiwania listy wiadomości:

  • Połączenie z serwerem pocztowym.
  • Uwierzytelnianie.
  • Uzyskanie listy wiadomości.
  • Pobranie i czytanie wiadomości.
  • Rozłączenie z serwerem.

Do napisania pierwszej aplikacji potrzebne nam będą dwie biblioteki: poplib i email. Jeśli ich nie masz — zainstaluj. Jak używać menedżera pip pewnie już wiesz.

Ważne: Przy pracy z pocztą elektroniczną zawsze przestrzegaj zasad bezpieczeństwa. Nigdy nie przechowuj haseł w formie jawnej w kodzie. Używaj zmiennych środowiskowych lub bezpiecznych schowków na dane uwierzytelniające. Upewnij się również, że Twój kod nie trafi do publicznego dostępu, aby uniknąć wycieku poufnych informacji.

1. Połączenie i uwierzytelnianie:

Łączymy się z serwerem pocztowym przez SSL i logujemy się do skrzynki pocztowej przy użyciu podanych danych uwierzytelniających.


mailbox = poplib.POP3_SSL(pop3_server)
mailbox.user(username)
mailbox.pass_(password)  # Używamy pass_, aby uniknąć konfliktu z słowem kluczowym pass w Pythonie

2. Uzyskanie informacji o skrzynce pocztowej:

Uzyskujemy liczbę wiadomości w skrzynce pocztowej.


num_messages = len(mailbox.list()[1])
print(f"Liczba wiadomości: {num_messages}")

3. Pobranie i czytanie wiadomości:

Pobieramy i czytamy ostatnią wiadomość.


# Przykład: Czytanie ostatniej wiadomości
if num_messages > 0:
    response, lines, octets = mailbox.retr(num_messages)
    message = '\n'.join(line.decode('utf-8') for line in lines)
    print("Zawartość ostatniej wiadomości:")
    print(message)

Do parsowania i wyświetlania zawartości jest specjalna biblioteka — email. Potrafi dekodować zawartość wiadomości, załączników do nich, w tym nagłówki i treść wiadomości.

Oto jak będzie wyglądać finalna wersja naszego klienta pocztowego.


import poplib

# Dane uwierzytelniające
username = 'your_email@example.com'
password = 'your_password'
            
# Połączenie z serwerem pocztowym Gmail
pop3_server = 'pop.gmail.com'
mailbox = poplib.POP3_SSL(pop3_server, 995)
            
# Logowanie do skrzynki pocztowej
mailbox.user(username)
mailbox.pass_(password)  # Używamy pass_, aby uniknąć konfliktu z słowem kluczowym pass w Pythonie
            
# Uzyskanie informacji o skrzynce pocztowej
num_messages = len(mailbox.list()[1])
print(f"Liczba wiadomości: {num_messages}")
            
# Przykład: Czytanie ostatniej wiadomości
if num_messages > 0:
    response, lines, octets = mailbox.retr(num_messages)
    message = '\n'.join(line.decode('utf-8') for line in lines)
    print("Zawartość ostatniej wiadomości:")
    print(message)
            
# Zamknięcie połączenia
mailbox.quit()

Możecie spróbować przeczytać swoje wiadomości, tylko podajcie prawidłowy POP3-server. Na przykład w przykładzie powyżej podałem dane serwera Gmail. Jeśli macie inny serwer pocztowy, to jego dane łatwo można znaleźć w internecie.

8.2 Wysyłanie poczty

Do wysyłania e-maili za pomocą protokołu SMTP (Simple Mail Transfer Protocol) w Pythonie można używać wbudowanej biblioteki smtplib. Ten moduł udostępnia funkcje do ustanawiania połączenia z SMTP-serverem, uwierzytelnienia i wysyłania wiadomości.

Główne kroki wysyłania poczty:

  • Połączenie z SMTP-serverem.
  • Uwierzytelnianie.
  • Formowanie wiadomości.
  • Wysyłanie wiadomości.
  • Zamknięcie połączenia.

1. Połączenie z SMTP-serverem:

Łączymy się z SMTP-serverem i przechodzimy na bezpieczne połączenie z pomocą TLS.


server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()  # Bezpieczne połączenie

2. Uwierzytelnianie:

Logujemy się na SMTP-server przy użyciu danych uwierzytelniających.


server.login(username, password)

3. Formowanie prostego wiadomości w formacie tekstowym:


message = f"From: {from_addr}\nTo: {to_addr}\nSubject: {subject}\n\n{body}"

4. Wysyłanie wiadomości:


server.sendmail(from_addr, to_addr, message)

5. Zamknięcie połączenia:


server.quit()

Wygląda trochę prościej niż ostatnio, co nie może nie cieszyć.

Cały kod wraz z obsługą błędów będzie wyglądać tak:


import smtplib

# Dane uwierzytelniające
smtp_server = 'smtp.gmail.com'
smtp_port = 587
username = 'your_email@gmail.com'
password = 'your_app_password'  # Użyj hasła aplikacji
            
# Adresy nadawcy i odbiorcy
from_addr = 'your_email@gmail.com'
to_addr = 'recipient@example.com'
            
# Temat i treść wiadomości
subject = 'Temat wiadomości'
body = 'To jest treść wiadomości.'
            
# Formowanie wiadomości w formacie tekstowym
message = f"From: {from_addr}\nTo: {to_addr}\nSubject: {subject}\n\n{body}"
            
try:
    # Połączenie z SMTP-serverem
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # Bezpieczne połączenie
            
    # Uwierzytelnianie
    server.login(username, password)
            
    # Wysyłanie wiadomości
    server.sendmail(from_addr, to_addr, message)
    print("Wiadomość została pomyślnie wysłana!")
except Exception as e:
    print(f"Błąd podczas wysyłania wiadomości: {e}")
finally:
    # Zamknięcie połączenia
    server.quit()

Większość kodu tutaj to komentarze i ustawienia serwera, w rzeczywistości można wysłać wiadomość w 5 linijkach. Spróbujcie — to bardzo ciekawe.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION