Как отправить электронное письмо с помощью boto и SES

Введение Практически каждое пользовательское приложение и веб-сайт в какой-то момент должны отправлять пользователю электронное письмо, поэтому в конечном итоге вам придется столкнуться с радостным миром программной электронной почты. Появляется довольно много сервисов, которые могут помочь вам в этом, но с каждым приложением, имеющим свои уникальные требования, немногие из этих сервисов адекватно выполняют свою работу. Поэтому, столкнувшись с этой проблемой несколько раз (и на нескольких языках), я решил написать этот небольшой пост о том, как отправлять электронную почту с помощью boto [ht

Вступление

Практически каждое пользовательское приложение и веб-сайт в какой-то момент должны отправлять пользователю электронное письмо, поэтому в конечном итоге вам придется столкнуться с радостным миром программной электронной почты. Появляется довольно много сервисов, которые могут помочь вам в этом, но с каждым приложением, имеющим свои уникальные требования, немногие из этих сервисов адекватно выполняют свою работу.

Итак, столкнувшись с этой проблемой несколько раз (и на нескольких языках), я решил написать этот небольшой пост о том, как отправлять электронную почту с помощью boto и SES . Библиотека boto - это очень хорошая оболочка для Python, которая помогает вам взаимодействовать с API AWS. Чтобы узнать больше о его возможностях, ознакомьтесь с другой моей статьей Boto о том, как загрузить файл на s3 .

Настраивать

Прежде чем вы действительно сможете что-либо сделать, вам понадобится учетная запись AWS (очевидно) вместе с ключом доступа и секретным ключом для вашей учетной записи, которые будут использоваться для аутентификации с серверами SES. Есть несколько различных способов использования ключей для аутентификации, но здесь мы просто connect_to_region методу connect_to_region, предоставленному boto.

Затем вам нужно будет подтвердить с помощью SES адрес электронной почты (адрес Gmail работает нормально) или домен, которым вы владеете. Если вы просто тестируете эту функцию, я бы посоветовал проверить только один адрес электронной почты, поскольку это немного быстрее. Все, что вам нужно сделать, это щелкнуть ссылку в электронном письме с подтверждением, которое они отправят вам, вместо добавления записей TXT в файл зоны для проверки домена.

Если вы просто используете SES впервые и вашему приложению потребуется отправлять большое количество писем, вам может потребоваться отправить запрос на увеличение квоты на отправку. Ваша учетная запись SES изначально помещается в «песочницу», что означает, что вы можете отправить не более 200 писем в течение 24 часов. После того, как вы успешно запросите увеличение своих лимитов на отправку, вы сможете отправлять гораздо больше (я получил разрешение на 50 000 в день, что намного больше, чем мне нужно).

Код

После того, как вы выполнили начальную настройку, о которой я упоминал выше, вы сможете использовать приведенный ниже код для отправки электронных писем.

 import boto.ses 
 
 AWS_ACCESS_KEY = 'YOUR-ACCESS-KEY-HERE' 
 AWS_SECRET_KEY = 'YOUR-SECRET-KEY-HERE' 
 
 class Email(object): 
 def __init__(self, to, subject): 
 self.to = to 
 self.subject = subject 
 self._html = None 
 self._text = None 
 self._format = 'html' 
 
 def html(self, html): 
 self._html = html 
 
 def text(self, text): 
 self._text = text 
 
 def send(self, from_addr=None): 
 body = self._html 
 
 if isinstance(self.to, basestring): 
 self.to = [self.to] 
 if not from_addr: 
 from_addr = ' [email protected] ' 
 if not self._html and not self._text: 
 raise Exception('You must provide a text or html body.') 
 if not self._html: 
 self._format = 'text' 
 body = self._text 
 
 connection = boto.ses.connect_to_region( 
 'us-east-1', 
 aws_access_key_id=AWS_ACCESS_KEY, 
 aws_secret_access_key=AWS_SECRET_KEY 
 ) 
 
 return connection.send_email( 
 from_addr, 
 self.subject, 
 None, 
 self.to, 
 format=self._format, 
 text_body=self._text, 
 html_body=self._html 
 ) 

Чтобы использовать этот код, все, что вам нужно сделать, это следующее:

 email = Email(to=' [email protected] ', subject='You are HTML Awesome') 
 email.text('This is a text body. Foo bar.') 
 email.html('<html><body>This is a text body. <strong>Foo bar.</strong></body></html>') # Optional 
 email.send() 

email.html() является обязательным. Если вы включите в свое электронное письмо и текст, и HTML, то оба будут включены в результирующий MIME, и почтовый клиент покажет, какой формат поддерживается или предпочитается пользователем.

Использование шаблонов электронной почты

Если вы хотите по-настоящему фантазировать, попробуйте использовать шаблонизатор. Вместо того, чтобы напрямую передавать строку тела письма, мы можем загрузить его из шаблона, как если бы вы отображали HTML-страницу в веб-фреймворке, таком как Django.

Здесь мы используем механизм шаблонов Jinja2 для обработки загрузки и рендеринга шаблона:

 import boto.ses 
 from jinja2 import Environment, PackageLoader 
 
 # Loads templates from the yourapp.templates folder 
 env = Environment(loader=PackageLoader('yourapp', 'templates')) 
 
 AWS_ACCESS_KEY = 'YOUR-ACCESS-KEY-HERE' 
 AWS_SECRET_KEY = 'YOUR-SECRET-KEY-HERE' 
 
 class Email(object): 
 def __init__(self, to, subject): 
 self.to = to 
 self.subject = subject 
 self._html = None 
 self._text = None 
 
 def _render(self, filename, context): 
 template = env.get_template(filename) 
 return template.render(context) 
 
 def html(self, filename, context): 
 self._html = self._render(filename, context) 
 
 def text(self, filename, context): 
 self._text = self._render(filename, context) 
 
 def send(self, from_addr=None): 
 # Same as before... 

Примечание . Для производственного кода не добавляйте ключи безопасности AWS непосредственно в код. Вместо этого используйте что-то вроде переменных среды.

Использование этого кода аналогично предыдущему, но вместо этого мы просто передадим имя файла шаблона и контекст, из которого будет заполнен шаблон:

 email = Email(to=' [email protected] ', subject='OMG an Email!') 
 ctx = {'username': user.username} 
 email.text('email.txt', ctx) 
 email.html('email.html', ctx) # Optional 
 email.send() 

Теперь вы можете легко создавать и отображать электронные письма в формате HTML так же, как и веб-страницы.

Заключение

Надеюсь, это короткое руководство было вам полезно. Код здесь должен быть подходящим для большинства случаев использования, хотя вы можете стать еще более продвинутым, добавив Cc, Bcc, адреса для ответа, пути возврата или даже файловые вложения.

Все эти дополнительные функции, которые я только что упомянул, за исключением вложений, могут обрабатываться функцией send_email Для отправки вложений вам нужно будет использовать send_raw_email , которая требует, чтобы вы сами создали сообщение MIME. Не волнуйтесь, это не так уж сложно благодаря почтовому пакету Python, но мы оставим это для другой статьи.

Это было вам полезно? Вы нашли ошибку? Дай мне знать в комментариях!

comments powered by Disqus

Содержание