Статьи

Отправка писем в Python с помощью SMTP

В этом руководстве вы познакомитесь с SMTP, модулем Python, используемым для отправки почты. Также будет продемонстрировано, как отправлять различные типы электронных писем, такие как простые текстовые электронные письма, электронные письма с вложениями и электронные письма с содержанием HTML.

Протокол SMTP (Simple Mail Transfer Protocol) обрабатывает отправку и маршрутизацию электронной почты между почтовыми серверами.

В Python модуль smtplib определяет объект сеанса клиента SMTP, который можно использовать для отправки почты на любой компьютер Интернета с демоном слушателя SMTP или ESMTP.

Вот как создать объект SMTP.

1
2
3
import smtplib
 
server = smtplib.SMTP(host=’host_address’,port=your_port)

Следующий скрипт позволит вам отправить электронное письмо через SMTP-сервер Gmail. Однако Google не разрешит вход через smtplib поскольку этот тип входа помечен как «менее безопасный». Чтобы решить эту проблему, перейдите на страницу https://www.google.com/settings/security/lesssecureapps, когда вы вошли в свою учетную запись Google, и «Разрешить менее безопасные приложения». Смотрите скриншот ниже.

Создать и отправить простое электронное письмо

Мы выполним следующие шаги для выполнения этого процесса:

  • Создайте объект SMTP для подключения к серверу.
  • Войдите в свою учетную запись.
  • Определите заголовки сообщений и учетные данные для входа.
  • Создайте MIMEMultipart сообщения MIMEMultipart и присоедините к нему соответствующие заголовки, т.е. From, To и Subject.
  • Прикрепить сообщение к сообщению MIMEMultipart объект.
  • Наконец, отправьте сообщение.

Этот процесс так же прост, как показано ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# import necessary packages
 
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
 
# create message object instance
msg = MIMEMultipart()
 
 
message = «Thank you»
 
# setup the parameters of the message
password = «your_password»
msg[‘From’] = «your_address»
msg[‘To’] = «to_address»
msg[‘Subject’] = «Subscription»
 
# add in the message body
msg.attach(MIMEText(message, ‘plain’))
 
#create server
server = smtplib.SMTP(‘smtp.gmail.com: 587’)
 
server.starttls()
 
# Login Credentials for sending the mail
server.login(msg[‘From’], password)
 
 
# send the message via the server.
server.sendmail(msg[‘From’], msg[‘To’], msg.as_string())
 
server.quit()
 
print «successfully sent email to %s:» % (msg[‘To’])

Обратите внимание, что адреса «Кому» и «От» должны быть явно включены в заголовки сообщения.

В этом примере мы собираемся отправить электронное письмо с вложенным изображением. Процесс аналогичен отправке простого текстового электронного письма.

  • Создайте объект SMTP для подключения к серверу.
  • Войдите в свою учетную запись.
  • Определите заголовки сообщений и учетные данные для входа.
  • Создайте MIMEMultipart сообщения MIMEMultipart и присоедините к нему соответствующие заголовки, т.е. From, To и Subject.
  • Прочитайте и приложите изображение к сообщению MIMEMultipart объекта.
  • Наконец, отправьте сообщение.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# send_attachment.py
# import necessary packages
from email.mime.multipart import MIMEMultipart
from email.MIMEImage import MIMEImage
from email.mime.text import MIMEText
import smtplib
 
# create message object instance
msg = MIMEMultipart()
 
 
# setup the parameters of the message
password = «your_password»
msg[‘From’] = «your_address»
msg[‘To’] = «to_address»
msg[‘Subject’] = «Photos»
 
# attach image to message body
msg.attach(MIMEImage(file(«google.jpg»).read()))
 
 
# create server
server = smtplib.SMTP(‘smtp.gmail.com: 587’)
 
server.starttls()
 
# Login Credentials for sending the mail
server.login(msg[‘From’], password)
 
 
# send the message via the server.
server.sendmail(msg[‘From’], msg[‘To’], msg.as_string())
 
server.quit()
 
print «successfully sent email to %s:» % (msg[‘To’])

