Q:

Как отправить фото на почту Python

Нужно отправить сделанный с помощью PIL скриншот + текст на почту. Просмотрел документацию, текст отправить легко, а вот с изображением png начинаются проблемы.(mail.ru, gmail)

A:

import os
import smtplib
from email.mime.image import MIMEImage
from email.mime.audio import MIMEAudio
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

class SendMessageEmail:
    def setting(self, server, port, login, password):
        self.server = smtplib.SMTP_SSL(server, port)                     # Создаем объект SMTP
        self.server.login(login, password)                               # Получаем доступ
        self.message = MIMEMultipart()                                   # Создаем сообщение
        self.message['From']    = login                                  # Адресат
    def tls(self):
        self.server.starttls()                                           # Начинаем шифрованный обмен по TLS
    def whom(self, email):
        self.message['To']      = email                                  # Получатель
    def topic(self, string):
        self.message['Subject'] = string                                 # Тема сообщения
    def addText(self, text):
        self.message.attach(MIMEText(text, 'plain'))
    def addHtml(self, html, encoding):
        self.message.attach(MIMEText(html, 'html', encoding))            # Добавляем в сообщение HTML-фрагмент

    def addImage(self, path, file_type):
        path = os.path.abspath(path)
        file_name = path.split('\\')[-1]
        with open(path, 'rb') as file:
            file = MIMEImage(file.read(), file_type)
            file.add_header('Content-Disposition', 'attachment', filename=file_name) # Добавляем заголовки
        self.message.attach(file)
    def addAudio(self, path, file_type):
        path = os.path.abspath(path)
        file_name = path.split('\\')[-1]
        with open(path, 'rb') as file:
            file = MIMEAudio(file.read(), file_type)
            file.add_header('Content-Disposition', 'attachment', filename=file_name) # Добавляем заголовки
        self.message.attach(file)

    def send(self):
        self.server.send_message(self.message)                                          # Отправляем сообщение
    def debug(self, boolean):
        self.server.set_debuglevel(boolean)
    def quit(self):
        self.server.quit()

def main():
    sending_message_email = SendMessageEmail()
    sending_message_email.setting()
    sending_message_email.whom()
    sending_message_email.topic("Скриншот")
    sending_message_email.addImage('screen.png', 'PNG')
    sending_message_email.addText('Сообщение')
    sending_message_email.send()
    sending_message_email.quit()

if __name__ == '__main__':
    main()

