Guide
Python: come inviare email automatiche con smtplib
16 Aprile 2026
Autore: Nicodemo Bonofiglio
⏱ 5 min lettura
Inviare email automaticamente con Python è una delle automazioni più utili che puoi imparare. Con meno di 30 righe di codice puoi mandare report giornalieri, notifiche di sistema, alert su dati anomali o conferme automatiche — senza pagare servizi terzi. In questa guida ti mostro tutto, dalla configurazione iniziale ai casi d’uso avanzati.
Prerequisiti: Python 3.8 o superiore installato. Nessuna libreria esterna richiesta — smtplib è inclusa nella libreria standard di Python.
Come funziona smtplib
SMTP (Simple Mail Transfer Protocol) è il protocollo standard per inviare email. Python include la libreria smtplib che gestisce la connessione al server email e l’invio — senza installare nulla.
Il flusso è semplice:
- Apri una connessione al server SMTP (Gmail, Outlook, ecc.)
- Autenticati con email e password (o App Password)
- Componi il messaggio
- Invia e chiudi la connessione
Setup Gmail — App Password obbligatoria
Google non permette più di usare la password del tuo account direttamente. Devi creare una App Password dedicata:
- Vai su myaccount.google.com
- Sicurezza → Verifica in due passaggi (deve essere attiva)
- Sicurezza → Password per le app
- Seleziona “Altra” → dai un nome (es. “Python Script”) → Genera
- Copia la password di 16 caratteri generata — la usi al posto della password normale
Sicurezza: non scrivere mai email e password direttamente nel codice. Usa variabili d’ambiente o un file .env separato — ti mostro come più avanti.
Il codice base — email semplice in testo
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# Configurazione
MITTENTE = “tua@gmail.com”
APP_PASSWORD = “xxxx xxxx xxxx xxxx” # App Password Gmail
DESTINATARIO = “destinatario@email.it”
# Crea il messaggio
msg = MIMEMultipart()
msg[‘From’] = MITTENTE
msg[‘To’] = DESTINATARIO
msg[‘Subject’] = “Report automatico Python”
# Corpo del messaggio
corpo = “””
Ciao,
questo messaggio è stato inviato automaticamente da Python.
Buona giornata!
“””
msg.attach(MIMEText(corpo, ‘plain’, ‘utf-8’))
# Invio
with smtplib.SMTP_SSL(‘smtp.gmail.com’, 465) as server:
server.login(MITTENTE, APP_PASSWORD)
server.send_message(msg)
print(“Email inviata con successo!”)
Email HTML — con formattazione e colori
Puoi inviare email con HTML per report più professionali:
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
msg = MIMEMultipart(‘alternative’)
msg[‘Subject’] = “Report settimanale”
msg[‘From’] = MITTENTE
msg[‘To’] = DESTINATARIO
# Versione testo (fallback)
testo = “Visualizza questo report nel browser.”
# Versione HTML
html = “””
<html>
<body>
<h2 style=”color:#0066cc;”>Report Settimanale</h2>
<table border=”1″ cellpadding=”8″ style=”border-collapse:collapse;”>
<tr style=”background:#0066cc;color:#fff;”>
<th>Metrica</th><th>Valore</th><th>Variazione</th>
</tr>
<tr>
<td>Visitatori</td><td>1.250</td><td style=”color:green;”>+12%</td>
</tr>
<tr style=”background:#f5f5f5;”>
<td>Conversioni</td><td>87</td><td style=”color:red;”>-3%</td>
</tr>
</table>
<p>Report generato automaticamente il {data}</p>
</body>
</html>
“””.format(data=__import__(‘datetime’).date.today())
msg.attach(MIMEText(testo, ‘plain’, ‘utf-8’))
msg.attach(MIMEText(html, ‘html’, ‘utf-8’))
with smtplib.SMTP_SSL(‘smtp.gmail.com’, 465) as server:
server.login(MITTENTE, APP_PASSWORD)
server.send_message(msg)
Email con allegato — invia file PDF o Excel
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import os
msg = MIMEMultipart()
msg[‘From’] = MITTENTE
msg[‘To’] = DESTINATARIO
msg[‘Subject’] = “Report con allegato”
msg.attach(MIMEText(“In allegato il report mensile.”, ‘plain’, ‘utf-8’))
# Allegato
percorso_file = “report_aprile.xlsx”
with open(percorso_file, “rb”) as f:
parte = MIMEBase(“application”, “octet-stream”)
parte.set_payload(f.read())
encoders.encode_base64(parte)
parte.add_header(
“Content-Disposition”,
f”attachment; filename={os.path.basename(percorso_file)}”
)
msg.attach(parte)
with smtplib.SMTP_SSL(‘smtp.gmail.com’, 465) as server:
server.login(MITTENTE, APP_PASSWORD)
server.send_message(msg)
Gestire le credenziali in modo sicuro
Non scrivere mai email e password nel codice sorgente. Usa le variabili d’ambiente:
# Metodo 1 — variabili d’ambiente (consigliato)
import os
MITTENTE = os.environ.get(‘EMAIL_MITTENTE’)
APP_PASSWORD = os.environ.get(‘EMAIL_PASSWORD’)
# Metodo 2 — file .env con python-dotenv
# pip install python-dotenv
from dotenv import load_dotenv
load_dotenv()
MITTENTE = os.environ.get(‘EMAIL_MITTENTE’)
APP_PASSWORD = os.environ.get(‘EMAIL_PASSWORD’)
# File .env (aggiungi al .gitignore!)
# EMAIL_MITTENTE=tua@gmail.com
# EMAIL_PASSWORD=xxxx xxxx xxxx xxxx
Inviare email automaticamente ogni giorno — con schedule
# pip install schedule
import schedule
import time
def invia_report_giornaliero():
# … codice invio email …
print(“Report inviato alle”, __import__(‘datetime’).datetime.now())
# Schedula ogni giorno alle 8:00
schedule.every().day.at(“08:00”).do(invia_report_giornaliero)
# Oppure ogni lunedì alle 9:00
schedule.every().monday.at(“09:00”).do(invia_report_giornaliero)
while True:
schedule.run_pending()
time.sleep(60)
Server SMTP dei principali provider
| Provider |
Server SMTP |
Porta SSL |
Porta TLS |
| Gmail | smtp.gmail.com | 465 | 587 |
| Outlook/Hotmail | smtp.office365.com | – | 587 |
| Yahoo | smtp.mail.yahoo.com | 465 | 587 |
| Libero/Tin.it | smtp.libero.it | 465 | 587 |
Errori comuni e come risolverli
SMTPAuthenticationError: Username and Password not accepted
Stai usando la password del tuo account invece dell’App Password. Genera una App Password da myaccount.google.com.
Connection refused su porta 465
Usa smtplib.SMTP_SSL per la porta 465, oppure smtplib.SMTP con server.starttls() per la porta 587.
Email finisce nello spam
Aggiungi un oggetto chiaro, un testo plain-text oltre all’HTML, e non usare parole come “GRATIS” o “URGENTE” nell’oggetto.
Conclusione
Con smtplib puoi automatizzare l’invio di email in pochi minuti senza dipendere da servizi terzi. Il caso d’uso più comune è il report automatico: leggi dati da Excel o da un database, costruisci una tabella HTML, e mandi l’email ogni mattina prima che arrivi in ufficio.
Nel prossimo articolo vedremo come leggere dati da Excel con openpyxl e inserirli automaticamente nel corpo dell’email.
Lascia un commento
Devi essere connesso per inviare un commento.