forked from volkanin/inet_protocols_slides
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path05 SMTP.html
568 lines (414 loc) · 17.8 KB
/
05 SMTP.html
1
2
3
4
5
6
7
8
9
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/reveal.css">
<link rel="stylesheet" href="css/theme/white.css">
<style type="text/css">.reveal p { text-align: left; }</style>
<style type="text/css">.reveal blockquote { font-size: 50%; }</style>
<style type="text/css">.reveal table { font-size: 75%; }</style>
<style type="text/css">.reveal p img { border: 0px; }</style>
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-markdown>
# Доставка электронной почты
## SMTP
Протоколы Интернет, лекция 5
</section>
<section data-markdown>
### План
> Госпоже правой ноге Алисы. Посылаю Вам мягкий коврик.
> С сердечным приветом, Алиса
* О какой почте речь
* Принципы организации
* Формат письма
* Протокол SMTP
* Доставка писем
</section>
<section data-markdown>
### Электронная почта
Технология и сервис по пересылке и получению электронных сообщений между пользователями в сети
«электронные письма», «письма», «сообщения»
</section>
<section data-markdown>
### Это всё почта
* UUCP (Unix-to-Unix Copy) – исторически первый
* X.400 – международный стендарт ITU-T
* Закрытые форматы – Microsoft Exchange, IBM Notes/Domino
* VipNet Деловая почта – защищенная, по нашим стандартам
* «Почта в интернете» – изначально RFC 821, 822
- Формат письма
- Simple Mail Transfer Protocol
</section>
<section data-markdown>
### Историческая справка
60-e Передача сообщений между пользователями одного мэйнфрейма
Рост ARPANET вызвал появление стандартов обмена сообщениями
**1971** Mail Box Protocol, RFC 196
Ray Tomlinson создал SNDMSG
**1973** Network Mail Meeting Summary, RFC 469
A Proposed Mail Protocol, RFC 524
</section>
<section data-markdown>
### Историческая справка
**1980** Mail Transfer Protocol, RFC 772, Jon Postel
**1981** Выход 4.1cBSD и Sendmail
**1982** SMTP описан в RFC 821 обновлен 2821 (01 г.), 5321 (08 г.)
</section>
<section data-markdown>
### Историческая справка
**1993** RFC 1425 Extended SMTP (ESMTP), обновлен 1651 (94 г.), 1869 (95 г.)
**1998** RFC 2476 Message Submission обновлен 4409 (06 г.), 6409 (11 г.)
**1999** RFC 2554 SMTP Service Extension for Authentication обновлен 4954 (07 г.), 5248 (08 г.)
15 окт. 1998 - Бесплатная почта от Mail.Ru
01 апр. 2004 - Бесплатная почта от Google
</section>
<section data-markdown>
### Названия
* в Европе, Америке — email и, реже, e-mail
* в кириллических текстах можно встретить
- электронная почта, эл. почта, интернет-почта
- имейл, мейл (транскрипция)
- е-мейл, емейл, емайл (транслитерация)
- сленг — мыло, электропочта
* в официальных русскоязычных документах
- в тексте «электронная почта»;
- в списке контактов префикс «e-mail»
</section>
<section data-markdown>
## SMTP
Simple Mail Transfer Protocol
</section>
<section data-markdown>
### Идентификация получателя
Адрес электронной почты — запись, установленная по SMTP RFC, однозначно идентифицирующая почтовый ящик, в который следует доставить сообщение электронной почты
имя почтового ящика @ почтовый домен (localpart@domain)
- localpart – до 64 символов, имя пользователя, алиас, список рассылки
- domain — как для DNS
</section>
<section data-markdown>
### Валидация
habr.com/post/274985 — «Я знал, как валидировать email-адрес. Пока не прочитал RFC»
* "Abc\@def"@example.com
* "Fred Bloggs"@example.com
* "Joe\\Blow"@example.com
* "Abc@def"@example.com
* customer/[email protected]
* !def!xyz%[email protected]
</section>
<section data-markdown>
### в других системах
Адрес UUCP – host1!host2!user
- маршрутизация «от источника»
Адрес X.400 — C=RU;A=;P=URFU;O=INSMA;OU=KVMKN;S=Volkanin;G=Leonid;
* C – Country name
* A / ADMD – Administration Management Domain
* P or PRMD – Private Management Domain
* O – Organization name
* OU – Organizational Unit Names
* G – Given name
* I – Initials
* S – Surname
</section>
<section data-markdown>
### схема работы SMTP

