Некоректный вывод скринов на майл с помощью 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()
    ...
→ Ссылка