Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Отправка писем из Python SMTPlib

Python SMTPlib

Недавно пришлось написать небольшой скрипт для рассылки писем к читателям с одного проекта. На PHP у меня уже ранее реализован данный скрипт, но т.к. я перешел программировать на Python мне нужно больше практики для понимания языка. Хочу сказать, что по сравнению с PHP, собственная smtp библиотека от Python гораздо удобнее для настройки в случае если нам нужна аутентификация с другого почтового сервиса.

Плюсы и минусы

Написал небольшую функцию которая должна отвечать всем вашим требованиям. Некоторые моменты с которыми были бы костыли в PHP, в Python реализованы весьма логично. Например отправлять массовое сообщение на PHP, пришлось создавать цикл и каждому получателю отправлять отдельное письмо через вызов mail(). Python нам сразу предлагает указать все нужные адресаты в общий список и передать ему - он сам разберется.

В PHP мне иногда приходилось мучится с кодировкой. Когда проверяешь и видишь, что все в порядке с кодировкой но письмо опять с иероглифами, это очень сильно бесит. Несмотря на то, что в Python, модуль smtplib принимает текст письма исключительно в ASCII, проблема с русским языков исчезает сразу если указать кодировку в самом скрипте т.е.

# -*- coding: utf-8 -*-
import smtplib
...

Используя smtplib, вам придется поработать ручками. Нужно в теле письма дописать SMTP команды такие как: From, To, Subject. Но, для вам я написал небольшую функцию которая избавит вам от этой рутины. Почему? - Потому, что я вам люблю ;)

Я использовал smtp сервер от Яндекс, т.к. с его почтой я работаю. Если вам нужно узнать адрес smtp сервера и порт другой почты, напишите в гугле "smtp gmail" например. В готовых вопросах - ответах из поддержки почты вы узнаете все нужные данные.

# -*- coding: utf-8 -*-
import smtplib
def mail(sender, subject, message, to):
    smtp_server = 'smtp.yandex.ru'
    smtp_port = 25
    smtp_pasword = 'pew_pew99'
    mail_lib = smtplib.SMTP(smtp_server, smtp_port)
    mail_lib.login(sender, smtp_pasword)
    # В случае если функции передан не список с получателями
    # а обычную строку
    if isinstance(to, str):
        to = ','.join(to)
    msg = 'From: %s\r\nTo: %s\r\nContent-Type: text/html; charset="utf-8"\r\nSubject: %s\r\n\r\n' % (sender, to, subject)
    msg += message
    mail_lib.sendmail(sender, to, msg)
# отправляем письмо
message = """
Привет из Python!
"""
mail('JessePinkman@yandex.ru', 'Yeah Bitch! Magnets!', message, 'Walter_White@yahoo.com')

Первый параметр функции sender должен содержать email отправителя к которому соответствуют SMTP данные из функции. Если менять email отправителя не меняя настроек smtp в самой функции, тогда сообщение не будет доставлено.

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

Комментариев: 4
  1. Спасибо круто!

  2. Сергей | 2014-06-03 в 17:47:14

    Большое спасибо за статью! Но я для таких целей использую Юнисендер(http://www.unisender.com/ru/)

  3. Статья очень плохая, очень много говнокода, а автор на момент написания статьи даже не удосужился прочитать о сравнении строковых объектов.

    "if isinstance(to, str)" - ты серьезно? а если придет строка Unicode?

    message = """

    Привет из Python! - это вообще шедевр! текст письма в исходниках да еще и многострочный! молодец!!!

    """

  4. для дибилов таких как Rom4eg, python 3 (полночтью unicode)

    а насчет """xxxxx""" для вида.