Come inviare e-mail tramite Gmail in Python?

L’invio manuale di una grande quantità di e-mail è un compito noioso. Puoi utilizzare servizi di terze parti per inviare le email in blocco alla volta.

Che ne dici di creare il tuo script personalizzato per inviare e-mail?

Non è meraviglioso?

Si lo è. Scriveremo uno script in Python per inviare e-mail.

Python ha una libreria chiamata smtplib che viene utilizzata per inviare e-mail. La libreria smtplib è basata su SMTP (Simple Mail Transport Protocol). SMTP viene utilizzato per inviare e-mail ad altri.

Configura Gmail

Qui utilizzeremo Gmail come provider di posta elettronica. Google non consente agli script di accedere. E dobbiamo apportare una modifica alla sicurezza del nostro account Gmail che consenta agli script di accedere al nostro account Gmail.

La modifica dell’opzione di sicurezza nel nostro account Gmail non va bene in quanto consente ad altri di accedere all’account molto facilmente. Si consiglia di creare un nuovo account Gmail. Vai alle impostazioni qui e attiva l’impostazione Consenti app meno sicure: ON.

Se non ti senti a tuo agio con l’attivazione dell’impostazione precedente, puoi utilizzare l’API di Google per accedere al tuo account Gmail. Puoi trovare lo script per utilizzare le API di Google per l’autenticazione qui.

Passaggi per inviare posta

Alcuni passaggi devono essere eseguiti per inviare una mail utilizzando la libreria smtplib. Vediamo prima i passaggi e poi scriveremo la sceneggiatura.

#1. Connessione al server SMTP

Ciascun provider di servizi avrà un nome di dominio e una porta del server SMTP diversi. Dobbiamo utilizzare il nome di dominio del server SMTP e la porta del provider di posta elettronica che utilizzeremo nello script. Il nome di dominio e la porta del server SMTP per Gmail sono smtp.gmail.com e 465.

Useremo la crittografia SSL per la connessione al server SMTP poiché è più sicura della crittografia TSL. Se si desidera utilizzare la crittografia TSL, utilizzare la porta 587 anziché 465. Il nome di dominio del server SMTP sarà diverso in base al provider del servizio di posta elettronica.

Il codice per connettersi al server SMTP

server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)

#2. Login

Una volta stabilita la connessione al server SMTP, possiamo accedere utilizzando l’indirizzo e-mail e la password con il metodo dell’oggetto login SMTP. Il codice ha il seguente aspetto.

server.login(sender_email, password)

#3. Inviare una mail

Dopo il login, non c’è modo di aspettare per inviare la posta. Invia la posta utilizzando il metodo sendmail. Assicurati di inviare la posta nel seguente formato.

Oggetto: your_subject_for newline mail_content

Gli spazi non sono necessari. Sono solo per chiarimenti nel formato sopra. Vediamo il codice di esempio.

server.sendmail(sender_mail, email, f"Subject: {subject}n{content}")

#4. Uscire

Non dimenticare di chiudere l’SMTP c

Abbiamo visto i passaggi per inviare posta utilizzando Python. Ma non abbiamo discusso il codice completo. Esaminiamo rapidamente il codice.

import smtplib, ssl

class Mail:

    def __init__(self):
        self.port = 465
        self.smtp_server_domain_name = "smtp.gmail.com"
        self.sender_mail = "GMAIL_ADDRESS"
        self.password = "SECURE_PASSWORD"

    def send(self, emails, subject, content):
        ssl_context = ssl.create_default_context()
        service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context)
        service.login(self.sender_mail, self.password)
        
        for email in emails:
            result = service.sendmail(self.sender_mail, email, f"Subject: {subject}n{content}")

        service.quit()


if __name__ == '__main__':
    mails = input("Enter emails: ").split()
    subject = input("Enter subject: ")
    content = input("Enter content: ")

    mail = Mail()
    mail.send(mails, subject, content)

Abbiamo creato una classe chiamata Mail. E ha un metodo chiamato send per inviare le mail. Il corso di scrittura o semplicemente no dipende da te. La classe lo rende più leggibile. Abbiamo implementato tutti i passaggi discussi sopra uno per uno nel metodo di invio.

Evviva! hai inviato una mail usando lo script Python.

Contenuto HTML

Cosa succede se si desidera inviare la posta in HTML? È possibile?

Sì, perché no. Possiamo inviare la posta usando HTML la libreria chiamata email.mime. È una libreria integrata.

Il MIMO è uno standard utilizzato per estendere il formato delle email per supportare programmi applicativi, video, immagini, ecc.,

Ci sono due classi di cui abbiamo bisogno dal modulo email.mime. Sono MIMEText e MIMEMultipart. Vediamo una breve spiegazione su di loro.

#1. MIMETesto

