Изменение расширения почтового вложения на .bin с функцией python SMTP - PullRequest
0 голосов
/ 27 января 2020

Когда я отправляю электронное письмо с приложением (документ Excel), используя python и smtplib, находящийся в приложении документ теряет свое расширение и без причины превращается в файл .bin.

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders


Smail = "example@hotmail.com"
Smailpass = "password"
Rmail = "example@yahoo.com"

msg = MIMEMultipart()
msg['From'] = Smail
msg['To'] = Rmail
msg['Subject'] = "Subject of the Mail"
MailMSG = "this is a test py"

msg.attach(MIMEText(MailMSG, 'plain'))
# attach file
myfile = "document.xlsx"
attachment = open("custom directory/document.xlsx", "rb")

p = MIMEBase('application', 'octet-stream')
p.set_payload((attachment).read())
encoders.encode_base64(p)
p.add_header('Content-Decomposition', 'attachment, filename="document.xlsx"')
msg.attach(p)
# login and send
Mailserver = smtplib.SMTP("smtp.live.com", 587)
Mailserver.ehlo()
Mailserver.starttls()
Mailserver.login(Smail, Smailpass)
text = msg.as_string()
Mailserver.sendmail(Smail, Rmail, text)
Mailserver.quit()

1 Ответ

0 голосов
/ 27 января 2020

У вас есть несколько опечаток здесь.

p.add_header('Content-Decomposition', 'attachment, filename="document.xlsx"')

Имя заголовка: Content-Disposition, и вы должны иметь точку с запятой после расположения, а не запятую.

p.add_header('Content-Disposition', 'attachment; filename="document.xlsx"')

Раньше было недостаточно, когда указание имени файла в заголовке Content-Disposition: было недостаточным, поэтому у некоторых клиентов все еще есть запасной вариант с поясом и подтяжками, а также добавление ; name="document.xslx" к заголовку Content-Type: application/octet-stream части тела. Возможно также использовать стандартный тип содержимого IANA для Excel; см. Каков правильный тип пантомимы для docx, pptx et c? , который предполагает application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

... итак, вы должны посмотреть на что-то вроде

Content-Type: multipart/mixed; boundary="===============5298122497454831280=="
MIME-Version: 1.0
From: example@hotmail.com
To: example@yahoo.com
Subject: Subject of the Mail

--===============5298122497454831280==
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit

this is a test py
--===============5298122497454831280==
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;
     name="document.xlsx"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="document.xlsx"

77+/dHJpcGzuu64=

--===============5298122497454831280==--

(где я заменил данные base64 простым заполнителем).

(Кроме того, Python тупо настаивает на добавлении заголовка MIME-Version: к каждой части тела, но это совершенно не нужно.)

...