Maison  >  Article  >  développement back-end  >  Introduction détaillée à l'envoi d'e-mails via python SMTP (avec code)

Introduction détaillée à l'envoi d'e-mails via python SMTP (avec code)

不言
不言avant
2018-10-09 15:39:312608parcourir

Cet article vous apporte une introduction détaillée à SMTP pour l'envoi d'e-mails en Python (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Comment utiliser Python pour envoyer le rapport de test généré en pièce jointe à un e-mail ?

1. Présentation

SMTP (Simple Mail Transfer Protocol) est un simple protocole de transfert de courrier. Il s'agit d'un ensemble de règles permettant de transmettre le courrier de l'adresse source à l'adresse de destination. Il s'agit de contrôler la manière dont le courrier est transféré.

Smtplib de Python fournit un moyen très pratique d'envoyer des e-mails, qui encapsule simplement le protocole SMTP.
Python prend en charge SMTP avec deux modules : smtplib et email. Parmi eux, le courrier électronique est responsable de la construction des courriers électroniques et smtplib est responsable de l'envoi des courriers électroniques.

Comprenons l'idée de base de l'envoi d'une pièce jointe d'un type MIME inconnu en Python :

0、前提:导入邮件发送模块
        from email.mime.text import MIMEText
        from email.mime.multipart import MIMEMultipart
        import smtplib
1、构造MIMEMultipart对象作为根容器
2、构造MIMEText对象作为邮件显示内容并附加到根容器
    a、读入文件内容并格式化
    b、设置附件头
3、设置根容器属性
4、得到格式化后的完整文本
5、用smtp发送邮件
6、封装成sendEmail类。

2. 🎜>Pensez en même temps Pensez aux différents éléments dont nous avons besoin pour envoyer des emails :

Parce que nous avons déjà écrit comment lire le fichier de configuration .ini, donc dans cette partie, quelques éléments pour l'envoi les emails sont placés dans le fichier de configuration. Le fichier de configuration Comme suit :

1、服务器。以QQ邮箱举例,则为smtp.qq.com
2、端口号。有465和587,请使用587
3、发送者。
4、密码。密码总不能直接写在文件里吧?哈哈,这里需要使用qq邮箱获取授权码。
5、收件人。(可能还不止一个)
6、发送邮件的主题subject。
7、邮件文本内容。
8、附件。

Introduction détaillée à lenvoi de-mails via python SMTP (avec code)Le script de lecture du fichier de configuration correspondant est : (readConfig.py part)

3. Partie e-mail
import os
import configparser

# config
cur_path = os.path.dirname(os.path.relpath(__file__))
configPath = os.path.join(cur_path,'config.ini')
conf = configparser.ConfigParser()
conf.read(configPath)

def get_smtpServer(smtpServer):
    smtp_server = conf.get('email',smtpServer)
    return smtp_server
# 
......

Après avoir construit l'objet conteneur racine de messagerie MIMEMultipart(), vous devez utiliser le conteneur racine pour définir divers éléments de l'e-mail, tels que l'objet de l'e-mail, l'expéditeur et le destinataire, le corps de l'e-mail, les pièces jointes de l'e-mail, etc.

Comment définir l'objet et l'expéditeur de l'email ?

Comment définir la partie corps du texte de l'email ?
# 构建根容器
msg = MIMEMultipart()

# 邮件主题、发送人、收件人、内容,此部分可以来自配置文件,也可以直接填入
msg['Subject'] = self.mail_subject  # u'自动化测试报告'
msg['from'] = self.mail_sender
msg['to'] = self.mail_pwd

Comment ajouter des pièces jointes aux emails ?
# 邮件正文部分body,1、可以用HTML自己自定义body内容;2、读取其他文件的内容为body
# body = "您好,<p>这里是使用Python登录邮箱,并发送附件的测试"
with open(reportFile,'r',encoding='UTF-8') as f:
     body = f.read()
msg.attach(MIMEText(_text=body, _subtype='html', _charset='utf-8'))  # _charset 是指Content_type的类型</p>

Comment envoyer ?
# 添加附件
attachment = MIMEText(_text=open(reportFile, 'rb').read(), _subtype='base64',_charset= 'utf-8')
attachment['Content-Type'] = 'application/octet-stream'
attachment['Content-Disposition'] = 'attachment;filename = "result.html"'
msg.attach(attachment)

Quatre étapes d'envoi : obtenir la connexion au serveur, se connecter à la boîte aux lettres, envoyer l'e-mail et quitter. C'est à peu près comme suit :


Ajoutez une phrase

dedans. Cette phrase est utilisée pour chiffrer la session SMTP afin de garantir que les e-mails sont envoyés en toute sécurité et ne peuvent pas être écoutés.
try:
      smtp = smtplib.SMTP_SSL(host=self.mail_smtpserver, port=self.mail_port)  # 继承自SMTP
except:
      smtp = smtplib.SMTP()
      smtp.connect(self.mail_smtpserver, self.mail_port)

# smtp.set_debuglevel(1)
# 创建安全连接,加密SMTP
smtp.starttls()     # Puts the connection to the SMTP server into TLS mode.
# 用户名和密码
smtp.login(user=self.mail_sender, password=self.mail_pwd)

# 函数:sendmail(self, from_addr, to_addrs, msg, mail_options=[],rcpt_options=[]):
smtp.sendmail(self.mail_sender, self.mail_receiverList, msg.as_string())
smtp.quit()
Après avoir créé l'objet SMTP, appelez immédiatement la méthode

. smtp.starttls()En fait, tout le module d’envoi d’email est complété.
starttls()
4. Problèmes

J'ai rencontré plusieurs problèmes au cours de ce processus, et je les publierai ici pour les partager avec vous.

Erreur 535

Erreur de lancement : smtplib.SMTPAuthenticationError : (535, b'Error : xc7xebxcaxb9xd3xc3xcaxdaxc8xa8xc2xebxb5xc7xc2xbcxa1xa3xcfxeaxc7xe9xc7xebxbfxb4 : http://service.mail.qq.com/cg...')

Solution : Cliquer sur le dernier lien est en fait dû au problème du code d'autorisation


L'erreur persiste après remplacement du code d'autorisation , 535
Solution : Remplacer le port. Parce qu'il existe deux ports de protocole SSL pour la boîte aux lettres qq : 465/587.

Erreur signalée : smtplib.SMTPAuthenticationError : (530, b'Doit d'abord émettre une commande STARTTLS.')
Solution : Avant de vous connecter(), ajoutez : smtp.starttls()


5. Codez tout

Collez l'intégralité du fichier ci-dessous. Ce fichier dépend d'autres fichiers, il est donc à titre de référence uniquement, mais la méthode est la même.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer