Inviare email con Python e WSL dalla finestra terminale di Windows

Come inviare email dalla finestra terminale in Windows utilizzando uno script Python e WSL 2.

Quando si compone un’email con un client di posta elettronica oppure con una webmail essa potrebbe non apparire allo stesso modo ai destinatari. Questo vale soprattutto per i messaggi di posta che si basano su un layout complesso, con tanti elementi grafici che si susseguono nel corpo del testo.

Chi si occupa di email marketing usa strumenti a pagamento come Litmus che si occupano di controllare la corretta resa del messaggio di posta su tutti i principali client e sulle varie webmail. Anche Mailtrap, del quale abbiamo parlato nell’articolo sul perché le email vanno nello Spam, aiuta a riconoscere e risolvere eventuali problemi di compatibilità nel codice HTML dei messaggi di posta che si inviano.

Inviare email con Python aiuta a liberarsi delle personalizzazioni che il client email o la webmail compiono sul corpo del messaggio alterandone la resa, spesso senza che l’utente ne sia consapevole.

Come inviare email con Python e WSL 2 in Windows 10 e 11

WSL 2 è il Sottosistema Windows per Linux che consente di installare ed eseguire le principali distribuzioni Linux in Windows avviandole da una finestra.

Compatibile con Windows 10 e Windows 11, WSL 2 risulta estremamente comodo per eseguire script Python senza installare nulla in Windows.

Basta digitare cmd nella casella di ricerca di Windows, scegliere Esegui come amministratore quindi impartire il comando seguente per installare WSL e Ubuntu:

wsl --install -d Ubuntu-20.04

Alla comparsa della finestra del terminale di Ubuntu, dopo aver impostato un account utente root e la relativa password, si può scrivere quanto segue per aggiornare l’installazione di Ubuntu:

sudo apt update && sudo apt upgrade -y

A questo punto, digitando nano invia-email.py si può creare uno script Python per l’invio di email dalla finestra terminale.

Selezionando il codice Python che forniamo di seguito e premendo il tasto destro del mouse nella finestra dell’editor nano, è possibile predisporre uno script che consente di inviare un’email MIME multipart usando in questo caso il server SMTP Google e il protocollo TLS.

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
port = 587
smtp_server = "smtp.gmail.com"
login = "username@gmail.com"
password = "***********************"
sender_email = "Mario Rossi <nomeutente@provider.abc>"
receiver_email = "destinatario@provider.xyz"
message = MIMEMultipart("alternative")
message["Subject"] = "Messaggio di prova"
message["From"] = sender_email
message["To"] = receiver_email
# Porzione testo puro del messaggio
text = """\
Versione testuale del messaggio email inviato."""
# Porzione HTML del messaggio
with open("body.html", "r") as textfile:
    content = textfile.readlines()
    html = "".join(content)
    #html = html.encode('utf-8')
    textfile.close()

# Conversione in oggetti MIMEText e aggiunta al messaggio MIMEMultipart
part1 = MIMEText(text, "plain")
part2 = MIMEText(html, "html")
message.attach(part1)
message.attach(part2)

# Invio email al server SMTP specificato
with smtplib.SMTP(smtp_server, port) as server:
    server.ehlo()
    server.starttls()
    server.login(login, password)
    server.sendmail(
        sender_email, receiver_email, message.as_string()
    )
print("Inviato")

Le variabili port e smtp_server permettono di impostare porta di comunicazione utilizzata dal server di posta e indirizzo del server SMTP.
I successivi login e password devono essere impostati con le credenziali corrette per effettuare l’autenticazione sul server SMTP. Nel caso di Google, bisogna creare una password per le app e specificarla al posto degli asterischi.

Le variabili sender_email e receiver_email consentono di impostare mittente e destinatario del messaggio di posta.

Più sotto viene specificato il testo puro da utilizzare come corpo dell’email e il file (body.html) il cui contenuto viene usato come codice HTML del messaggio. Le due porzioni di contenuto vengono poi combinate, come anticipato in precedenza, a formare il messaggio MIME multipart.

Nell’esempio, il file body.html contiene già il riferimento esplicito all’uso della codifica dei caratteri UTF-8: la riga html = html.encode('utf-8') è stata quindi opportunamente commentata ma è utilizzabile al bisogno.
Il file body.html deve essere creato nella stessa cartella dello script Python invia-email.py. Per copiarlo rapidamente si può premere Windows+R, digitare \\WSL$, selezionare la distribuzione Ubuntu, la cartella home, cliccare sul nome dell’account utente aggiunto in precedenza e incollare il file HTML.

Digitando python3 invia-email.py nella finestra di WSL l’email verrà correttamente spedita, in questo caso utilizzando i server SMTP di Google.

Accedendo al sorgente dell’email così spedita (di solito basta premere CTRL+U in tutti i principali gestori di posta), subito dopo gli header si troveranno le due porzioni del messaggio, l’una dopo l’altra. Prima la parte testuale (che viene mostrata a coloro che usano sistemi non in grado di supportare il formato HTML) e poi il corpo del messaggio in HTML.

Ti consigliamo anche

Link copiato negli appunti