在Python smtplib中附加一个txt文件

Dav*_*542 29 python email smtp

我发送的纯文本电子邮件如下:

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

def send_message():
    msg = MIMEMultipart('alternative')
    s = smtplib.SMTP('smtp.sendgrid.net', 587)
    s.login(USERNAME, PASSWORD)

    toEmail, fromEmail = to@email.com, from@email.com
    msg['Subject'] = 'subject'
    msg['From'] = fromEmail
    body = 'This is the message'

    content = MIMEText(body, 'plain')
    msg.attach(content)
    s.sendmail(fromEmail, toEmail, msg.as_string())
Run Code Online (Sandbox Code Playgroud)

除了这条消息,我还想附上一个txt文件'log_file.txt'.我如何在这里附上一个txt文件?

Mar*_*mro 40

同样的方式,使用msg.attach:

from email.mime.text import MIMEText

filename = "text.txt"
f = file(filename)
attachment = MIMEText(f.read())
attachment.add_header('Content-Disposition', 'attachment', filename=filename)           
msg.attach(attachment)
Run Code Online (Sandbox Code Playgroud)

  • 作为旁注,我必须在附件之后附上内容*或者正文中没有显示纯文本. (4认同)

Edv*_*har 12

从 Python3.6 开始,我建议开始使用 EmailMessage 而不是 MimeMultipart。更少的导入,更少的行,不需要将收件人放在邮件头和 SMTP 发件人函数参数中。

import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg["From"] = FROM_EMAIL
msg["Subject"] = "Subject"
msg["To"] = TO_EMAIL
msg.set_content("This is the message body")
msg.add_attachment(open(filename, "r").read(), filename="log_file.txt")

s = smtplib.SMTP('smtp.sendgrid.net', 587)
s.login(USERNAME, PASSWORD)
s.send_message(msg)
Run Code Online (Sandbox Code Playgroud)

更妙的是安装库信封pip3 install envelope该公司的目标是处理一个非常直观的方式很多事情:

from envelope import Envelope
from pathlib import Path

Envelope()\
    .from_(FROM_EMAIL)\
    .subject("Subject")\
    .to("to")\
    .message("message")\
    .attach(Path(filename))\
    .smtp("smtp.sendgrid.net", 587, USERNAME, PASSWORD)\
    .send()
Run Code Online (Sandbox Code Playgroud)