Python envoie des e-mails dans diverses postures

Contenu de ce chapitre

  • Bibliothèque standard Python smtplib

  • Python envoie du courrier et cc

  • Python envoyer un e-mail avec pièce jointe

  • Python envoie du courrier HTML

  • Python envoyer un e-mail d'image

Lors de l'écriture d'un script, mettez-le en arrière-plan et exécutez-le.Si vous souhaitez connaître l'état d'exécution, l'administrateur sera averti par e-mail, SMS (message texte), Fetion, WeChat, etc. Le plus utilisé est le courrier électronique. Sous Linux, l'envoi d'alertes par e-mail par script shell est très simple. Il existe des serveurs de messagerie prêts à l'emploi
qui s'exécutent en arrière-plan lors de l'écriture de scripts. Si vous voulez connaître l'état d'exécution, vous utiliserez e-mail, SMS (message court), Fetion, WeChat, etc. Avertissez l'administrateur, le plus utilisé est le courrier. Sous Linux, il est très simple d'envoyer des alertes par e-mail par des scripts Shell.Il existe des logiciels de messagerie prêts à l'emploi ou d'appeler le serveur de messagerie de l'opérateur.
Pour Python, vous devez écrire un script pour appeler le serveur de messagerie pour envoyer du courrier, et le protocole utilisé est SMTP. Pour recevoir du courrier, les protocoles utilisés sont POP3 et IMAP. Je pense qu'il est nécessaire d'expliquer la différence entre POP3 et IMAP: les opérations effectuées par POP3 dans la boîte aux lettres du client ne seront pas renvoyées au serveur de la boîte aux lettres, comme la suppression d'un e-mail, le serveur de la boîte aux lettres ne sera pas supprimé. IMAP retournera au serveur de boîte aux lettres et effectuera l'opération correspondante.

1. La bibliothèque standard Python smtplib

Python fournit des bibliothèques pour envoyer et recevoir des e-mails: smtplib, poplib et imaplib.
La bibliothèque smtplib est utilisée pour envoyer des emails, et la bibliothèque smtplib utilise principalement la classe smtplib.SMTP (), qui est utilisée pour se connecter au serveur SMTP et envoyer des emails.
Il existe plusieurs méthodes couramment utilisées dans cette classe:

Python envoie des e-mails dans diverses postures
Jetez un œil à l'exemple officiel:

>>> import smtplib
>>> s=smtplib.SMTP("localhost")
>>> tolist=["[email protected]","[email protected]","[email protected]","[email protected]"]
>>> msg = '''\
     ... From: [email protected]
     ... Subject: testin'...
     ...
     ... This is a test '''
>>> s.sendmail("[email protected]",tolist,msg)
     { "[email protected]" : ( 550 ,"User unknown" ) }
>>> s.quit()

Envoyons-nous un e-mail de test basé sur l'exemple:
je suis ici pour tester en utilisant un serveur SMTP local, ce qui signifie installer un service prenant en charge le protocole SMTP, tel que sendmail, postfix, etc.
CentOS installer sendmail: yum installer sendmail

>>> import smtplib
>>> s = smtplib.SMTP("localhost")
>>> tolist = ["[email protected]", "[email protected]"]
>>> msg = '''\
... From: [email protected]
... Subject: test
... This is a test '''
>>> s.sendmail("[email protected]", tolist, msg)
{}

Entrez les boîtes aux lettres des destinataires de Tencent et NetEase, et vous pouvez voir les e-mails de test qui viennent d'être envoyés, qui sont généralement filtrés par le serveur de boîtes aux lettres comme spam, donc il n'y a pas de boîte de réception, vous devez aller à la poubelle.

Python envoie des e-mails dans diverses postures

Comme vous pouvez le voir, plusieurs destinataires peuvent être placés dans une liste pour l'envoi de groupe. Dans l'objet msg, From représente l'expéditeur, Subject est le titre de l'e-mail et le contenu de l'e-mail est entré après le saut de ligne.
Ce qui précède est le courrier envoyé à l'aide du serveur SMTP local. Dans le cadre du test, utilisez le serveur 163 pour envoyer du courrier afin de voir l'effet:

>>> import smtplib
>>> s = smtplib.SMTP("smtp.163.com")
>>> s.login("[email protected]", "xxx")
(235, 'Authentication successful')
>>> tolist = ["[email protected]", "[email protected]"]
>>> msg = '''\
... From: [email protected]
... Subject: test
... This is a test '''
>>> s.sendmail("[email protected]", tolist, msg)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/smtplib.py", line 725, in sendmail
    raise SMTPDataError(code, resp)
