Comment envoyer des e-mails via Gmail en Python ?

Publié: 2021-06-06

L'envoi manuel d'un grand nombre d'e-mails est une tâche fastidieuse. Vous pouvez utiliser des services tiers pour envoyer les e-mails en masse à la fois.

Et si vous créiez votre propre script personnalisé pour envoyer des e-mails ?

N'est-ce pas merveilleux ?

Ouais c'est ça. Nous allons écrire un script en Python pour envoyer des emails.

Python a une bibliothèque appelée smtplib qui est utilisée pour envoyer des e-mails. La bibliothèque smtplib est basée sur le SMTP (Simple Mail Transport Protocol). SMTP est utilisé pour envoyer des e-mails à d'autres.

Configurer Gmail

Ici, nous allons utiliser Gmail comme fournisseur de messagerie. Google n'autorise pas la connexion des scripts. Et nous devons modifier la sécurité de notre compte Gmail pour permettre aux scripts de se connecter à notre compte Gmail.

Changer l'option de sécurité dans notre compte Gmail n'est pas bon car cela permet aux autres d'accéder au compte très facilement. Il est recommandé de créer un nouveau compte Gmail. Accédez aux paramètres ici et activez le paramètre Autoriser les applications moins sécurisées : ON .

Si vous n'êtes pas à l'aise avec l'activation du paramètre ci-dessus, vous pouvez utiliser l'API Google pour vous connecter à votre compte Gmail. Vous pouvez trouver le script pour utiliser les API Google pour l'authentification ici.

Étapes pour envoyer un courrier

Certaines étapes doivent être effectuées pour envoyer un courrier en utilisant la bibliothèque smtplib . Voyons d'abord les étapes, puis nous écrirons le script.

#1. Connexion au serveur SMTP

Chaque fournisseur de services aura un nom de domaine et un port de serveur SMTP différents. Nous devons utiliser le nom de domaine du serveur SMTP et le port du fournisseur de messagerie que nous allons utiliser dans le script. Le nom de domaine et le port du serveur SMTP pour Gmail sont smtp.gmail.com et <em>465</em> .

Nous utiliserons le cryptage SSL pour la connexion au serveur SMTP car il est plus sécurisé que le cryptage TSL . Si vous souhaitez utiliser le cryptage TSL , utilisez le port 587 au lieu de 465 . Le nom de domaine du serveur SMTP sera différent en fonction du fournisseur de services de messagerie.

Le code pour se connecter au serveur SMTP

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

#2. Connexion

Une fois la connexion établie avec le serveur SMTP, nous pouvons nous connecter en utilisant l'adresse e-mail et le mot de passe avec la méthode de l'objet SMTP de login . Le code ressemble à ceci.

 server.login(sender_email, password)

#3. Envoyer un mail

Après la connexion, il n'y a aucun moyen d'attendre pour envoyer le courrier. Envoyez le courrier en utilisant la méthode sendmail . Assurez-vous d'envoyer le courrier dans le format suivant.

Objet : your_subject_for \newline mail_content

Les espaces ne sont pas nécessaires. Ils sont juste pour des éclaircissements dans le format ci-dessus. Voyons l'exemple de code.

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

#4. Quitter

N'oubliez pas de quitter le SMTP c

Nous avons vu les étapes pour envoyer du courrier en utilisant Python. Mais, nous n'avons pas discuté du code complet. Parcourons rapidement le code.

 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)

Nous avons créé une classe appelée Mail . Et il a une méthode appelée send pour envoyer les mails. Cours d'écriture ou tout simplement pas, c'est à vous de décider. La classe le rend plus lisible. Nous avons implémenté toutes les étapes décrites ci-dessus une par une dans la méthode d' envoi .

Hourra! vous avez envoyé un mail en utilisant le script Python.

Contenu HTML

Et si vous souhaitez envoyer le mail en HTML ? C'est possible?

Ouais pourquoi pas. Nous pouvons envoyer le courrier en utilisant HTML la bibliothèque appelée email.mime . C'est une bibliothèque intégrée.

Le MIME est une norme utilisée pour étendre le format des e-mails pour prendre en charge les programmes d'application, vidéo, images, etc.,

Il y a deux classes dont nous avons besoin du module email.mime . Ce sont MIMEText et MIMEMultipart . Voyons une brève explication à leur sujet.

#1. Texte MIME

La classe MIMEText est utilisée pour écrire notre contenu de courrier en HTML. Nous allons créer une instance de la classe MIMEText en passant le contenu HTML et le type de contenu. Voir l'exemple de code ci-dessous.

 html_content = MIMEText(html_template, 'html')

Certains services de messagerie ne prennent pas en charge le rendu HTML. Il est donc préférable de créer deux instances de la classe MIMEText pour le texte brut et le HTML.

#2. MIMEMultipart

La classe MIMEMultipart est utilisée pour simplifier le formatage et l'écriture du sujet, de l'adresse à l'adresse, etc. Nous donnerons le contenu créé avec la classe MIMEText à MIMEMultipart en utilisant la méthode attach .

Nous devons nous assurer que l'instance de MIMEMultipart est créée avec l' alternative argument pour restituer du texte brut ou du HTML. Envoyons un mail avec du contenu 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)

Vous pouvez également ajouter une copie carbone invisible à l'aide de cet attribut Bcc dans l'instance MIMEMultipart.

Ajout de pièces jointes

Les pièces jointes peuvent être des images, des fichiers PDF, des documents, des feuilles, etc. Il s'appelle MIMEBase dans la classe email.mime . Il est utilisé pour ajouter des pièces jointes au courrier.

Ajoutons une pièce jointe au courrier ci-dessus.

 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)

Courrier aux e-mails en masse à la fois

Nous avons utilisé une boucle pour envoyer le même courrier à plusieurs membres. C'est un cas (quand vous ne voulez pas que les récepteurs connaissent les autres récepteurs).

Supposons que vous deviez envoyer le même courrier à 1000 membres à la fois du même groupe. Dans de tels cas, l'utilisation d'une boucle ne sera pas appropriée. Nous pouvons ajouter plusieurs e-mails dans le champ À dans la composition de courrier générale. Comment le faire en script Python ?

Nous devons combiner la liste des e-mails sous forme de chaîne séparée par une virgule et un espace . Nous pouvons utiliser la chaîne de méthode de jointure pour combiner tous les e-mails sous forme de chaîne. Voir le code pour combiner les e-mails sous forme de chaîne.

 ", ".join(emails)

Remplacez le champ À dans le script ci-dessus en utilisant la chaîne ci-dessus. Ça y est, vous avez envoyé le courrier aux e-mails en masse à la fois.

Conclusion

Il existe des bibliothèques tierces pour envoyer des e-mails en Python. Certaines d'entre elles sont Envelopes, Yagmail, Flanker, etc., Ces bibliothèques nous aident à écrire des scripts avec peu de lignes de code. Vous pouvez également les explorer.

Maintenant, vous pouvez automatiser vos e-mails à l'aide de scripts Python. La structure d'envoi des e-mails sera différente en fonction de votre cas d'utilisation. Nous avons vu différents scénarios d'envoi d'e-mails. Vous pouvez facilement personnaliser les scripts abordés dans le didacticiel en fonction de votre cas d'utilisation. J'ai pris la référence de cet article.

Bon codage