使用python发送带有(docx)附件的邮件



我一直在尝试通过python发送一封带有Docx附件的邮件

我能够收到一封邮件,但没有附件,下面是我用于附加文件的代码在附加文件

时没有出现任何错误
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
sender_email = email
receiver_email = toemail
password = password
message = MIMEMultipart("alternative")
message["Subject"] = Subject
message["From"] = sender_email
message["To"] = receiver_email
message.attach(htmlmessage)
attach_file = open(attach_file_name, 'rb') # Open the file as binary mode
payload = MIMEBase('application', 'octet-stream')
payload.set_payload((attach_file).read())
encoders.encode_base64(payload)
#encode the attachment
#add payload header with filename
payload.add_header('Content-Disposition', "attachment; filename= %s" % attach_file)
message.attach(payload)
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
server.login(sender_email, password)
server.sendmail(
sender_email, receiver_email, message.as_string()
)


Mime类型是被尊重的。类型multipart/alternative应该用于纯文本和HTML中包含相同信息的消息。然后,邮件阅读器可以选择它可以使用的表示形式。

另一方面,当消息包含多个不同的部分时,应使用multipart/mixed,以不同的方式表示传输附件

所以,如果htmlmessage是有效的email.mime.text.MIMEText,你的代码不应该声明"alternative":

...
message = MIMEMultipart()
...

此外,您应该避免直接使用MIMEBase,而是依赖于MIMEApplication的默认值:

payload = MIMEApplication(attach_file.read(),
'vnd.openxmlformats-officedocument.wordprocessingml.document')
payload.add_header('Content-Disposition',
"attachment; filename= %s" % attach_file)
message.attach(payload)

但我必须承认,最后一点主要是一个品味问题……

最新更新