Python envia e-mails em várias posturas

Conteúdo deste capítulo

  • Biblioteca padrão Python smtplib

  • Python enviar e-mail e cc

  • Python enviar e-mail com anexo

  • Python enviar e-mail em HTML

  • Python enviar e-mail com imagem

Ao escrever um script, coloque-o em background e execute-o.Se quiser saber o estado da execução, o administrador será avisado por email, SMS (mensagem de texto), Fetion, WeChat, etc. No Linux, o script de shell enviar alertas de e-mail é uma questão muito simples. Existem servidores de e-mail prontos
que funcionam em segundo plano ao escrever scripts. Se você quiser saber o status de execução, você usará e-mail, SMS (mensagem curta), Fetion, WeChat, etc. Notifique o administrador, o mais utilizado é o mail. No Linux, é muito simples enviar alertas de e-mail por scripts Shell.Há um software de serviço de e-mail pronto ou ligue para o servidor de caixa de correio da operadora.
Para Python, você precisa escrever um script para chamar o servidor de e-mail para enviar e-mail, e o protocolo usado é o SMTP. Para receber e-mail, os protocolos usados ​​são POP3 e IMAP. Acho que é necessário explicar a diferença entre POP3 e IMAP: as operações realizadas pelo POP3 na caixa de correio do cliente não serão retornadas ao servidor da caixa de correio, como excluir um e-mail, o servidor da caixa de correio não será excluído. O IMAP retornará ao servidor da caixa de correio e fará a operação correspondente.

1. A biblioteca padrão do Python smtplib

Python fornece bibliotecas para enviar e receber e-mails: smtplib, poplib e imaplib.
A biblioteca smtplib é usada para enviar emails, e a biblioteca smtplib usa principalmente a classe smtplib.SMTP (), que é usada para se conectar ao servidor SMTP e enviar emails.
Existem vários métodos comumente usados ​​nesta classe:

Python envia e-mails em várias posturas
Dê uma olhada no exemplo 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()

Vamos enviar a nós mesmos um teste de e-mail com base no exemplo:
Estou aqui para testar usando um servidor SMTP local, o que significa instalar um serviço que suporte o protocolo SMTP, como sendmail, postfix, etc.
CentOS install sendmail: yum install 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)
{}

Entre nas caixas de correio dos destinatários do Tencent e NetEase, e você poderá ver os e-mails de teste que acabaram de ser enviados, que geralmente são filtrados pelo servidor da caixa de correio como spam, portanto, não há caixa de entrada, você tem que ir para a lata de lixo.

Python envia e-mails em várias posturas

Como você pode ver, vários destinatários podem ser colocados em uma lista para envio em grupo. No objeto msg, From representa o remetente, Assunto é o título do e-mail e o conteúdo do e-mail é inserido após a quebra de linha.
O acima é o e-mail enviado usando o servidor SMTP local. No teste, use o servidor 163 para enviar e-mail para ver o efeito:

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

Ao visitar o URL 163 fornecido, o erro SMTP554 é: "554 DT: SUM O remetente do envelope e o remetente do timbre não correspondem;"
Provavelmente já entendi o que isso significa. Quando uso o servidor SMTP local acima, o local do destinatário é " "-recipientes" não divulgados, a razão pela qual o servidor SMTP 163 não nos fornece serviço é que o destinatário não é especificado aqui.
Modifique novamente o objeto msg e adicione o destinatário:

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

Python envia e-mails em várias posturas

Ok, você pode enviar e-mails normalmente. O formato da msg é regulamentado pelo SMTP e deve ser seguido.

2. Python envia e-mails e 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 envia e-mails em várias posturas

s.sendmail (from_mail, to_mail + cc_mail, msg) Observe aqui, por que o destinatário e o remetente CC devem ser enviados juntos? Na verdade, não importa se é o destinatário ou o CC, os e-mails que eles recebem são os mesmos e o SMTP assume que o destinatário os envia um por um. Portanto, na verdade não existe o conceito de CC, basta adicionar as informações da pessoa no cabeçalho do e-mail! Além disso, se você não precisar copiar a pessoa, apenas exclua as informações no cc acima.

3. Python envia e-mails com anexos

Como o método SMTP.sendmail () não oferece suporte à adição de anexos, você pode usar o módulo de e-mail para atender às suas necessidades. O módulo de e-mail é um módulo para construir e analisar e-mails.
Vejamos primeiro como usar a biblioteca de e-mail para construir um e-mail simples:

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

O formato básico é assim!
Continue voltando ao tópico, envie um e-mail com os anexos:

#!/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 envia e-mails em várias posturas

4. Python envia 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 envia e-mails em várias posturas

5. Python enviar e-mail com imagem

#!/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 envia e-mails em várias posturas

O acima é uma forma comum de enviar e-mails em Python, amigos que costumam escrever scripts ainda precisam estar familiarizados com ele!

Acho que você gosta

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