Python 附件发送邮件?

3 投票
2 回答
1410 浏览
提问于 2025-04-17 07:04

我正在用Python编程。我已经有一个可以发送带附件邮件的函数,但问题是它把邮件内容当作附件发送了。我需要的是邮件内容作为邮件正文,附件作为附件。我查了一下,发现这和MIME多部分“MIXED”有关,但我不知道怎么把这个添加或更改到我现在的函数里。

下面是我正在使用的函数的Python代码:

def enviarCorreo(fromaddr, toaddr, file):
    msg = MIMEMultipart('mixed')
    msg['From'] = fromaddr
    msg['To'] = toaddr
    msg['Subject'] = 'asunto'
    #adjunto
    adjunto = MIMEBase('application', "octet-stream")
    adjunto.set_payload(open(file, "rb").read())
    encode_base64(adjunto)
    adjunto.add_header('Content-Disposition', 'attachment; filename= "%s"' % file)
    msg.attach(adjunto)
    #enviar
    server = smtplib.SMTP('localhost')
    server.set_debuglevel(1)
    server.sendmail(fromaddr, toaddr, msg.as_string())
    server.quit()
    return

2 个回答

0

你可以在这个电子邮件模块的示例中找到答案和一些其他有用的想法。

其中一个示例似乎使用了msg.preamble = "..."来设置主要的消息文本。

3

你忘了把文本附加上,应该用 msg.attach( MIMEText(text) ) 这个方法。

def enviarCorreo(fromaddr, toaddr, text, file):
    msg = MIMEMultipart('mixed')
    msg['From'] = fromaddr
    msg['To'] = toaddr
    msg['Subject'] = 'asunto'

    #This is the part you had missed.
    msg.attach( MIMEText(text) )

    #adjunto
    adjunto = MIMEBase('application', "octet-stream")
    adjunto.set_payload( open(file,"rb").read() )
    Encoders.encode_base64(adjunto)
    adjunto.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file))
    msg.attach(adjunto)

    server = smtplib.SMTP('localhost')
    server.set_debuglevel(1)
    server.sendmail(fromaddr, toaddr, msg.as_string())
    server.close()

enviarCorreo("x@from.com", ["y@to.com"], "Hello World", ['/tmp/sample.png'])

看看这样是否能解决你的问题。

撰写回答