Класс MIMEImage является подклассом MIMENonMultipart который используется для создания объектов сообщений MIME типов изображений. Другие доступные классы включают
MIMEMessage и MIMEAudio .

Первое, что мы собираемся сделать, это создать шаблон электронной почты в формате HTML.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<html>
<head>
    
   <title>Tutsplus Email Newsletter</title>
   <style type=»text/css»>
    a {color: #d80a3e;}
  body, #header h1, #header h2, p {margin: 0;
  #main {border: 1px solid #cfcece;}
  img {display: block;}
  #top-message p, #bottom p {color: #3f4042;
  #header h1 {color: #ffffff !important;
  #header p {color: #ffffff !important;
  h5 {margin: 0 0 0.8em 0;}
    h5 {font-size: 18px;
  p {font-size: 12px;
   </style>
</head>
<body>
<table width=»100%» cellpadding=»0″ cellspacing=»0″ bgcolor=»e4e4e4″><tr><td>
<table id=»top-message» cellpadding=»20″ cellspacing=»0″ width=»600″ align=»center»>
    <tr>
      <td align=»center»>
        <p><a href=»#»>View in Browser</a></p>
      </td>
    </tr>
  </table>
 
<table id=»main» width=»600″ align=»center» cellpadding=»0″ cellspacing=»15″ bgcolor=»ffffff»>
    <tr>
      <td>
        <table id=»header» cellpadding=»10″ cellspacing=»0″ align=»center» bgcolor=»8fb3e9″>
          <tr>
            <td width=»570″ align=»center» bgcolor=»#d80a3e»><h1>Evanto Limited</h1></td>
          </tr>
          <tr>
            <td width=»570″ align=»right» bgcolor=»#d80a3e»><p>November 2017</p></td>
          </tr>
        </table>
      </td>
    </tr>
 
    <tr>
      <td>
        <table id=»content-3″ cellpadding=»0″ cellspacing=»0″ align=»center»>
          <tr>
              <td width=»250″ valign=»top» bgcolor=»d0d0d0″ style=»padding:5px;»>
              <img src=»https://thumbsplus.tutsplus.com/uploads/users/30/posts/29520/preview_image/pre.png» width=»250″ height=»150″ />
            </td>
              <td width=»15″></td>
            <td width=»250″ valign=»top» bgcolor=»d0d0d0″ style=»padding:5px;»>
                <img src=»https://cms-assets.tutsplus.com/uploads/users/30/posts/29642/preview_image/vue-2.png» width =»250″ height=»150″ />
            </td>
          </tr>
        </table>
      </td>
    </tr>
    <tr>
      <td>
        <table id=»content-4″ cellpadding=»0″ cellspacing=»0″ align=»center»>
          <tr>
            <td width=»200″ valign=»top»>
              <h5>How to Get Up and Running With Vue</h5>
              <p>In the introductory post for this series we spoke a little about how web designers can benefit by using Vue.
            </td>
            <td width=»15″></td>
            <td width=»200″ valign=»top»>
              <h5>Introducing Haiku: Design and Create Motion</h5>
              <p>With motion on the rise amongst web developers so too are the tools that help to streamline its creation.
            </td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
  <table id=»bottom» cellpadding=»20″ cellspacing=»0″ width=»600″ align=»center»>
    <tr>
      <td align=»center»>
        <p>Design better experiences for web & mobile</p>
        <p><a href=»#»>Unsubscribe</a> |
      </td>
    </tr>
  </table><!— top message —>
</td></tr></table><!— wrapper —>
 
</body>
</html>

Шаблон будет выглядеть примерно так:

Шаблон HTML

Ниже приведен скрипт для отправки электронного письма с HTML-контентом. Содержимое шаблона будет нашим почтовым сообщением.

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import smtplib
import email.message
server = smtplib.SMTP(‘smtp.gmail.com:587’)
 
email_content = «»»
<html>
 
<head>
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″>
    
   <title>Tutsplus Email Newsletter</title>
   <style type=»text/css»>
    a {color: #d80a3e;}
  body, #header h1, #header h2, p {margin: 0;
  #main {border: 1px solid #cfcece;}
  img {display: block;}
  #top-message p, #bottom p {color: #3f4042;
  #header h1 {color: #ffffff !important;
  #header p {color: #ffffff !important;
  h5 {margin: 0 0 0.8em 0;}
    h5 {font-size: 18px;
  p {font-size: 12px;
   </style>
</head>
 
<body>
 
 
<table width=»100%» cellpadding=»0″ cellspacing=»0″ bgcolor=»e4e4e4″><tr><td>
<table id=»top-message» cellpadding=»20″ cellspacing=»0″ width=»600″ align=»center»>
    <tr>
      <td align=»center»>
        <p><a href=»#»>View in Browser</a></p>
      </td>
    </tr>
  </table>
 
<table id=»main» width=»600″ align=»center» cellpadding=»0″ cellspacing=»15″ bgcolor=»ffffff»>
    <tr>
      <td>
        <table id=»header» cellpadding=»10″ cellspacing=»0″ align=»center» bgcolor=»8fb3e9″>
          <tr>
            <td width=»570″ align=»center» bgcolor=»#d80a3e»><h1>Evanto Limited</h1></td>
          </tr>
          <tr>
            <td width=»570″ align=»right» bgcolor=»#d80a3e»><p>November 2017</p></td>
          </tr>
        </table>
      </td>
    </tr>
 
    <tr>
      <td>
        <table id=»content-3″ cellpadding=»0″ cellspacing=»0″ align=»center»>
          <tr>
              <td width=»250″ valign=»top» bgcolor=»d0d0d0″ style=»padding:5px;»>
              <img src=»https://thumbsplus.tutsplus.com/uploads/users/30/posts/29520/preview_image/pre.png» width=»250″ height=»150″ />
            </td>
              <td width=»15″></td>
            <td width=»250″ valign=»top» bgcolor=»d0d0d0″ style=»padding:5px;»>
                <img src=»https://cms-assets.tutsplus.com/uploads/users/30/posts/29642/preview_image/vue-2.png» width =»250″ height=»150″ />
            </td>
          </tr>
        </table>
      </td>
    </tr>
    <tr>
      <td>
        <table id=»content-4″ cellpadding=»0″ cellspacing=»0″ align=»center»>
          <tr>
            <td width=»200″ valign=»top»>
              <h5>How to Get Up and Running With Vue</h5>
              <p>In the introductory post for this series we spoke a little about how web designers can benefit by using Vue.
            </td>
            <td width=»15″></td>
            <td width=»200″ valign=»top»>
              <h5>Introducing Haiku: Design and Create Motion</h5>
              <p>With motion on the rise amongst web developers so too are the tools that help to streamline its creation.
            </td>
          </tr>
        </table>
      </td>
    </tr>
     
 
  </table>
  <table id=»bottom» cellpadding=»20″ cellspacing=»0″ width=»600″ align=»center»>
    <tr>
      <td align=»center»>
        <p>Design better experiences for web & mobile</p>
        <p><a href=»#»>Unsubscribe</a> |
      </td>
    </tr>
  </table><!— top message —>
</td></tr></table><!— wrapper —>
 
</body>
</html>
 
 
«»»
 
msg = email.message.Message()
msg[‘Subject’] = ‘Tutsplus Newsletter’
 
 
msg[‘From’] = ‘youraddress’
msg[‘To’] = ‘to_address’
password = «yourpassword»
msg.add_header(‘Content-Type’, ‘text/html’)
msg.set_payload(email_content)
 
s = smtplib.SMTP(‘smtp.gmail.com: 587’)
s.starttls()
 
# Login Credentials for sending the mail
s.login(msg[‘From’], password)
 
s.sendmail(msg[‘From’], [msg[‘To’]], msg.as_string())

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

Форматированное HTML письмо

Этот учебник охватывает большую часть того, что необходимо для отправки электронной почты для вашего приложения. Существует несколько API-интерфейсов для отправки электронных писем, поэтому вам не нужно начинать с нуля, например, SendGrid , но также важно понимать основы. Для получения дополнительной информации посетите документы Python .

Кроме того, не стесняйтесь посмотреть, что у нас есть в наличии для продажи и для обучения в Envato Market , и, пожалуйста, задавайте любые вопросы и оставляйте ценные отзывы, используя канал ниже.