smtplib.SMTPDataError: (554, 'DT:SPM 163 smtp10,DsCowAAXIdDIJAtYkZiTAA--.65425S2 1477125592,please see http://mail.163.com/help/help_spam_16.htm?ip=119.57.73.67&hostid=smtp10&time=1477125592')

En visitant l'URL 163 donnée, l'erreur SMTP554 est: "554 DT: SUM L'expéditeur de l'enveloppe et l'expéditeur de l'en-tête ne correspondent pas;" Je
comprends probablement déjà ce que cela signifie. Lorsque j'utilise le serveur SMTP local ci-dessus, l'emplacement du destinataire est " "-recipients" non divulgués, la raison pour laquelle le serveur SMTP 163 ne nous fournit pas de service est que le destinataire n'est pas spécifié ici.
Modifiez à nouveau l'objet msg et ajoutez le destinataire:

>>> msg = '''\           
... From: [email protected]
... To: [email protected] ,[email protected]
... Subject: test
...
... This is a test '''
>>> s.sendmail("[email protected]", tolist, msg)
{}

Python envoie des e-mails dans diverses postures

D'accord, vous pouvez envoyer des e-mails normalement. Le format des msg est réglementé par SMTP et doit être respecté.

2. Python envoie des e-mails et CC

#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
def sendMail(body):
    smtp_server = 'smtp.163.com'
    from_mail = '[email protected]'
    mail_pass = 'xxx'
    to_mail = ['[email protected]', '[email protected]']
    cc_mail = ['[email protected]']
    from_name = 'monitor' 
    subject = u'监控'.encode('gbk')   # 以gbk编码发送,一般邮件客户端都能识别
#     msg = '''\
# From: %s <%s>
# To: %s
# Subject: %s
# %s''' %(from_name, from_mail, to_mail_str, subject, body)  # 这种方式必须将邮件头信息靠左,也就是每行开头不能用空格,否则报SMTP 554
    mail = [
        "From: %s <%s>" % (from_name, from_mail),
        "To: %s" % ','.join(to_mail),   # 转成字符串,以逗号分隔元素
        "Subject: %s" % subject,
        "Cc: %s" % ','.join(cc_mail),
        "",
        body
        ]
    msg = '\n'.join(mail)  # 这种方式先将头信息放到列表中,然后用join拼接,并以换行符分隔元素,结果就是和上面注释一样了
    try:
        s = smtplib.SMTP()
        s.connect(smtp_server, '25')
        s.login(from_mail, mail_pass)
        s.sendmail(from_mail, to_mail+cc_mail, msg)   
        s.quit()
    except smtplib.SMTPException as e:
        print "Error: %s" %e
if __name__ == "__main__":
sendMail("This is a test!")

Python envoie des e-mails dans diverses postures

s.sendmail (from_mail, to_mail + cc_mail, msg) Notez ici, pourquoi le destinataire et l'expéditeur CC devraient-ils être envoyés ensemble? En fait, peu importe qu'il s'agisse du destinataire ou du CC, les e-mails qu'ils reçoivent sont les mêmes, et SMTP suppose que le destinataire les envoie un par un. Donc en fait il n'y a pas de concept de CC, il suffit d'ajouter les informations de la personne dans l'en-tête de l'email! De plus, si vous n'avez pas besoin de copier la personne, supprimez simplement les informations dans le cc ci-dessus.

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

Étant donné que la méthode SMTP.sendmail () ne prend pas en charge l'ajout de pièces jointes, vous pouvez utiliser le module de messagerie pour répondre à vos besoins. Le module e-mail est un module de construction et d'analyse des e-mails.
Voyons d'abord comment utiliser la bibliothèque d'e-mails pour créer un e-mail simple:

message = Message()
message['Subject'] = '邮件主题'
message['From'] = from_mail
message['To'] = to_mail
message['Cc'] = cc_mail
message.set_payload('邮件内容')

