Email
Смаль Дмитрий
smal@corp.mail.ru
E-mail vs Email
История Email
1965 – программа mail для CTSS, пересылка в
пределах мейнфрейма
1971 – первый email в сети ARPANET
1978 – программа uucp для обмена Email в UNIX
1982 – предложен протокол SMTP (RFC 821) и
формат интернет сообщений (RFC 822)
1984 – FidoNET
190x – Развитие локальной почты, Microsoft
Mail, IBM Lotus Notes
1998 – Mail.Ru
2004 – Gmail
Формат электронного письма
From: Dmitry Smal <smal@corp.mail.ru>
To: Pupkin <v.pupkin@gmail.com>
Subject: party for everybody discuss
Date: Fri, 18 May 2012 08:17:59 -0700
Hi there!
Can't stop dancing! And you?
Bye bye!
Заголовки Email
From, To – от кого и кому письмо
Subject – тема письма
Date – дата отправки
Message-ID – уникальный идентификатор письма
References – id письма на которое отвечаем
Сс – “копия”, аналогичен To, но означает, что
получатель – не главный
Bcc – “скрытая копия”, аналогиче Сс, но
получатели не увидят email указанный в Bcc
Reply-To – email адрес, на который нужно
отвечать
Content-Type – MIME тип содержимого
Содержимое письма
Первоначальная кодировка – 7bit ASCII
Как передать что-то большее ?
1) Quoted printable =EA =0C
2) Base64 YW55IGNhcm5hbCBwbGVhcw==
Современные почтовые агенты поддерживают 8bit
Content-Type: text/plain; charset=utf-8
MIME
Multipurpose Internet Message Extensions
Задачи
1) Передача не-ASCII текста через ASCII канал
2) Передача не-текстовых приложений
3) Передача сообщений из нескольких частей
(multipart body messages)
4) Передача не-ASCII заголовков
Заголовки
Content-ID – уникальный ID части, для ссылок
Content-Type – MIME тип сообщения или части
Content-Disposition – расположение части
Content-Transfer-Encoding – кодирование части
To: =?UTF-8?B?0JTQuNC80LA=?= <mialinx@gmail.com>
Content-Type: multipart/mixed;
boundary="----4MNjdUkz-ZBcPvpoGwPsUtn9u:1338241794"
------4MNjdUkz-ZBcPvpoGwPsUtn9u:1338241794
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64
Ym9keQ==
------4MNjdUkz-ZBcPvpoGwPsUtn9u:1338241794
Content-Type: application/octet-stream;
name="=?UTF-8?B?ZmF2aWNvbi5pY28=?="
Content-Disposition: attachment
Content-Transfer-Encoding: base64
AAABAAEAEBAAAAEAIABoBA..........AAAAAAAA==
------4MNjdUkz-ZBcPvpoGwPsUtn9u:1338241794--
Цепочки писем
У письма есть идентификатор (почти уникальный):
Message-ID: <19951223543.3034.qmail@gmail.com>
При ответе на сообщение агент добавляет
MessageID исходного письма в References
References: <A> <B> <C>
Таким образом: A → B → C → текущее письмо
Обычно в Subject письма добавляется Re:
> А содержимое исходного письма
> отбивается символами “больше”
Процесс передачи Email
MUA – Mail User Agent – программа,
предоставляющая пользовательский интерфейс,
например MS Outlook, sendmail
MTA – Mail Transfer Agent (relay) – программа
(почтовый сервер), отвечающая за пересылку
почты к по сети. SMTP протокол.
MDA – Mail Delivery Agent – программа,
отвечающая за доставку почты конечному
пользователю. POP3 и IMAP
SMTP – отправка почты
Simple Mail Transfer Protocol
1) Работает поверх TCP, порт 25
2) Текстовый протокол
Команды: MAIL FROM, RCPT TO, DATA, QUIT
Статусы ответа: 2xx – команды выполнена
3xx – ожидаются доп. данные
4xx – временная ошибка
5xx – неисправимая ошибка
3) ESMTP – набор расширений для SMTP:
TLS, Авторизация, Pipelining
C:HELO
S:250 domain name should be qualified
C:MAIL FROM: <someusername@somecompany.ru>
S:250 someusername@somecompany.ru sender accepted
C:RCPT TO:<user1@company.tld>
S:250 user1@company.tld ok
C:DATA
S:354 Enter mail, end with "." on a line by itself
C:from: someusername@somecompany.ru
C:to: user1@company.tld
C:subject: tema
C:
C:Hi!
C:.
S:250 769947 message accepted for delivery
C:QUIT
Отправка писем из python
import smtplib
from email.MIMEText import MIMEText
text = 'Тестовое письмо!nОтправка письма из python'
msg = MIMEText(text, "", "utf-8")
msg['Subject'] = 'Тестовое письмо'
msg['From'] = 'support.tonics@gmail.com'
msg['To'] = 'destination@mail.ru'
s = smtplib.SMTP('smtp.gmail.com', 25)
s.ehlo()
s.starttls()
s.ehlo()
s.login("support.tonics@gmail.com", "password")
s.sendmail('support.tonics@gmail.com', 'destination@mail.ru',
msg.as_string())
s.quit()
Хранение и получение почты
1) Изначально планировалось хранить почту на
компьютере пользователя. Relay – только
временное хранилище.
POP3 – протокол получения почты из
почтового ящика.
2) Однако у хранения почты на отдельном
сервере есть преимущества – надежность,
доступность.
IMAP – протокол доступа к содержимому
почтового ящика.
POP3 – получение почты
Post Office Protocol
1) Работает поверх TCP, порт 110
2) Текстовый протокол
APOP – авторизация (в зашифрованом виде)
USER, PASS – авторизация в открытом виде
LIST – получение списка сообщений
RETR – получение одного сообщения
DELE – удаление сообщения с ящика
QUIT – выход
3) “Транзакции” - письма удаляются только при
отключении клиента
4) Опциональная поддержка шифрования TLS
C: APOP mrose c4c9334bac560ecc979e58001b3e22fb
S: +OK mrose's maildrop has 2 messages (320 octets)
C: STAT
S: +OK 2 320
C: LIST
S: +OK 2 messages (320 octets)
S: 1 120
S: 2 200
S: .
C: RETR 1
S: +OK 120 octets
S: <the POP3 server sends message 1>
S: .
C: DELE 1
S: +OK message 1 deleted
C: QUIT
Почему текстовые протоколы?
1) Не нужно специальных программ – достаточно
простого текстового редактора
2) Не нужно средств отладки – протокол можно
отлаживать просто просматривая его
3) Не нужно специальных клиентов – вы можете
использовать HTTP, SMTP, POP3 с помощью
telnet
4) Переносимость
Обзор серверов
Courier
Mail Server
Рассылки email
1) По набору email адресов (зачастую спам)
2) Груповые адреса (RFC 2142)
info@domain.com – маркетинг
support@domain.com – тех. поддержка
postmaster@domain.com – поддержка почты
hostmaster@domain.com – поддержка DNS
webmaster@domain.com – поддержка веб-сайта
3) Cписки рассылки (mailing list)
Специальный адрес python-list@python.org
Сервер рассылки
Цифровые подписи
PGP – Pretty Good Privacy
OpenPGP – стандарт, выросший из PGP
PGP, GnuPG, FileCrypt – реализации стандарта,
программное обеспечение, позволяющее шифровать
и подписывать email и даже диски!
Основа PGP – сеть доверия, схема похажая на
иерархию центров сертификации, но у
пользователя есть возможность самому выбрать
какому сертификату он доверяет.
Уровень 0 – сертификат, которому вы доверяете
Уровень 1 – вы доверяете тем, кому доверяет
обладатель данного сертификата
Уровень 2 – фактически равносилен встроенному
Как это выглядит в Email ?
From: Dmitry Smal <mialinx@gmail.com>
To: mialinx@gmail.com
Subject: GPG test
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
-----BEGIN PGP MESSAGE-----
Charset: ISO-8859-1
Version: GnuPG v2.0.19 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
hQEMA8ijKqZcm8oeAQf/dcpkWwglHLN4A
. . .
mRunewtvjjTj3pLfjPkuZaEzIQU=3D
=3DHHsM
-----END PGP MESSAGE-----
Как бороться со спамом?
- Фильтрация (байесовский фильтр) – 95%
эффективность, требует обучения
- Ручная фильтрация
- Крупные компании содержат отделы аналитиков
- Blacklist – списки IP адресов с которых
идет спам
Причина спама – SMTP не проверяет отправителя
- Проверка обратной зоны DNS
- Отказ от открытых релеев, авторизация SMTP
- SPF записи в DNS
SPF – Sender Policy Framework
Допустим есть домен company.com
В DNS делается запись вида:
company.com. IN TXT "v=spf1 +a +mx -all"
Либо, например
company.com. IN TXT "v=spf1 ip4:192.168.0.1/16
-all"
Это ограничивает адреса SMTP серверов company.com
Теперь принимающий SMTP сервер, получив запрос на
отправку письма от имени user@company.com с ip
адреса x.y.z.w, может сделать запрос к DNS и
определить имеет ли данный хост права на отправку
почты из указанного домена
DKIM
Как не стать спамером ?
1) Создается пара - публичный/закрытый ключ
2) Публичный ключ для домена помещается в DNS:
_domainkey.example.com. TXT "t=s; o=~;"
mail._domainkey.example.com. TXT
"k=rsa; t=s; p={PUBLIC_KEY_CONTENT}"
3) SMTP сервер вашего домена подписывает
каждое отправленное письмо с помощью
закрытого ключа, добавляя к письмам
заголовок DKIM-Signature
4) Принимающий SMTP сервер получает открытый
ключ из DNS и проверяет подпись
Домашняя работа
Отправьте / прочитайте email
с помощью telnet

