среда, 17 февраля 2016 г.

Как отправить письмо через Gmail со встроенным изображением с Python

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

  Если Вы знаете способ лучше - пишите, буду рад просветиться.
Нужно заметить, кстати, что скрипт  будет работать с почтой google только если разрешить непроверенные приложения (https://www.google.com/settings/security/lesssecureapps).
Этот пост, кстати, изначально отправлен с помощью скрипта. Пришлось подправить подсветку синтаксиса, но в планах прикрутить Pygments.

#-----------------------------------------
# Загрузим все необходимые модули
import os
# Import smtplib for the sending function
import smtplib
# Import the email modules
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
#-----------------------------------------
# С какого адреса на какой будем посылать
# Также необходимо вписать свой пароль
me = 'from@gmail.com'
you = 'to@gmail.com'
gmail_user = me
gmail_pwd = '*******'
# ВНИМАНИЕ, чтобы скрипт работал, нужно
# разрешить непроверенные приложения
# https://www.google.com/settings/security/lesssecureapps
#-----------------------------------------
# Создадим сообщение
msg = MIMEMultipart()
msg['Subject'] = 'The topic'
msg['From'] = me
msg['To'] = you
ImgFileName = "img.png"
# добавлем к сообщению текст со ссылкой на вложенное изображение
msgText = MIMEText('<b>Message text!</b><br><img src="cid:%s"><br>' % (ImgFileName), 'html')
msg.attach(msgText)
# считываем данные изображения
img_data = open(ImgFileName, 'rb').read()
# добавлем изображение
image = MIMEImage(img_data, name=os.path.basename(ImgFileName))
image.add_header('Content-ID', '<{}>'.format(ImgFileName))
msg.attach(image)
#-----------------------------------------
# Отправим наше письмо
s = smtplib.SMTP_SSL('smtp.gmail.com',465)
s.ehlo()
s.login(gmail_user, gmail_pwd)
s.sendmail(me, [you], msg.as_string())
s.close()

Метки: python, блог

2 комментария:

  1. Единственное, смущает, что пароль подаётся плэйнтекстом прям в скрипте. Как вариант, можно, хотя бы, брать из файла, к которому выставлены права 600.

    ОтветитьУдалить
    Ответы
    1. SMTP_SSL как бы намекает что он при пересылке шифруется, не? А хранение его в скрипте - ну е-мое, и часто вы даете паблик доступ на свои исходники?

      Удалить