J'ai essayé d'implémenter la fonction d'envoi de courrier en Python

introduction

Nous avons [implémenté](# implémenté) la fonction d'envoi d'emails en Python! Vous pouvez facilement joindre des fichiers!

Comment utiliser

Je vais vous expliquer comment l'utiliser en prenant l'exemple de l'envoi d'un mail depuis gmail.

Obtenez le «utilisateur» et le «mot de passe» de gmail en vous référant au lien ci-dessous. Envoyer Gmail avec Python

Après l'acquisition, exécutez le programme suivant.


from_address = 'Adresse source'
to_address = 'Adresse de destination'
subject = 'matière'
body = 'Texte'
#Chemin du fichier à joindre
attachment = 'test.txt'
user = 'user'
password = 'password'

mail = Mail('smtp.gmail.com', 587, user, password)
#Pas de pièces jointes
mail.send(from_address, to_address, subject, body)
#Il y a un fichier joint
mail.send(from_address, to_address, subject, body, attachments=attachment)

Plusieurs personnes peuvent envoyer en transmettant l'adresse e-mail de destination (y compris cc et cci) dans une liste. De même, vous pouvez joindre plusieurs fichiers en passant les fichiers joints dans une liste.

À la fin

Je suis désolé pour le changement. .. ..

la mise en oeuvre

import copy
import os
import smtplib
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate
from typing import Union


class Mail(object):
    """
Classe pour envoyer du courrier
    """

    def __init__(self, smtp_host: str, smtp_port: int, user: str = None, password: str = None):
        """constructeur

        Args:
            smtp_host:hôte smtp
            smtp_port:port smtp
            user:Utilisateur
            password:mot de passe
        """
        self.smtp_host = smtp_host
        self.smtp_port = smtp_port
        self.user = user
        self.password = password

    def send(self, from_address: str, to_addresses: Union[str, list], subject: str, body: str,
             attachments: Union[str, list] = None, profile: str = None, cc_addresses: Union[str, list] = None,
             bcc_addresses: Union[str, list] = None):
        """envoyer un e-mail

        Args:
            from_address:Adresse source
            to_addresses:Adresse de destination
            subject:matière
            body:Texte
            attachments:Pièce jointe
            profile:Profil
            cc_addresses:adresse cc
            bcc_addresses:adresse Cci

        """

        if attachments:
            msg = self.create_body_with_attachment(
                from_address, to_addresses, subject, body, attachments, profile, cc_addresses, bcc_addresses)
        else:
            msg = self.create_body(from_address, to_addresses, subject, body, profile, cc_addresses, bcc_addresses)

        if type(to_addresses) is list:
            send_list = copy.copy(to_addresses)
        else:
            send_list = [to_addresses]

        if cc_addresses:
            if type(cc_addresses) is list:
                send_list = send_list + cc_addresses
            else:
                send_list = send_list + [cc_addresses]

        if bcc_addresses:
            if type(cc_addresses) is list:
                send_list = send_list + bcc_addresses
            else:
                send_list = send_list + [bcc_addresses]

        smtpobj = smtplib.SMTP(self.smtp_host, self.smtp_port)
        smtpobj.ehlo()
        smtpobj.starttls()
        smtpobj.ehlo()
        if self.password:
            smtpobj.login(self.user, self.password)
        smtpobj.sendmail(from_address, send_list, msg.as_string())
        smtpobj.close()

    def create_body_with_attachment(self, from_address, to_addresses, subject, body, attachments, profile,
                                    cc_addresses=None, bcc_addresses=None):
        """Créer un corps d'e-mail avec des pièces jointes

        Args:
            from_address:Adresse source
            to_addresses:Adresse de destination
            subject:matière
            body:Texte
            attachments:Pièce jointe
            profile:Profil
            cc_addresses:adresse cc
            bcc_addresses:adresse Cci

        Returns:
le contenu de l'e-mail
        """

        msg = MIMEMultipart()
        msg = self.create_msg(msg, from_address, to_addresses, subject, profile, cc_addresses, bcc_addresses)
        body = MIMEText(body.encode("utf-8"), 'html', 'utf-8')
        msg.attach(body)

        if type(attachments) is not list:
            attachments = [attachments]

        for attachment in attachments:
            base_name = os.path.basename(attachment)
            with open(attachment, "rb") as f:
                part = MIMEApplication(
                    f.read(),
                    Name=base_name
                )

            part['Content-Disposition'] = 'attachment; filename="{}"'.format(base_name)
            msg.attach(part)

        return msg

    def create_body(self, from_address, to_addresses, subject, body, profile, cc_addresses=None, bcc_addresses=None):
        """Créer le corps de l'e-mail

        Args:
            from_address:Adresse source
            to_addresses:Adresse de destination
            subject:matière
            body:Texte
            profile:Profil
            cc_addresses:adresse cc
            bcc_addresses:adresse Cci

        Returns:
le contenu de l'e-mail
        """

        msg = MIMEText(body.encode("utf-8"), 'html', 'utf-8')
        return self.create_msg(msg, from_address, to_addresses, subject, profile, cc_addresses, bcc_addresses)

    @staticmethod
    def create_msg(msg, from_address, to_addresses, subject, profile=None, cc_addresses=None, bcc_addresses=None):
        msg['Subject'] = subject
        if profile:
            msg['From'] = '{} <{}>'.format(Header(profile.encode('utf-8'), 'utf-8').encode(), from_address)
        else:
            msg['From'] = from_address

        def to_string_addresses(addresses):
            if type(addresses) is list:
                return ','.join(addresses)
            else:
                return addresses

        msg['To'] = to_string_addresses(to_addresses)
        msg['Bcc'] = to_string_addresses(bcc_addresses)
        msg['Cc'] = to_string_addresses(cc_addresses)

        msg['Date'] = formatdate()

        return msg

Recommended Posts

J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter la permutation en Python
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé d'implémenter PPO en Python
J'ai essayé d'implémenter TOPIC MODEL en Python
J'ai essayé d'implémenter le tri sélectif en python
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé d'implémenter un pseudo pachislot en Python
J'ai essayé d'implémenter le poker de Drakue en Python
J'ai essayé d'implémenter GA (algorithme génétique) en Python
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
J'ai essayé d'implémenter le blackjack du jeu Trump en Python
J'ai essayé de mettre en œuvre un jeu de dilemme de prisonnier mal compris en Python
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai essayé de simuler "Birthday Paradox" avec Python
J'ai essayé la méthode des moindres carrés en Python
J'ai essayé d'implémenter la fonction gamma inverse en python
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
Je veux afficher la progression en Python!
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
J'ai essayé d'implémenter le jeu de cartes de Trump en Python
J'ai essayé d'implémenter PCANet
J'ai essayé d'implémenter StarGAN (1)
Je veux facilement implémenter le délai d'expiration en python
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé d'approcher la fonction sin en utilisant le chainer
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
Je veux écrire en Python! (3) Utiliser des simulacres
J'ai essayé de résumer comment utiliser les pandas de python
J'ai essayé de résoudre le problème avec Python Vol.1
Je veux utiliser le jeu de données R avec python
Python Open CV a essayé d'afficher l'image sous forme de texte.
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé d'implémenter le tri par fusion en Python avec le moins de lignes possible
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
Je veux obtenir le nom du fichier, le numéro de ligne et le nom de la fonction dans Python 3.4
J'ai essayé d'implémenter ce qui semble être un outil de snipper Windows avec Python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
Implémenter la fonction power.prop.test de R en python
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
J'ai essayé de toucher Python (installation)
Dans la commande python, python pointe vers python3.8
Implémenter le modèle Singleton en Python
J'ai essayé de mettre en place une validation contradictoire
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé de programmer le test du chi carré en Python et Java.
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé de résumer les commandes souvent utilisées en entreprise
J'ai écrit la file d'attente en Python
J'ai essayé d'énumérer les différences entre java et python