鱼C论坛

 找回密码
 立即注册
查看: 624|回复: 4

[已解决]关于Python附件发送问题

[复制链接]
发表于 2023-8-18 16:28:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

附代码,请指点。

  1. import smtplib
  2. from email.mime.multipart import MIMEMultipart
  3. from email.mime.application import MIMEApplication
  4. from email.mime.text import MIMEText
  5. from email import encoders

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

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

  21. smtp_obj = smtplib.SMTP("smtp.163.com", 25)
  22. smtp_obj.login("xxx@163.com", "************")
  23. try:
  24.     smtp_obj.sendmail(sender, receiver, message.as_string())
  25.     print("邮件发送成功!")
  26. except smtplib.SMTPException as err:
  27.     print('邮件发送失败:', err)
  28. smtp_obj.quit()
复制代码
最佳答案
2023-8-18 16:28:42
问题分析:
你在使用Python发送邮件时遇到的问题是,收到的附件文件无法直接查看,但是通过邮件客户端发送后可以正常打开。

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

下面是修改后的代码,请参考:
  1. import smtplib
  2. from email.mime.multipart import MIMEMultipart
  3. from email.mime.application import MIMEApplication
  4. from email.mime.text import MIMEText
  5. from email import encoders
  6. sender = "xxx123@163.com"
  7. receiver = "xxx@qq.com"
  8. content = "测试邮件内容"
  9. file_path = "mail.txt"
  10. message = MIMEMultipart()
  11. message["Subject"] = "Hello"
  12. message["From"] = sender
  13. message["To"] = receiver
  14. text = MIMEText(content, "plain", "utf-8")
  15. message.attach(text)
  16. with open(file_path, "rb") as f:
  17.     attachment = MIMEApplication(f.read())
  18.     attachment.add_header("Content-Disposition", "attachment", filename=file_path)
  19.     message.attach(attachment)
  20. smtp_obj = smtplib.SMTP("smtp.163.com", 25)
  21. smtp_obj.login("xxx@163.com", "[b][/b][b][/b][b][/b]")
  22. try:
  23.     smtp_obj.sendmail(sender, receiver, message.as_string())
  24.     print("邮件发送成功!")
  25. except smtplib.SMTPException as err:
  26.     print('邮件发送失败:', err)
  27. smtp_obj.quit()
复制代码

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

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

如果回答对你有帮助,请给我一个最佳答案!
IMG_4927.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-18 16:28:30 | 显示全部楼层
问题分析:
根据提供的代码,你使用Python中的smtplib库发送邮件,并附带了一个附件。但是收到的附件文件不能直接查看,需要通过邮件客户端才能正常打开。你想知道如何解决这个问题。

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

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

  1. import smtplib
  2. from email.mime.multipart import MIMEMultipart
  3. from email.mime.application import MIMEApplication
  4. from email.mime.text import MIMEText
  5. from email import encoders

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

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

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

  20. smtp_obj = smtplib.SMTP("smtp.163.com", 25)
  21. smtp_obj.login("xxx@163.com", "************")
  22. try:
  23.     smtp_obj.sendmail(sender, receiver, message.as_string())
  24.     print("邮件发送成功!")
  25. except smtplib.SMTPException as err:
  26.     print('邮件发送失败:', err)
  27. smtp_obj.quit()
复制代码


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

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

点评

已解决,感谢大牛!  发表于 2023-8-18 16:37
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-18 16:28:42 | 显示全部楼层    本楼为最佳答案   
问题分析:
你在使用Python发送邮件时遇到的问题是,收到的附件文件无法直接查看,但是通过邮件客户端发送后可以正常打开。

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

下面是修改后的代码,请参考:
  1. import smtplib
  2. from email.mime.multipart import MIMEMultipart
  3. from email.mime.application import MIMEApplication
  4. from email.mime.text import MIMEText
  5. from email import encoders
  6. sender = "xxx123@163.com"
  7. receiver = "xxx@qq.com"
  8. content = "测试邮件内容"
  9. file_path = "mail.txt"
  10. message = MIMEMultipart()
  11. message["Subject"] = "Hello"
  12. message["From"] = sender
  13. message["To"] = receiver
  14. text = MIMEText(content, "plain", "utf-8")
  15. message.attach(text)
  16. with open(file_path, "rb") as f:
  17.     attachment = MIMEApplication(f.read())
  18.     attachment.add_header("Content-Disposition", "attachment", filename=file_path)
  19.     message.attach(attachment)
  20. smtp_obj = smtplib.SMTP("smtp.163.com", 25)
  21. smtp_obj.login("xxx@163.com", "[b][/b][b][/b][b][/b]")
  22. try:
  23.     smtp_obj.sendmail(sender, receiver, message.as_string())
  24.     print("邮件发送成功!")
  25. except smtplib.SMTPException as err:
  26.     print('邮件发送失败:', err)
  27. smtp_obj.quit()
复制代码

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

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

如果回答对你有帮助,请给我一个最佳答案!

点评

感谢大牛!!!  发表于 2023-8-18 16:38
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 11:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表