hynet1024 发表于 2023-8-18 16:28:08

关于Python附件发送问题

我在使用Python发送邮件时遇到一个问题,就是收到的常见的 txt、xls等类型的附件文件不能直接查看。但是通过邮件客户端发送后打开显示正常。

附代码,请指点。

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email import encoders

sender = "xxx123@163.com"
receiver = "xxx@qq.com"

content = "测试邮件内容"
file_path = "mail.txt"
message = MIMEMultipart()
message["Subject"] = "Hello"
message["From"] = sender
message["To"] = receiver
text = MIMEText(content, "plain", "utf-8")
message.attach(text)
with open(file_path, "rb") as f:
    attachment = MIMEApplication(f.read(), Name="附件")
    encoders.encode_base64(attachment)
    attachment.add_header("Content-Disposition", "attachment", filename = file_path)
    message.attach(attachment)

smtp_obj = smtplib.SMTP("smtp.163.com", 25)
smtp_obj.login("xxx@163.com", "************")
try:
    smtp_obj.sendmail(sender, receiver, message.as_string())
    print("邮件发送成功!")
except smtplib.SMTPException as err:
    print('邮件发送失败:', err)
smtp_obj.quit()

isdkz 发表于 2023-8-18 16:28:30

问题分析:
根据提供的代码,你使用Python中的smtplib库发送邮件,并附带了一个附件。但是收到的附件文件不能直接查看,需要通过邮件客户端才能正常打开。你想知道如何解决这个问题。

解决方案:
问题出在添加附件的方式上。在添加附件时,你使用了MIMEApplication类将文件内容作为附件添加到邮件中。但是缺少了设置附件的Content-Type和Content-Disposition的步骤,导致附件无法正常显示。

以下是修改后的代码示例:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email import encoders

sender = "xxx123@163.com"
receiver = "xxx@qq.com"

content = "测试邮件内容"
file_path = "mail.txt"
message = MIMEMultipart()
message["Subject"] = "Hello"
message["From"] = sender
message["To"] = receiver
text = MIMEText(content, "plain", "utf-8")
message.attach(text)

with open(file_path, "rb") as f:
    attachment = MIMEApplication(f.read())
    attachment.add_header("Content-Disposition", "attachment", filename=file_path)
    message.attach(attachment)

smtp_obj = smtplib.SMTP("smtp.163.com", 25)
smtp_obj.login("xxx@163.com", "************")
try:
    smtp_obj.sendmail(sender, receiver, message.as_string())
    print("邮件发送成功!")
except smtplib.SMTPException as err:
    print('邮件发送失败:', err)
smtp_obj.quit()


在修改后的代码中,我们使用MIMEApplication类将文件内容作为附件添加到邮件中,并通过add_header方法设置了附件的Content-Disposition。这样可以确保附件在接收方能够正常显示。

希望这个解决方案对你有帮助。如果还有其他问题,请随时提问。

学习编程中的Ben 发表于 2023-8-18 16:28:42

问题分析:
你在使用Python发送邮件时遇到的问题是,收到的附件文件无法直接查看,但是通过邮件客户端发送后可以正常打开。

解决方案:
问题可能出在邮件附件的编码上。为了确保附件能够正确传输和显示,你需要指定正确的编码方式,并且对附件进行适当的编码处理。

下面是修改后的代码,请参考:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email import encoders

sender = "xxx123@163.com"
receiver = "xxx@qq.com"
content = "测试邮件内容"
file_path = "mail.txt"

message = MIMEMultipart()
message["Subject"] = "Hello"
message["From"] = sender
message["To"] = receiver

text = MIMEText(content, "plain", "utf-8")
message.attach(text)

with open(file_path, "rb") as f:
    attachment = MIMEApplication(f.read())
    attachment.add_header("Content-Disposition", "attachment", filename=file_path)
    message.attach(attachment)

smtp_obj = smtplib.SMTP("smtp.163.com", 25)
smtp_obj.login("xxx@163.com", "")

try:
    smtp_obj.sendmail(sender, receiver, message.as_string())
    print("邮件发送成功!")
except smtplib.SMTPException as err:
    print('邮件发送失败:', err)

smtp_obj.quit()


在这个修改后的代码中,我去除了对附件内容的编码操作encoders.encode_base64(attachment),并且在创建附件对象时不指定编码方式,默认使用二进制传输附件内容。

请尝试运行修改后的代码,查看是否能够正常显示附件内容。如果问题仍然存在,请提供更多详细的错误信息或现象,以便我能够进一步帮助你解决问题。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 关于Python附件发送问题