Web весна 2012 лекция 12

  • 1.
  • 2.
  • 3.
    История Email 1965 –программа mail для CTSS, пересылка в пределах мейнфрейма 1971 – первый email в сети ARPANET 1978 – программа uucp для обмена Email в UNIX 1982 – предложен протокол SMTP (RFC 821) и формат интернет сообщений (RFC 822) 1984 – FidoNET 190x – Развитие локальной почты, Microsoft Mail, IBM Lotus Notes 1998 – Mail.Ru 2004 – Gmail
  • 4.
    Формат электронного письма From:Dmitry Smal <smal@corp.mail.ru> To: Pupkin <v.pupkin@gmail.com> Subject: party for everybody discuss Date: Fri, 18 May 2012 08:17:59 -0700 Hi there! Can't stop dancing! And you? Bye bye!
  • 5.
    Заголовки Email From, To– от кого и кому письмо Subject – тема письма Date – дата отправки Message-ID – уникальный идентификатор письма References – id письма на которое отвечаем Сс – “копия”, аналогичен To, но означает, что получатель – не главный Bcc – “скрытая копия”, аналогиче Сс, но получатели не увидят email указанный в Bcc Reply-To – email адрес, на который нужно отвечать Content-Type – MIME тип содержимого
  • 6.
    Содержимое письма Первоначальная кодировка– 7bit ASCII Как передать что-то большее ? 1) Quoted printable =EA =0C 2) Base64 YW55IGNhcm5hbCBwbGVhcw== Современные почтовые агенты поддерживают 8bit Content-Type: text/plain; charset=utf-8
  • 7.
    MIME Multipurpose Internet MessageExtensions Задачи 1) Передача не-ASCII текста через ASCII канал 2) Передача не-текстовых приложений 3) Передача сообщений из нескольких частей (multipart body messages) 4) Передача не-ASCII заголовков Заголовки Content-ID – уникальный ID части, для ссылок Content-Type – MIME тип сообщения или части Content-Disposition – расположение части Content-Transfer-Encoding – кодирование части
  • 8.
    To: =?UTF-8?B?0JTQuNC80LA=?= <mialinx@gmail.com> Content-Type:multipart/mixed; boundary="----4MNjdUkz-ZBcPvpoGwPsUtn9u:1338241794" ------4MNjdUkz-ZBcPvpoGwPsUtn9u:1338241794 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 Ym9keQ== ------4MNjdUkz-ZBcPvpoGwPsUtn9u:1338241794 Content-Type: application/octet-stream; name="=?UTF-8?B?ZmF2aWNvbi5pY28=?=" Content-Disposition: attachment Content-Transfer-Encoding: base64 AAABAAEAEBAAAAEAIABoBA..........AAAAAAAA== ------4MNjdUkz-ZBcPvpoGwPsUtn9u:1338241794--
  • 9.
    Цепочки писем У письмаесть идентификатор (почти уникальный): Message-ID: <19951223543.3034.qmail@gmail.com> При ответе на сообщение агент добавляет MessageID исходного письма в References References: <A> <B> <C> Таким образом: A → B → C → текущее письмо Обычно в Subject письма добавляется Re: > А содержимое исходного письма > отбивается символами “больше”
  • 10.
    Процесс передачи Email MUA– Mail User Agent – программа, предоставляющая пользовательский интерфейс, например MS Outlook, sendmail MTA – Mail Transfer Agent (relay) – программа (почтовый сервер), отвечающая за пересылку почты к по сети. SMTP протокол. MDA – Mail Delivery Agent – программа, отвечающая за доставку почты конечному пользователю. POP3 и IMAP
  • 12.
    SMTP – отправкапочты Simple Mail Transfer Protocol 1) Работает поверх TCP, порт 25 2) Текстовый протокол Команды: MAIL FROM, RCPT TO, DATA, QUIT Статусы ответа: 2xx – команды выполнена 3xx – ожидаются доп. данные 4xx – временная ошибка 5xx – неисправимая ошибка 3) ESMTP – набор расширений для SMTP: TLS, Авторизация, Pipelining
  • 13.
    C:HELO S:250 domain nameshould be qualified C:MAIL FROM: <someusername@somecompany.ru> S:250 someusername@somecompany.ru sender accepted C:RCPT TO:<user1@company.tld> S:250 user1@company.tld ok C:DATA S:354 Enter mail, end with "." on a line by itself C:from: someusername@somecompany.ru C:to: user1@company.tld C:subject: tema C: C:Hi! C:. S:250 769947 message accepted for delivery C:QUIT
  • 14.
    Отправка писем изpython import smtplib from email.MIMEText import MIMEText text = 'Тестовое письмо!nОтправка письма из python' msg = MIMEText(text, "", "utf-8") msg['Subject'] = 'Тестовое письмо' msg['From'] = 'support.tonics@gmail.com' msg['To'] = 'destination@mail.ru' s = smtplib.SMTP('smtp.gmail.com', 25) s.ehlo() s.starttls() s.ehlo() s.login("support.tonics@gmail.com", "password") s.sendmail('support.tonics@gmail.com', 'destination@mail.ru', msg.as_string()) s.quit()
  • 15.
    Хранение и получениепочты 1) Изначально планировалось хранить почту на компьютере пользователя. Relay – только временное хранилище. POP3 – протокол получения почты из почтового ящика. 2) Однако у хранения почты на отдельном сервере есть преимущества – надежность, доступность. IMAP – протокол доступа к содержимому почтового ящика.
  • 16.
    POP3 – получениепочты Post Office Protocol 1) Работает поверх TCP, порт 110 2) Текстовый протокол APOP – авторизация (в зашифрованом виде) USER, PASS – авторизация в открытом виде LIST – получение списка сообщений RETR – получение одного сообщения DELE – удаление сообщения с ящика QUIT – выход 3) “Транзакции” - письма удаляются только при отключении клиента 4) Опциональная поддержка шифрования TLS
  • 17.
    C: APOP mrosec4c9334bac560ecc979e58001b3e22fb S: +OK mrose's maildrop has 2 messages (320 octets) C: STAT S: +OK 2 320 C: LIST S: +OK 2 messages (320 octets) S: 1 120 S: 2 200 S: . C: RETR 1 S: +OK 120 octets S: <the POP3 server sends message 1> S: . C: DELE 1 S: +OK message 1 deleted C: QUIT
  • 18.
    Почему текстовые протоколы? 1)Не нужно специальных программ – достаточно простого текстового редактора 2) Не нужно средств отладки – протокол можно отлаживать просто просматривая его 3) Не нужно специальных клиентов – вы можете использовать HTTP, SMTP, POP3 с помощью telnet 4) Переносимость
  • 19.
  • 20.
    Рассылки email 1) Понабору email адресов (зачастую спам) 2) Груповые адреса (RFC 2142) info@domain.com – маркетинг support@domain.com – тех. поддержка postmaster@domain.com – поддержка почты hostmaster@domain.com – поддержка DNS webmaster@domain.com – поддержка веб-сайта 3) Cписки рассылки (mailing list) Специальный адрес python-list@python.org Сервер рассылки
  • 21.
  • 22.
    PGP – PrettyGood Privacy OpenPGP – стандарт, выросший из PGP PGP, GnuPG, FileCrypt – реализации стандарта, программное обеспечение, позволяющее шифровать и подписывать email и даже диски! Основа PGP – сеть доверия, схема похажая на иерархию центров сертификации, но у пользователя есть возможность самому выбрать какому сертификату он доверяет. Уровень 0 – сертификат, которому вы доверяете Уровень 1 – вы доверяете тем, кому доверяет обладатель данного сертификата Уровень 2 – фактически равносилен встроенному
  • 23.
    Как это выглядитв Email ? From: Dmitry Smal <mialinx@gmail.com> To: mialinx@gmail.com Subject: GPG test Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable -----BEGIN PGP MESSAGE----- Charset: ISO-8859-1 Version: GnuPG v2.0.19 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ hQEMA8ijKqZcm8oeAQf/dcpkWwglHLN4A . . . mRunewtvjjTj3pLfjPkuZaEzIQU=3D =3DHHsM -----END PGP MESSAGE-----
  • 25.
    Как бороться соспамом? - Фильтрация (байесовский фильтр) – 95% эффективность, требует обучения - Ручная фильтрация - Крупные компании содержат отделы аналитиков - Blacklist – списки IP адресов с которых идет спам Причина спама – SMTP не проверяет отправителя - Проверка обратной зоны DNS - Отказ от открытых релеев, авторизация SMTP - SPF записи в DNS
  • 26.
    SPF – SenderPolicy Framework Допустим есть домен company.com В DNS делается запись вида: company.com. IN TXT "v=spf1 +a +mx -all" Либо, например company.com. IN TXT "v=spf1 ip4:192.168.0.1/16 -all" Это ограничивает адреса SMTP серверов company.com Теперь принимающий SMTP сервер, получив запрос на отправку письма от имени user@company.com с ip адреса x.y.z.w, может сделать запрос к DNS и определить имеет ли данный хост права на отправку почты из указанного домена
  • 27.
    DKIM Как не статьспамером ? 1) Создается пара - публичный/закрытый ключ 2) Публичный ключ для домена помещается в DNS: _domainkey.example.com. TXT "t=s; o=~;" mail._domainkey.example.com. TXT "k=rsa; t=s; p={PUBLIC_KEY_CONTENT}" 3) SMTP сервер вашего домена подписывает каждое отправленное письмо с помощью закрытого ключа, добавляя к письмам заголовок DKIM-Signature 4) Принимающий SMTP сервер получает открытый ключ из DNS и проверяет подпись
  • 28.
    Домашняя работа Отправьте /прочитайте email с помощью telnet