Как определить каталог вместо одного файла для отправки нескольких изображений как часть сообщения MIME в Python - PullRequest
1 голос
/ 23 марта 2020

Я слежу за этими примерами -> https://docs.python.org/3.4/library/email-examples.html, чтобы отправить сообщение MIME, в которое можно вложить изображения.

Этот пример кода доставляет мне неприятности:

# Import smtplib for the actual sending function
import smtplib

# Here are the email package modules we'll need
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

COMMASPACE = ', '

# Create the container (outer) email message.
msg = MIMEMultipart()
msg['Subject'] = 'Our family reunion'
# me == the sender's email address
# family = the list of all recipients' email addresses
msg['From'] = me
msg['To'] = COMMASPACE.join(family)
msg.preamble = 'Our family reunion'

# Assume we know that the image files are all in PNG format
for file in pngfiles:
    # Open the files in binary mode.  Let the MIMEImage class automatically
    # guess the specific image type.
    with open(file, 'rb') as fp:
        img = MIMEImage(fp.read())
    msg.attach(img)

# Send the email via our own SMTP server.
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()

В частности это:

for file in pngfiles:
# Open the files in binary mode.  Let the MIMEImage class automatically
# guess the specific image type.
with open(file, 'rb') as fp:
    img = MIMEImage(fp.read())
msg.attach(img)

pngfiles не определен, и я не знаю, как его определить. Я попытался:

pngfiles = "C:\\Users\\Public\\Documents\\FamilyPics"

Но всякий раз, когда я запускаю код, он возвращает:

PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Public\\Documents\\FamilyPics' 

Я понимаю, что эта ошибка появляется, потому что я даю ей каталог вместо указанного c файл. Я могу отправить одно изображение, если я укажу непосредственно на изображение и его имя с использованием:

path = 'C:\\Users\\Public\\Documents\\FamilyPics\\picture.png'
f = open(path, 'rb')
img = MIMEImage(f.read())
msg.attach(img)

Но я действительно не могу понять, как указать каталог, содержащий вместо этого несколько изображений одного указанного c файла. Пожалуйста помоги. Вот мой полный код, который работает для отправки одного файла:

import smtplib

from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

me = 'my_email'
me_pass = 'my_pass'
family = 'receiver_email'

COMMASPACE = ', '

text = """\
Hi,
How are you?
:)
"""

part1 = MIMEText(text, "plain")

msg = MIMEMultipart()
msg['Subject'] = 'Our family reunion' 
msg['From'] = me
msg['To'] = COMMASPACE.join(family)
msg.preable = 'Our family reunion'

path = 'C:\\Users\\Public\\Documents\\FamilyPics\\picture.png'
f = open(path, 'rb')
img = MIMEImage(f.read())
msg.attach(part1)
msg.attach(img)

s = smtplib.SMTP('smtp.gmail.com', 587)
s.ehlo()
s.starttls()
s.ehlo()

s.login(me, me_pass)

s.send_message(msg, me, family)
s.quit()

1 Ответ

1 голос
/ 24 марта 2020

pngfiles - это список файлов png.

Так что вам может понадобиться это:

def find_by_postfix(postfix, folder):
    for root, _, files in os.walk(folder):
        for file in files:
            if file.endswith(postfix):
                yield os.path.join(root, file)

pngfiles = find_by_postfix('.png', path)

Тогда вы знаете, что такое файлы png:)

...