python - 发送邮件时 .xlsx 和 .pdf 更改为 .bin
问题描述
我正在尝试通过电子邮件发送 2 个文件(一个 Excel 和一个 PDF),但接收方仅获得 .bin 扩展名。这是我的工作代码:
from smtplib import SMTP
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import mimetypes
def get_att_mime(path):
mimetypes.init()
mimetype, _ = mimetypes.guess_type(path)
if mimetype is None:
print("on a pas trouvé de bon MIME, risque de problème d'extension à l'arrivée du mail !!!")
mimetype = 'application/octet-stream'
type_, _, subtype = mimetype.partition('/')
att_mime = MIMEBase(type_, subtype)
return att_mime
def create_mime(d):
mime_multipart = MIMEMultipart()
mime_multipart['From'] = d["From"]
mime_multipart['To'] = d["To"]
mime_multipart['Subject'] = d["Subject"]
mime_multipart.attach(MIMEText(d["msg"]))
return mime_multipart
def add_file_list(mime, file_path_list=[]):
[add_file(mime, file_path) for file_path in file_path_list]
def add_file(mime, file_path):
attachment = open(file_path, "rb")
att_mime = get_att_mime(file_path)
att_mime.set_payload(attachment.read())
# encode into base64
encoders.encode_base64(att_mime)
att_mime.add_header('Content-Disposition', "attachment; filename= %s" % file_path)
mime.attach(att_mime)
"""
def add_file(mime, file_path):
print(get_attachment_from_path(file_path))
attachment = open(file_path, "rb")
p = MIMEBase('application', 'octet-stream')
p.set_payload(attachment.read())
# encode into base64
encoders.encode_base64(p)
p.add_header('Content-Disposition', "attachment; filename= %s" % file_path)
mime.attach(p)
"""
def create_smtp_session(d):
s = SMTP('smtp.gmail.com', 587)
# start TLS for security
s.starttls()
s.login(d["From"], d["sender_password"])
return s
def send_mail(d):
mime = create_mime(d)
add_file_list(mime, d["filename_list"])
try:
s = create_smtp_session(d)
s.sendmail(d["From"], d["To"], mime.as_string())
except Exception as e:
print(e)
print("échec de l'envoi de mail")
print(d)
return -1
s.quit()
print("envoi de mail réussi")
return 0
if __name__ == "__main__":
d = {
"From": "YOUREMAIL.com",
"To": "FINALUSEREMAIL.fr",
"Subject": "Sujet du mail",
"sender_password": "YOUREMAILPASSWORD",
"msg": "Bonjour,\n\nTexte du message.\n\nCordialement,",
"filename_list": ["model.xlsx","model.pdf"]
}
state = send_mail(d)
如果我发送 simples 文档,它就像一个魅力,但是当我发送一个我修改过的 Excel(使用 openpyxl)和一个我基于这个 Excel 创建的 pdf 时,接收者得到 .bin 扩展名而不是 .xlsx 和 . .pdf 我不知道它来自哪里,我想这是一个 Mime 问题(解码器/编码器),但我没有收到任何警告。
解决方案
推荐阅读
- javascript - 如何获取对 Firebase 图像的引用以便能够将其删除?
- postgresql - 无法确定类型:javax.persistence.EntityManagerFactory,列:[org.hibernate.mapping.Column(emf)]
- node.js - 邮递员工作但对 redux 操作没有反应(axios.post 请求)
- go - 如何实现下面描述的功能
- javascript - 将 Hijir 日期添加到脚本中
- arrays - 为什么我在使用 nodeJS 和 yargs 时不断收到错误消息,提示我 JSON 输入意外结束
- python - DateTimeField 的 ArrayField 引发“django.db.utils.ProgrammingError: cannot cast type timestamp with time zone to timestamp with time zone[]”
- javascript - 如何根据输入值选择选项?
- html - 网页中的背景音频
- excel - 大工作簿的动态排序