Некоректный вывод скринов на майл с помощью MIMEImage
Суть программы: Каждые 10 сек отправлять на майл по одному скрину.
Проблема: Начиная со второй отправки, программа отправляет уже не одно, а два скрина, т.е. добавляет текущий скрин к предыдущему.
msg = MIMEMultipart()
while True:
pyautogui.screenshot('screen.png')
img_data = open('screen.png', 'rb')
image = MIMEImage(img_data.read(), name=os.path.basename('screen.png'))
msg.attach(image)
img_data.close()
os.remove(os.path.basename('screen.png'))
server = smtplib.SMTP('smtp.mail.ru')
server.starttls()
server.login(msg['From'], password)
server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()
time.sleep(10)
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Одним из решений будет пересоздание MIMEMultipart в цикле, но придется заново заполнять его поля:
while True:
msg = MIMEMultipart()
...
Однако, посмотрев исходники увидел недокументированный способ в Lib\email\message.py:
#
# Payload manipulation.
#
def attach(self, payload):
"""Add the given payload to the current payload.
The current payload will always be a list of objects after this method
is called. If you want to set the payload to a scalar object, use
set_payload() instead.
"""
if self._payload is None:
self._payload = [payload]
else:
try:
self._payload.append(payload)
except AttributeError:
raise TypeError("Attach is not valid on a message with a"
" non-multipart payload")
Не советую этим пользоваться, т.к. в других версиях или реализациях питона этого может и не быть.
Использование такое:
while True:
if msg._payload:
msg._payload.clear()
...