Le format de base est comme ça!
Revenez au sujet, envoyez un e-mail avec des pièces jointes:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email import encoders
from email.mime.base import MIMEBase
from email.utils import parseaddr, formataddr
# 格式化邮件地址
def formatAddr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))
def sendMail(body, attachment):
    smtp_server = 'smtp.163.com'
    from_mail = '[email protected]'
    mail_pass = 'xxx'
    to_mail = ['[email protected]', '[email protected]']
    # 构造一个MIMEMultipart对象代表邮件本身
    msg = MIMEMultipart()
    # Header对中文进行转码
    msg['From'] = formatAddr('管理员 <%s>' % from_mail).encode()
    msg['To'] = ','.join(to_mail)
    msg['Subject'] = Header('监控', 'utf-8').encode()
    # plain代表纯文本
    msg.attach(MIMEText(body, 'plain', 'utf-8'))
    # 二进制方式模式文件
    with open(attachment, 'rb') as f:
        # MIMEBase表示附件的对象
        mime = MIMEBase('text', 'txt', filename=attachment)
        # filename是显示附件名字
        mime.add_header('Content-Disposition', 'attachment', filename=attachment)
        # 获取附件内容
        mime.set_payload(f.read())
        encoders.encode_base64(mime)
        # 作为附件添加到邮件
        msg.attach(mime)
    try:
        s = smtplib.SMTP()
        s.connect(smtp_server, "25")
        s.login(from_mail, mail_pass)
        s.sendmail(from_mail, to_mail, msg.as_string())  # as_string()把MIMEText对象变成str
        s.quit()
    except smtplib.SMTPException as e:
        print "Error: %s" % e
if __name__ == "__main__":
    sendMail('附件是测试数据, 请查收!', 'test.txt')

Python envoie des e-mails dans diverses postures

4. Python envoie des e-mails HTML

#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.utils import parseaddr, formataddr
# 格式化邮件地址
def formatAddr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))
def sendMail(body):
    smtp_server = 'smtp.163.com'
    from_mail = '[email protected]'
    mail_pass = 'xxx'
    to_mail = ['[email protected]', '[email protected]']
    # 构造一个MIMEMultipart对象代表邮件本身
    msg = MIMEMultipart() 
    # Header对中文进行转码
    msg['From'] = formatAddr('管理员 <%s>' % from_mail).encode()
    msg['To'] = ','.join(to_mail)
    msg['Subject'] = Header('监控', 'utf-8').encode()
    msg.attach(MIMEText(body, 'html', 'utf-8'))
    try:
        s = smtplib.SMTP()     
        s.connect(smtp_server, "25")   
        s.login(from_mail, mail_pass)
        s.sendmail(from_mail, to_mail, msg.as_string())  # as_string()把MIMEText对象变成str     
        s.quit()
    except smtplib.SMTPException as e:
        print "Error: %s" % e
if __name__ == "__main__":
    body = """
    <h1>测试邮件</h1>
    <h2 style="color:red">This is a test</h1>
    """
    sendMail(body)

Python envoie des e-mails dans diverses postures

5. Python envoie un courrier d'image

#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.utils import parseaddr, formataddr
# 格式化邮件地址
def formatAddr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))
def sendMail(body, image):
    smtp_server = 'smtp.163.com'
    from_mail = '[email protected]'
    mail_pass = 'xxx'
    to_mail = ['[email protected]', '[email protected]']
    # 构造一个MIMEMultipart对象代表邮件本身
    msg = MIMEMultipart() 
    # Header对中文进行转码
    msg['From'] = formatAddr('管理员 <%s>' % from_mail).encode()
    msg['To'] = ','.join(to_mail)
    msg['Subject'] = Header('监控', 'utf-8').encode()
    msg.attach(MIMEText(body, 'html', 'utf-8'))
    # 二进制模式读取图片
    with open(image, 'rb') as f:
        msgImage = MIMEImage(f.read())
    # 定义图片ID
    msgImage.add_header('Content-ID', '<image1>')
    msg.attach(msgImage)
    try:
        s = smtplib.SMTP()     
        s.connect(smtp_server, "25")   
        s.login(from_mail, mail_pass)
        s.sendmail(from_mail, to_mail, msg.as_string())  # as_string()把MIMEText对象变成str     
        s.quit()
    except smtplib.SMTPException as e:
        print "Error: %s" % e
if __name__ == "__main__":
    body = """
    <h1>测试图片</h1>
    <img src="cid:image1"/>    # 引用图片
    """
    sendMail(body, 'test.png')

Python envoie des e-mails dans diverses postures

Ce qui précède est un moyen courant d'envoyer des e-mails en Python, les amis qui écrivent souvent des scripts doivent encore s'y familiariser!

Je suppose que tu aimes

Origine blog.51cto.com/15127501/2657165
conseillé
Classement