</section>
<section data-markdown>
### участники обмена
Mail User Agent – программа на компьютере пользователя для получения, написания, отправки и хранения сообщений
Mail Submission Agent – принимает сообщения от MUA и работает совместно с MTA для доставки
Mail Transfer Agent – передаёт сообщения от одного компьютера к другому
Mail Delivery Agent – принимаетсообщения и доставляет их в ящик получателя (или перенаправляет их на другой сервер)
Стандартно обмен — 25 / tcp
</section>
<section data-markdown>
### Сеанс работы
telnet mxs.mail.ru 25
```
→ 220 Mail.Ru ESMTP
← EHLO hostname # изначально – HELO
→ 250-mx132.mail.ru ready to serve
250-STARTTLS
250-SIZE 73400320
250 8BITMIME
← MAIL FROM: <[email protected]>
→ 250 OK
← RCPT TO: <[email protected]>
→ 250 OK
← DATA
→ 354 Go ahead
← Текст письма
← .
→ 250 OK id=1alJcW-0006XM-VF
← QUIT
→ 221 mx132.mail.ru closing connection
```
</section>
<section data-markdown>
### Ответы SMTP
Состоят из 3 цифр.
Значение первой цифры
1 - Предварительный положительный результат
2- Команда выполнена успешно
3 - Промежуточный положительный результат. Сервер ожидает от клиента дополнительные данные для завершения операции
4 - Исполнение команды временно невозможно
5 - Исполнение команды невозможно
</section>
<section data-markdown>
Значение второй цифры
0 - Синтаксическая ошибка
1 - Ответ содержит запрошенную информацию
2 - Ответ о состоянии канала передачи
5 - Ответ информирует о состоянии принимающей почтовой системы
Если ответ многострочный, то код отделяется символом "-",
в последней строке пробелом
Каждая строка ответа заканчивается последовательностью CRLF
</section>
<section data-markdown>
## Формат сообщения
</section>
<section data-markdown>
Сформировать/отобразить - задача MUA

</section>
<section data-markdown>
### Пример сообщения
```
From: Леонид <e@mail>
To: Волканин <e@mail>
Subject: Неопровержимый натуральный логарифм -
актуальная национальная задача
Date: Fri, 1 Apr 2020 09:00:00 GMT+5
Текст
```
пустая строка — \0xD\0xA\0xD\0xA
</section>
<section data-markdown>
### Основные заголовки письма
* From, To, CC, BCC
* Subject, Date
* Sender, Reply-To
* Return-Path
* Received
* Message-ID
Не умещается на строке? Перенесите и сделайте отступ
</section>
<section data-markdown>
### MIME
Multipurpose Internet Mail Extension
MIME – стандарт, описывающий передачу различных типов данных по электронной почте
Спецификация для кодирования информации и форматирования сообщений для передачи разного рода информации внутри текстовых данных
</section>
<section data-markdown>
### MIME
Определяет набор e-mail-заголовков для определения дополнительных атрибутов сообщения
Определяет множество кодировок, которые могут быть использованы для представления 8-битных бинарных данных с помощью символов из 7-битного ASCII
5 штук RFC 2045 — 2049
</section>
<section data-markdown>
### Примеры заголовков MIME
* Mime-Version: 1.0
* Content-Type – тип сообщения
* Content-Type: text/plain; charset=KOI-8
* Content-Type: application/octet-stream
* Content-Transfer-Encoding – тип транспортного кодирования
* Content-Transfer-Encoding: base64
</section>
<section data-markdown>
### Тип содержимого
Content-Type: базовый тип / прикладной тип
* application
- application/octet-stream, application/pdf
* audio
* image
- image/jpg, image/png
* message
* model
* multipart
* text
- text/plain, text/html
* video
</section>
<section data-markdown>
### пример улучшенного сообщения
```
From: =?utf-8?B?0JvQtdC+0L3QuNC0?= <e@mail>
To: …
Subject: …
Date: Fri, 1 Apr 2016 09:00:00 GMT+5
Content-Type: text/html; charset=windows-1251
<p style="color:red">Важный текст</p>
```
</section>
<section data-markdown>
### Составные письма
Содержимое письма состоит из нескольких частей, содержащих данные различных типов
Например — письмо + файл (вложение)
* multipart/mixed
* multipart/alternative
* multipart/related
* multipart/digest
* multipart/form-data
* multipart/signed
* multipart/encrypted
</section>
<section data-markdown>
### Пример составного сообщения
```
From: …
Content-Type: multipart/mixed; boundary=qwerty
--qwerty
Content-Type: text/plain; charset=windows-1251
Часть 1
--qwerty
Content-Type: image/gif
Content-Transfer-Encoding: base64
Content-Disposition:attachment;filename:"tips.gif"
Base64 от файла
--qwerty--
```
</section>
<section data-markdown>
## Доставка сообщений
</section>
<section data-markdown>
### Mail Submission
Как у MSA появляются письма?
* приняли по SMTP
* вызвали локальную программу для постановки в очередь
* положили в «каталог подбора»
Принятое письмо кладём в SPOOL
- конверт и текущий статус
- само сообщение
По таймеру достаём письмо и думаем что делать
</section>
<section data-markdown>
### Маршрутизация писем
По аналогии с маршрутизацией IP
| вариант действия ||
|----------------------------|----------------|
| Не нам ли адресован пакет? | x.x.x.x/32 |
| Есть маршрут? | 192.168.0.0/24 |
| Или это группа? | 224.0.0.1/8 |
| Если нет – по умолчанию | 0.0.0.0/0 |
</section>
<section data-markdown>
### Маршрутизация писем
Письмо предлагается зарегистрированным «роутерам»
| вариант действия ||
|-------------------------------------------------|-----------------------------------|
| Адресовано нам? | Локальный домен |
| Может это рассылка? | Размножить и в очередь |
| Может отправить соседу, с которым договорились? | SMTP Relay |
| Может старший товарищ разберется? | Smart host |
| Нет? | Будем сами искать, как доставить… |
</section>
<section data-markdown>
### Локальные домены
Адресованные локальным доменам письмапередаются MDA,
он проверит правильность получателя и положит в ящик
```
## Local Transport
# Disable local transport (so that system accounts can't receive)
local_transport = error: Local Transport Disabled
# Don't use local alias maps
alias_maps =
# Local domain (could be omitted, since it is automatically derived from $myhostname)
mydomain = example.com
# Mails for these domains will be transported locally
mydestination =
$myhostname
localhost.$mydomain
localhost
```
</section>
<section data-markdown>
### Списки рассылок
Mailing list

