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

Python 102: Как отправить электронное письмо с помощью SMTPLIB + Email

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

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

  • Основы по электронной почте – вид перефразирования оригинальной статьи
  • Как отправить электронную почту, используя линии to, cc и bcc
  • Как отправить нескольким адресам одновременно
  • Как добавить вложение и тело с помощью модуля электронной почты

Давайте начнем!

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

Начнем с слегка модифицированной версии кода из оригинальной статьи. Я заметил, что я забыл настроить переменную хоста в оригинале, поэтому этот пример будет немного более полным:

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

Это должно быть добавлено сразу после того, как вы создадите Сервер объект. Обычно вы хотели бы поставить этот код в функцию и вызывать его с некоторыми из этих параметров. Возможно, вы даже хотите вставить часть этой информации в файл конфигурации. Давайте сделаем это дальше.

Теперь вы можете увидеть, насколько маленьким фактическим кодом просто смотрит на саму функцию. Это 13 строк! И мы могли бы сделать его короче, если бы мы не поместили каждый предмет в тело на собственную линию, но это будет не так читабельно. Теперь мы добавим файл конфигурации для удержания информации сервера и адрес с адреса. Почему? Хорошо в работе. То же самое можно было бы подать заявку на адрес, если наша компания была куплена и объединена в другую. Мы будем использовать пакет ConfigObj вместо ConfigParser Python, когда я нахожу configurehj проще. Вы должны перейти к Индекс пакета Python (Pypi) и загрузите копию, если у вас его еще нет.

Давайте посмотрим на файл конфигурации:

Это очень простой файл конфигурации. В нем у нас есть раздел, помеченный SMTP В котором у нас есть два элемента: сервер и из_addr. Мы будем использовать configobj, чтобы прочитать этот файл и включить его в словарь Python. Вот обновленная версия кода:

Мы добавили немного проверки на этот код. Мы хотим сначала захватить путь, в котором находится сам сценарий, что это то, что base_path представляет. Далее мы объединяем этот путь с именем файла, чтобы получить полностью квалифицированный путь к файлу конфигурации. Затем мы проверяем наличие этого файла. Если это там, мы создаем словарь и если это не так, мы распечатаем сообщение и выходите из скрипта. Мы должны добавить обработчик исключений вокруг звонка Configobj, просто чтобы быть на безопасной стороне, хотя, когда файл может существовать, но быть поврежденным, или у нас не может быть разрешения, чтобы открыть его, и это будет выбрасывать исключение. Это будет небольшой проект, который вы можете попытаться самостоятельно. Во всяком случае, скажем, что все идет хорошо, и мы получаем наш словарь. Теперь мы можем извлечь хост и информацию из_адраба, используя обычный словарный синтаксис.

Теперь мы готовы узнать, как отправлять несколько электронных писем одновременно!

Как отправить несколько электронных писем одновременно

Если вы выполните поиск в Интернете на этой теме, вы, вероятно, столкнетесь с этим Stackoverflow Вопрос:| Где мы можем научиться отправлять несколько электронных писем через модуль SMTPLIB. Давайте модифицируем наш последний пример немного, поэтому мы отправляем несколько электронных писем!

Вы заметите, что в этом примере мы удалили

to_addr Параметр и добавлен Письма Параметр, который является списком адресов электронной почты. Чтобы сделать эту работу, нам нужно создать строку, разделенную запятую в К: часть тела, а также пройти список электронной почты в метод SendMail. Таким образом, мы выполняем следующее, чтобы создать простую строку разделенную запятую: ‘,’ .join (электронные письма) Отказ Просто, а? Теперь нам просто нужно выяснить, как отправить с помощью полей CC и BCC. Давайте создадим новую версию этого кода, который поддерживает эту функциональность!

В этом коде мы проходим в 3 списках, каждый с одним адресом электронной почты адрес. Мы создаем поля CC и BCC точно так же, как и раньше, но нам также нужно объединить 3 списка в один, чтобы мы могли пройти комбинированный список в метод SendMail (). Есть несколько разговоров на

Stackoverflow Что некоторые почтовые клиенты могут обрабатывать поле BCC в нечетных способах, которые позволяют получателю видеть список BCC через заголовки электронной почты. Я не могу подтвердить это поведение, но я знаю, что Gmail успешно прокладывает информацию BCC от заголовка электронной почты. Я не нашел клиента, который не нашел, но если у вас есть, не стесняйтесь сообщить нам в комментариях. Теперь мы готовы перейти к использованию модуля электронной почты Python!

Отправка вложений электронной почты с Python

Теперь мы возьмем то, что мы узнали из предыдущего раздела и смешайте его вместе с модулем электронной почты Python. Модуль электронной почты делает добавление вложений чрезвычайно легко. Вот код:

Здесь мы переименованы наша функция и добавили новый аргумент,

file_to_attach Отказ Нам также нужно добавить заголовок и создать Mimemultipart объект. Заголовок может быть создан в любое время, прежде чем добавить вложение. Мы добавляем элементы в объект MimemUltiPart (MSG), как мы бы клавиши к словарю. Вы заметите, что мы должны использовать метод Formatdate Module Module для правильной отформатированной даты. Чтобы добавить тело сообщения, нам нужно создать экземпляр Mimetext Отказ Если вы обращаете внимание, вы увидите, что мы не добавили BCC INF