#python #python-3.x #smtplib
#питон #python-3.x #smtplib
Вопрос:
Я пытаюсь отправить письмо вложение (PDF-файл) с помощью python. Письмо отправлено, но вложение становится неизвестным вложением, а не файлом .pdf
Мой код выглядит следующим образом:
import smtplib
import os
import ssl
import email
from email import encoders
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
port = 465
smtp_server = "smtp.gmail.com"
subject = "An example of txt.file"
sender = "..."
receiver = "..."
password = "..."
message = MIMEMultipart()
message["From"] = sender
message["To"] = receiver
message["Subject"] = subject
filename = '318.pdf'
attachment = open(filename, "rb")
part = MIMEBase("application", "octet-stream")
part.set_payload(attachment.read())
part.add_header('Content Disposition', 'attachment', filename=filename)
encoders.encode_base64(part)
message.attach(part)
message.attach(part)
body = "This is an example of how to send an email with an .pdf-attachment."
message.attach(MIMEText(body, 'plain'))
text = message.as_string()
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server:
server.login(sender, password)
server.sendmail(sender, receiver, text)
print('Sent')
Что в этом плохого или что я должен сделать по-другому?
Я пробовал разные типы файлов, файл .pdf находится в каталоге файлов python…
Комментарии:
1. сделал это, все еще отправляет неизвестное вложение
2. Я использую MIMEApplication вместо MIMEBase
3. пробовал и это … та же проблема для меня
4. Также я использую MimeMultipart (‘mixed’)
Ответ №1:
Вы написали
part.add_header('Content Disposition', 'attachment', filename=filename)
Но имя аргумента ‘filename’ должно быть указано в виде строки, и вы также пропустили дефис в ‘Content-Disposition’. Попробуй
part.add_header('Content-Disposition', 'attachment; filename=' filename)
Это должно решить вашу проблему. Просто обращаю ваше внимание, что вы прикрепили «часть» дважды — в строках 20 и 22.
Я думаю, вы, возможно, уже следите за этой статьей. Но если нет, я думаю, вы найдете это полезным.
Комментарии:
1. Это та статья, за которой я следил, вы правы. Если я изменю код на: part.add_header(‘Расположение содержимого’, ‘вложение’, ‘filename’=filename), все, что я получу, это ошибка синтаксиса: выражение не может содержать присваивание
2. Я думаю, вы имеете в виду.
add_header('Content-Disposition', 'attachment; filename=' filename)
3. Да, это «Расположение контента», а не «Расположение контента». Вы забыли про дефис. Кроме того, в статье, за которой вы следили, они использовали f-строку для объединения второго аргумента, чего вы не сделали. Таким образом, вы могли бы либо выполнить это, как показал @geckos, либо, если ваша версия python поддерживает f-строки, вы могли бы использовать это тоже, как они делали в статье. Я прошу прощения за то, что не заметил этого раньше, я отредактировал свой ответ. Я надеюсь, что это все прояснит.