</section>
<section data-markdown>
### Пересылка почты
Почтовый посредник, RELAY
Сценарии работы:
* Запасной сервер, принимает почту, но пересылает основному
* Сервер провайдера
* Внешний антивирусный или спам-фильтр, пересылает почту на наш сервер после проверки
</section>
<section data-markdown>
### Smart host
Всю нелокальную почту отправляем для разбирательства «старшему серверу»
Сценарии использования
* Внутренний сервер не имеет выхода в Интернет
smart host = шлюз во внешний мир
* Используется своё пространство имён DNS
</section>
<section data-markdown>
### Поиск сервера назначения
имя почтового ящика @ почтовый домен
Формат имени почтового домена совпадает с DNS
Использование DNS-записи MX нужно, чтобы почта домена обслуживалась другим сервером
```
volkanin.ru IN MX [10] mx.yandex.net
```
Позволяет организовать внешний хостинг
Если записи MX нет, то IP сервера назначения совпадает с IP-адресом домена DNS
</section>
<section data-markdown>
### Прием конечным сервером
Алгоритм такой же
* Локальный домен?
* Возможно, мы – запасной сервер, пересылка
* Возможно, мы – внешний сервер, пересылаем всё внутрь, на smart host
* Если нет? Не принимаем письмо!
</section>
<section data-markdown>
### Возможные проблемы
* Не удаётся найти сервер-получатель в DNS
* Не удаётся связаться (выключен или отфильтрован 25/tcp)
* Не существует получателя
* Нет места на диске
* Ещё варианты?
Надо бы сообщить отправителю, но как?
</section>
<section data-markdown>
### NDR
Отчёт о невозможности доставки
* Non-Delivery Report
* Delivery status notification
* Bounce Message
Формируется письмо от MAILER-DAEMON@.. на адрес, указанный в заголовке Return-Path
Хотя можно просто проигнорировать
</section>
<section data-markdown>
### NDR
Правильная ли картинка в wiki ?

</section>
<section data-markdown>
# Вопросы ?
</section>
</div>
</div>
<script src="js/reveal.js"></script>
<script>
Reveal.initialize({
hash: true,
slideNumber: true,
center: false,
dependencies: [
{ src: 'plugin/markdown/marked.js' },
{ src: 'plugin/markdown/markdown.js' },
{ src: 'plugin/math/math.js', async: true },
{ src: 'plugin/notes/notes.js', async: true },
{ src: 'plugin/highlight/highlight.js', async: true }
]
});
</script>
</body>
</html>