Рубрики
Без рубрики

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

Автор оригинала: Scott Robinson.

Вступление

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

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

Установка

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

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

Если вы просто используете SES в первый раз и вашему приложению нужно будет отправить большой объем электронных писем, то вам может потребоваться отправить запрос на увеличение квоты отправки. Ваша учетная запись SIS изначально помещается в “песочницу”, что означает, что вы можете отправить только 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('This is a text body. Foo bar.')  # 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 email , но мы прибережем это для другой статьи.

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