J'ai eu la chance d'implémenter la communication SMTP en Python, donc j'écrirai comment l'implémenter.
Lorsque je recherchais diverses méthodes de mise en œuvre, j'ai trouvé beaucoup d'informations sur la mise en œuvre avec l'ancienne API de la bibliothèque standard, mais je n'ai pas trouvé beaucoup de méthode avec l'API actuellement recommandée. Django, un framework Web, utilise également des API héritées, je ne pouvais donc pas me référer au code des principales bibliothèques et frameworks.
Donc, je l'ai implémenté en lisant le code centré sur les bibliothèques standard de Python smtplib
et ʻemail`.
import smtplib
from email.message import EmailMessage
class MailClient:
def __init__(self, mail_data: Dict[str, Any] = {}) -> None:
"""
Args:
mail_data(Dict[]): Defaults to {}.
"""
self._mail_data = mail_data
def request(self) -> bool:
"""
Returns:
bool
"""
with smtplib.SMTP(host=SMTP_HOST, port=int(SMTP_PORT)) as smtp:
smtp.login(SMTP_USER, SMTP_PASSWORD)
errors = smtp.send_message(self.message())
if isinstance(errors, dict) and len(errors) > 0:
logger.warn(
f'''Failed to send to all recipients.
Details: {errors}'''
)
return True
def message(self) -> EmailMessage:
msg = EmailMessage()
msg['From'] = self._mail_data['from_address']
msg['To'] = self._mail_data['to_address']
msg['Subject'] = self._mail_data['subject']
msg.set_default_type('text/plain')
msg.set_content(self._mail_data['message'])
bcc = self._mail_data.get('bcc')
if bcc:
msg['Bcc'] = convert_to_str(bcc)
cc = self._mail_data.get('cc')
if cc:
msg['Cc'] = convert_to_str(cc)
return msg
Démarrez une connexion avec le serveur SMTP avec smtplib.SMTP
. Si vous utilisez TLS, utilisez smtplib.SMTP_SSL
, ou établissez une connexion en texte brut puis connectez-vous avec starttls ()
.
Après avoir établi la connexion avec succès, authentifiez-vous avec login ()
. Envoyez ensuite les données avec send_message
. C'est sendmail qui est en fait responsable de l'envoi des données. Exécutez la commande SMTP dans cette fonction pour envoyer un e-mail.
En ce qui concerne la gestion des erreurs, je n'ai pas écrit try - sauf cette fois car je peux simplement lever si une exception se produit. Cependant, lors de l'envoi vers plusieurs destinations, même si une seule échoue, elle est enregistrée sous forme de journal. Ces informations sont la valeur de retour de send_message
et sont stockées dans la variable ʻerrors`. Le type d'erreur est Dict, la clé est l'adresse de destination et la valeur est un taple contenant le code de réponse STMP et le message correspondant. Pour plus d'informations sur le moment où send_message / sendmail renvoie une valeur, accédez à here Il existe un code source, veuillez donc le lire.
Cette fois, les données de messagerie sont créées à l'aide d'EmailMessage du module de messagerie, mais vous pouvez directement affecter une chaîne de caractères à send_message
ou sendmail
. Cependant, nous ne le recommandons pas car c'est difficile si vous ne comprenez pas les spécifications du protocole. Utilisez le message électronique chaque fois que possible.
J'avais prévu de publier cet article plus tôt, mais j'ai oublié de l'écrire à mi-chemin, c'est donc devenu comme écrire un blog (rires). Bonne année: bonhomme de neige2:
Recommended Posts