La classe MIMEText viene utilizzata per scrivere il contenuto della nostra posta in HTML. Creeremo un’istanza della classe MIMEText passando il contenuto HTML e il tipo di contenuto. Vedere il codice di esempio di seguito.

html_content = MIMEText(html_template, 'html')

Alcuni servizi di posta non supportano il rendering HTML. Quindi, è meglio creare due istanze della classe MIMEText per testo semplice e HTML.

#2. MIMEMultipart

La classe MIMEMultipart viene utilizzata per semplificare la formattazione e la scrittura dell’oggetto, dall’indirizzo, all’indirizzo ecc. Daremo il contenuto creato con la classe MIMEText a MIMEMultipart utilizzando il metodo attach.

Dobbiamo assicurarci che l’istanza di MIMEMultipart sia creata con l’argomento alternativo per rendere testo normale o HTML. Mandiamo una mail con contenuto HTML.

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


class Mail:

    def __init__(self):
        ...

    def send(self, emails):
        ssl_context = ssl.create_default_context()
        service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context)
        service.login(self.sender_mail, self.password)
        
        for email in emails:
            mail = MIMEMultipart('alternative')
            mail['Subject'] = 'winadmin.it Celebrations'
            mail['From'] = self.sender_mail
            mail['To'] = email

            text_template = """
            winadmin.it

            Hi {0},
            We are delighted announce that our website hits 10 Million views this month.
            """
            html_template = """
            <h1>winadmin.it</h1>

            <p>Hi {0},</p>
            <p>We are delighted announce that our website hits <b>10 Million</b> views last month.</p>
            """

            html_content = MIMEText(html_template.format(email.split("@")[0]), 'html')
            text_content = MIMEText(text_template.format(email.split("@")[0]), 'plain')

            mail.attach(text_content)
            mail.attach(html_content)

            service.sendmail(self.sender_mail, email, mail.as_string())

        service.quit()


if __name__ == '__main__':
    mails = input("Enter emails: ").split()

    mail = Mail()
    mail.send(mails)

È inoltre possibile aggiungere una copia per conoscenza nascosta utilizzando l’attributo Bcc nell’istanza MIMEMultipart.

Aggiunta di allegati

Gli allegati possono essere immagini, pdf, documenti, fogli, ecc. Nella classe email.mime si chiama MIMEBase. È usato per aggiungere allegati alla posta.

Aggiungiamo un allegato alla mail di cui sopra.

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from pathlib import Path


class Mail:

    def __init__(self):
        ...

    def send(self, emails):
        ## login...
        
        for email in emails:
            ## MIMEMultipart instance

            ## text and html templates

            ## MIMEText instances

            ## attaching messages to MIMEMultipart

            ## attaching an attachment
            file_path = "winadmin.it-logo.png"
            mimeBase = MIMEBase("application", "octet-stream")
            with open(file_path, "rb") as file:
                mimeBase.set_payload(file.read())
            encoders.encode_base64(mimeBase)
            mimeBase.add_header("Content-Disposition", f"attachment; filename={Path(file_path).name}")
            mail.attach(mimeBase)

            ## sending mail

        service.quit()


if __name__ == '__main__':
    mails = input("Enter emails: ").split()

    mail = Mail()
    mail.send(mails)

Invia a messaggi di posta in blocco in una sola volta

Abbiamo utilizzato un ciclo per inviare la stessa posta a più membri. Questo è un caso (quando non vuoi che i ricevitori sappiano di altri ricevitori).

Supponiamo di dover inviare la stessa posta a 1000 membri contemporaneamente dello stesso gruppo. In tali casi, l’utilizzo di un ciclo non sarà appropriato. Possiamo aggiungere più email nel campo A nella composizione generale della posta. Come farlo nello script Python?

Dobbiamo combinare l’elenco delle email come una stringa separata da una virgola e uno spazio. Possiamo usare la stringa del metodo join per combinare tutte le email come una stringa. Vedi il codice per combinare le email come una stringa.

", ".join(emails)

Sostituisci il campo A nello script sopra usando la stringa sopra. Ecco fatto, hai inviato la posta a posta in blocco in una sola volta.

Conclusione

Esistono alcune librerie di terze parti per inviare e-mail in Python. Alcuni di loro sono Buste, Yagmail, Fianco, ecc., queste librerie ci aiutano a scrivere script con poche righe di codice. Puoi anche esplorarli.

Ora puoi automatizzare le tue email usando gli script Python. La struttura dell’invio di e-mail sarà diversa in base al tuo caso d’uso. Abbiamo visto diversi scenari di invio di e-mail. Puoi facilmente personalizzare gli script discussi nel tutorial in base al tuo caso d’uso. Ho preso il riferimento da questo articolo.

Buona programmazione 🙂