Python3 SMTP envoie du courrier


SMTP (Simple Mail Transfer Protocol) est un protocole de transfert de courrier simple. Il s'agit d'un ensemble de règles permettant de transmettre le courrier de l'adresse source à l'adresse de destination, qui contrôle la méthode de transfert de la lettre.

smtplib de Python fournit un moyen très pratique d'envoyer des e-mails. Il encapsule simplement le protocole SMTP.

La syntaxe permettant à Python de créer un objet SMTP est la suivante :

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

Description du paramètre :

  • hôte : hôte du serveur SMTP. Vous pouvez spécifier l'adresse IP ou le nom de domaine de l'hôte tel que : w3cschool.cc Il s'agit d'un paramètre facultatif.

  • port : Si vous fournissez le paramètre host, vous devez spécifier le numéro de port utilisé par le service SMTP. Généralement, le numéro de port SMTP est 25.

  • local_hostname : Si SMTP est sur votre ordinateur local, il vous suffit de spécifier l'adresse du serveur en tant que localhost.

L'objet Python SMTP utilise la méthode sendmail pour envoyer des emails. La syntaxe est la suivante :

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

Description du paramètre :

  • from_addr : Envoi ou adresse email.

  • to_addrs : liste de chaînes, adresse email d'envoi.

  • msg : Envoyer un message

Veuillez noter le troisième paramètre ici, msg est une chaîne, représentant un e-mail. Nous savons que les e-mails se composent généralement d'un titre, de l'expéditeur, du destinataire, du contenu de l'e-mail, des pièces jointes, etc. Lors de l'envoi d'un e-mail, faites attention au format du msg. Ce format est le format défini dans le protocole smtp.

Exemple

Ce qui suit est un exemple simple d'envoi d'un e-mail à l'aide de Python :

#!/usr/bin/python3

import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = 'from@php.cn'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("php中文网", 'utf-8')
message['To'] =  Header("测试", 'utf-8')

subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')


try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print ("邮件发送成功")
except smtplib.SMTPException:
    print ("Error: 无法发送邮件")

Nous utilisons trois guillemets pour définir les informations de l'e-mail. Un e-mail standard nécessite trois en-têtes. informations : De, À et Sujet, chaque information est directement séparée par une ligne vide.

Nous nous connectons à l'accès SMTP en instanciant l'objet SMTP du module smtplib smtpObj et utilisons la méthode sendmail pour envoyer le message.

Exécutez le programme ci-dessus. Si vous installez sendmail sur votre ordinateur local, il affichera :

$ python3 test.py 
邮件发送成功

Consultez notre boîte de réception (généralement dans la corbeille), vous pouvez afficher les informations de courrier électronique :

1029.jpg

Si nous n'avons pas d'accès sendmail localement, nous pouvons également utiliser l'accès SMTP d'autres fournisseurs de services (QQ, NetEase, Google, etc.).

#!/usr/bin/python3

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 第三方 SMTP 服务
mail_host="smtp.XXX.com"  #设置服务器
mail_user="XXXX"    #用户名
mail_pass="XXXXXX"   #口令 


sender = 'from@php.cn'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("php中文网", 'utf-8')
message['To'] =  Header("测试", 'utf-8')

subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')


try:
    smtpObj = smtplib.SMTP() 
    smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
    smtpObj.login(mail_user,mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print ("邮件发送成功")
except smtplib.SMTPException:
    print ("Error: 无法发送邮件")

Utilisez Python pour envoyer des e-mails au format HTML

La différence entre l'envoi d'e-mails au format HTML avec Python et l'envoi de messages en texte brut est de définir _subtype dans MIMEText sur html. Le code spécifique est le suivant :

#!/usr/bin/python3

import smtplib
from email.mime.text import MIMEText
from email.header import Header

sender = 'from@php.cn'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.php.cn">这是一个链接</a></p>
"""
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("php中文网", 'utf-8')
message['To'] =  Header("测试", 'utf-8')

subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')


try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print ("邮件发送成功")
except smtplib.SMTPException:
    print ("Error: 无法发送邮件")

Exécutez le programme ci-dessus si vous installez sendmail sur votre machine locale, il affichera :

$ python3 test.py 
邮件发送成功

Vérifiez notre boîte de réception (généralement dans la corbeille) et vous. peut le voir Informations sur l'e-mail :

1030.jpg


Python envoie des e-mails avec des pièces jointes

Pour envoyer des e-mails avec des pièces jointes, créez d'abord une instance MIMEMultipart(), puis construisez la pièce jointe, s'il y a plusieurs pièces jointes, elles peuvent être construites séquentiellement et finalement envoyées à l'aide de smtplib.smtp.

#!/usr/bin/python3

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

sender = 'from@php.cn'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("php中文网", 'utf-8')
message['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')

#邮件正文内容
message.attach(MIMEText('这是php中文网Python 邮件发送测试……', 'plain', 'utf-8'))

# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)

# 构造附件2,传送当前目录下的 php.txt 文件
att2 = MIMEText(open('php.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="php.txt"'
message.attach(att2)

try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    print ("邮件发送成功")
except smtplib.SMTPException:
    print ("Error: 无法发送邮件")
$ python3 test.py 
邮件发送成功

Consultez notre boîte de réception (généralement dans la corbeille) et vous pourrez voir les informations de l'e-mail :

1031.jpg


Ajouter des images au texte HTML

Dans le texte HTML de l'e-mail, il n'est pas possible pour les fournisseurs de services de messagerie généraux d'ajouter des liens externes. Un exemple d'ajout correct d'une percée est le suivant :

#!/usr/bin/python3

import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

sender = 'from@php.cn'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

msgRoot = MIMEMultipart('related')
msgRoot['From'] = Header("php中文网", 'utf-8')
msgRoot['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
msgRoot['Subject'] = Header(subject, 'utf-8')

msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)


mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.php.cn">php中文网链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))

# 指定图片为当前目录
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)

try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, msgRoot.as_string())
    print ("邮件发送成功")
except smtplib.SMTPException:
    print ("Error: 无法发送邮件")
rrree

Vérifiez notre boîte de réception (si elle est dans la corbeille). , il faudra peut-être le déplacer vers la boîte de réception pour s'afficher normalement), vous pouvez consulter les informations de l'e-mail :

1032.jpg

Pour plus d'informations, veuillez vous référer à : https://docs .python.org/3/library/email-examples.html.