Python envía correos electrónicos en varias posturas

Contenido de este capítulo

  • Biblioteca estándar de Python smtplib

  • Python envía correo y cc

  • Python envía correo electrónico con archivo adjunto

  • Python envía correo HTML

  • Python enviar correo con imágenes

Al escribir un script, ponlo en segundo plano y ejecútalo, si quieres saber el estado de ejecución, se notificará al administrador vía email, SMS (mensaje de texto), Fetion, WeChat, etc. El más utilizado es el email. En Linux, el envío de alertas por correo electrónico con secuencias de comandos de shell es muy simple. Hay servidores de correo electrónico listos para
usar que se ejecutan en segundo plano al escribir secuencias de comandos. Si desea conocer el estado de ejecución, utilizará correo electrónico, SMS (mensaje corto), Fetion, WeChat, etc. Avisar al administrador, el más utilizado es el correo. En Linux, es muy sencillo enviar alertas por correo electrónico mediante scripts Shell. Hay un software de servicio de correo electrónico listo para usar o llamar al servidor de buzones del operador.
Para Python, necesita escribir una secuencia de comandos para llamar al servidor de correo para enviar correo, y el protocolo utilizado es SMTP. Para recibir correo, los protocolos utilizados son POP3 e IMAP. Creo que es necesario explicar la diferencia entre POP3 e IMAP: las operaciones realizadas por POP3 en el buzón del cliente no se retroalimentan al servidor del buzón, como eliminar un correo electrónico, el servidor del buzón no se elimina. IMAP retroalimentará al servidor de buzones y realizará la operación correspondiente.

1. La biblioteca estándar de Python smtplib

Python proporciona bibliotecas para enviar y recibir correos electrónicos: smtplib, poplib e imaplib.
La biblioteca smtplib se usa para enviar correos electrónicos y la biblioteca smtplib usa principalmente la clase smtplib.SMTP (), que se usa para conectarse al servidor SMTP y enviar correos electrónicos.
Hay varios métodos de uso común en esta clase:

Python envía correos electrónicos en varias posturas
Eche un vistazo al ejemplo oficial:

>>> 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()

Enviémonos una prueba de correo electrónico basada en el ejemplo:
estoy aquí para probar usando un servidor SMTP local, lo que significa instalar un servicio que admita el protocolo SMTP, como sendmail, postfix, etc.
CentOS instalar sendmail: yum instalar 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)
{}

Ingrese a los buzones de correo de los destinatarios de Tencent y NetEase, y podrá ver los correos electrónicos de prueba que se acaban de enviar, que generalmente son filtrados por el servidor de buzones como spam, por lo que no hay bandeja de entrada, debe ir a la papelera.

Python envía correos electrónicos en varias posturas

Como puede ver, se pueden colocar varios destinatarios en una lista para el envío grupal. En el objeto msg, De representa el remitente, Asunto es el título del correo electrónico y el contenido del correo electrónico se ingresa después del salto de línea.
Lo anterior es el correo enviado usando el servidor SMTP local. Bajo la prueba, use el servidor 163 para enviar correo para ver el efecto:

>>> 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')

Al visitar la URL 163 proporcionada, el error SMTP554 es: "554 DT: SUM El remitente del sobre y el remitente con membrete no coinciden;"
Probablemente ya entiendo lo que significa. Cuando utilizo el servidor SMTP local anterior, la ubicación del destinatario es " "-recipientes" no revelados, la razón por la cual el servidor SMTP 163 no nos brinda servicio es que el destinatario no se especifica aquí.
Vuelva a modificar el objeto msg y agregue el destinatario:

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

Python envía correos electrónicos en varias posturas

De acuerdo, puedes enviar correos electrónicos normalmente. El formato de msg está regulado por SMTP y debe seguirse.

2. Python envía correos electrónicos y 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 envía correos electrónicos en varias posturas

s.sendmail (from_mail, to_mail + cc_mail, msg) Tenga en cuenta aquí, ¿por qué deben enviarse juntos el destinatario y el remitente CC? De hecho, no importa si es el destinatario o el CC, los correos electrónicos que reciben son los mismos y SMTP asume que el destinatario los envía uno por uno. Así que en realidad no existe el concepto de CC, ¡solo agrega la información de la persona en el encabezado del correo electrónico! Además, si no necesita copiar a la persona, simplemente elimine la información en el cc anterior.

3. Python envía correos electrónicos con archivos adjuntos.

Dado que el método SMTP.sendmail () no admite la adición de archivos adjuntos, puede utilizar el módulo de correo electrónico para satisfacer sus necesidades. El módulo de correo electrónico es un módulo para construir y analizar correos electrónicos.
Primero veamos cómo usar la biblioteca de correo electrónico para construir un correo electrónico simple:

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

¡El formato básico es así!
Continúe de nuevo al tema, envíe un correo electrónico con archivos adjuntos:

#!/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 envía correos electrónicos en varias posturas

4. Python envía correos electrónicos 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 envía correos electrónicos en varias posturas

5. Python envía un correo con imágenes

#!/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 envía correos electrónicos en varias posturas

Lo anterior es una forma común de enviar correos electrónicos en Python, ¡los amigos que a menudo escriben scripts aún deben estar familiarizados con él!

Supongo que te gusta

Origin blog.51cto.com/15127501/2657165
Recomendado
Clasificación