Я хотел бы отправлять электронные письма с вложениями размером 10 МБ или более на VPS с небольшим объемом оперативной памяти; обычный способ отправить электронное письмо с вложениями в Python 3 (который я нашел) таков:
from email.message import EmailMessage
# import other needed stuff here omitted for simplicity
attachment = 'some_file.tar'
msg = EmailMessage()
# set from, to, subject here
# set maintype, subtype here
with open(attachment, 'rb') as fd:
msg.add_attachment(fd.read(), # this is the problem, the whole file is loaded
maintype=maintype,
subtype=subtype,
filename=attachment)
# smtp_serv is an instance of smtplib.SMTP
smtp_serv.send_message(msg)
При таком подходе весь файл загружается в память, а затем объект EmailMessage отправляется с помощью smtplib.SMTP.send_message, я ожидаю, что это способ предоставить add_attachment дескриптор файла (или итерируемый) вместо содержимого файла, который читается в ленивом подходе (например, построчно или по некоторому фиксированному количеству байтов), когда вложение отправляется на сервер, например:
with open('somefile') as fd:
msg.add_attachment(fd, maintype=mt, subtype=st, filename=fn)
smtp_serv.send_message(msg)
Есть ли способ сделать это (отправить вложение без загрузки всего файла сразу) с помощью стандартной библиотеки (электронная почта и smtplib)???? Я не могу найти подсказку в документации по Python.
Заранее спасибо.
mmap
вместо строки? - person Davis Herring   schedule 01.11.2018