Python: отправка почты через python создает неизвестное вложение

#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-строки, вы могли бы использовать это тоже, как они делали в статье. Я прошу прощения за то, что не заметил этого раньше, я отредактировал свой ответ. Я надеюсь, что это все прояснит.