Отправка электронной почты с несколькими вложениями с помощью smpt - PullRequest
1 голос
/ 26 мая 2020

У меня есть этот сценарий, который отправляет электронные письма с несколькими вложениями нескольким пользователям. Однако имена файлов вложений задаются в качестве их пути.

Полученные файлы

enter image description here

Вывод на терминал

enter image description here

Как я могу установить их имена в качестве фактических имен файлов, спасибо.

"" "

import os 
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
from email.MIMEBase import MIMEBase
from email import Encoders


#Set up crap for the attachments
files = "/tmp/test/dbfiles"
filenames = [os.path.join(files, f) for f in os.listdir(files)]
#print filenames


#Set up users for email
gmail_user = "joe@email.com"
gmail_pwd = "somepasswd"
recipients = ['recipient1','recipient2']

#Create Module
def mail(to, subject, text, attach):
   msg = MIMEMultipart()
   msg['From'] = gmail_user
   msg['To'] = ", ".join(recipients)
   msg['Subject'] = subject

   msg.attach(MIMEText(text))

   #get all the attachments
   for file in filenames:
      part = MIMEBase('application', 'octet-stream')
      part.set_payload(open(file, 'rb').read())
      Encoders.encode_base64(part)
      part.add_header('Content-Disposition', 'attachment; filename="%s"' % file)
      msg.attach(part)

   mailServer = smtplib.SMTP("smtp.gmail.com", 587)
   mailServer.ehlo()
   mailServer.starttls()
   mailServer.ehlo()
   mailServer.login(gmail_user, gmail_pwd)
   mailServer.sendmail(gmail_user, to, msg.as_string())
   # Should be mailServer.quit(), but that crashes...
   mailServer.close()

#send it
mail(recipients,
   "Todays report",
   "Test email",
   filenames)

" ""

Ответы [ 2 ]

1 голос
/ 26 мая 2020

может быть решение по этой ссылке:

Python имя файла вложения MIME по электронной почте

В основном, решение в соответствии с этим сообщением, измените это строка:

part.add_header('Content-Disposition', 'attachment; filename="%s"' % file)

в эту строку:

part.add_header('Content-Disposition', 'attachment', filename=AFileName)

Что сводится к последнему изменению:

  #get all the attachments
  for file in filenames:
  
  part = MIMEBase('application', 'octet-stream')
  part.set_payload(open(file, 'rb').read())
  Encoders.encode_base64(part)
  
  ***part.add_header('Content-Disposition', 'attachment', filename=file)***

  msg.attach(part)

Документация по использованию add_header

Надеюсь, это поможет! : D

Обновление

Имея это в вашем for l oop, вы должны получить имена файлов:

for file in filenames:

    actual_filenames = os.path.basename(file)

    #Your code

    part.add_header('Content-Disposition', 'attachment', filename=actual_filenames)
0 голосов
/ 26 мая 2020

, если он находится в том же каталоге:

import os                                  
for f in os.listdir('.'):                                                                                               
    fn, fext = os.path.splitext(f)                                                  
...