Come inviare e-mail tramite Gmail in Python?

Pubblicato: 2021-06-06

L'invio manuale di una massa di e-mail è un'attività noiosa. 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 sul protocollo 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 l'accesso agli script. 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 è buona 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

È necessario eseguire alcuni passaggi per inviare una posta utilizzando la libreria smtplib . Vediamo prima i passaggi e poi scriveremo lo script.

#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 del server SMTP e la porta per Gmail sono smtp.gmail.com e <em>465</em> .

Utilizzeremo la crittografia SSL per la connessione al server SMTP poiché è più sicura della crittografia TSL . Se desideri utilizzare la crittografia TSL , utilizza 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 SMTP di login . Il codice si presenta come segue.

 server.login(sender_email, password)

#3. Inviare una mail

Dopo il login, non possiamo 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. Esentato

Non dimenticare di uscire da SMTP c

Abbiamo visto i passaggi per inviare la 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. La lezione 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 utilizzando lo script Python.

Contenuto HTML

E se volessi inviare la posta in HTML? È possibile?

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

Il MIME è 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. MIMEtext

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 normale e HTML.

#2. MIMEMultipart

La classe MIMEMultipart viene utilizzata per semplificare la formattazione e la scrittura dell'oggetto, da indirizzo, ad 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 alternative per rendere testo normale o HTML. Inviamo 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'] = 'Geekflare Celebrations' mail['From'] = self.sender_mail mail['To'] = email text_template = """ Geekflare Hi {0}, We are delighted announce that our website hits 10 Million views this month. """ html_template = """ <h1>Geekflare</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)

Puoi anche aggiungere una copia per Bcc utilizzando l'attributo Bcc nell'istanza MIMEMultipart.

Aggiunta di allegati

Gli allegati possono essere immagini, pdf, documenti, fogli, ecc. Si chiama MIMEBase nella classe email.mime . Viene utilizzato 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 = "Geekflare-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)

Mail to bulk mail in Once

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 della posta generale. Come farlo nello script Python?

Dobbiamo combinare l'elenco delle e-mail 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 precedente utilizzando la stringa precedente. Ecco fatto, hai inviato la posta a posta in blocco in una volta.

Conclusione

Esistono alcune librerie di terze parti per inviare e-mail in Python. Alcune di esse sono Envelopes, Yagmail, Flanker, 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 delle 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.

Codifica felice