-
Notifications
You must be signed in to change notification settings - Fork 0
/
action-mailbox-basics.html
510 lines (482 loc) · 59.3 KB
/
action-mailbox-basics.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
<!DOCTYPE html>
<html prefix="og: http://ogp.me/ns#">
<head>
<meta charset="utf-8">
<meta content="Ruby on Rails, Ruby, Rails, Rails 3, Rails 4, Rails 5, Rails 6, Rails 6.0, Rails 6.1, Rails 7.0, Rails 7.1 руководство, начинающим, самоучитель, manual, мануал, справочник, учебник, примеры, Руби, рельсы" name="keywords"/>
<meta content="Ruby on Rails руководства, учебники, статьи на русском языке" name="description"/>
<meta content="website" property="og:type"/>
<meta content="Rusrails: Основы Action Mailbox" property="og:title"/>
<meta content="Ruby on Rails руководства, учебники, статьи на русском языке" property="og:description"/>
<meta content="http://localhost:3000/action-mailbox-basics" property="og:url"/>
<meta content="http://rusrails.ru/assets/rusrails.png" property="og:image"/>
<title>
Rusrails: Основы Action Mailbox
</title>
<link rel="stylesheet" href="/assets/application-f9dfa6ce7fa871006d478e422639671663284ddaa3126cf81ddfe371ac3533c4.css" />
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="brand" href="/"></a>
<ul class="nav pull-right top-menu">
<li>
<a href="/">Главная</a>
</li>
<li class="dropdown">
<a class="index-popover" href="#">
Содержание
<b class="caret"></b>
</a> <div class="index-popover-content hide">
<ul><li><p><strong>С чего начать?</strong></p><ul><li><a href="/getting-started">Rails для начинающих</a>
</li></ul></li><li><p><strong>Модели</strong></p><ul><li><a href="/active-record-basics">Основы Active Record</a>
</li><li><a href="/active-record-migrations">Миграции Active Record</a>
</li><li><a href="/active-record-validations">Валидации Active Record</a>
</li><li><a href="/active-record-callbacks">Колбэки Active Record</a>
</li><li><a href="/active-record-associations">Связи (ассоциации) Active Record</a>
</li><li><a href="/active-record-querying">Интерфейс запросов Active Record</a>
</li><li><a href="/active-model-basics">Основы Active Model</a>
</li></ul></li><li><p><strong>Вью</strong></p><ul><li><a href="/action-view-overview">Обзор Action View</a>
</li><li><a href="/layouts-and-rendering">Макеты и рендеринг в Rails</a>
</li><li><a href="/action-view-helpers">Хелперы Action View</a>
</li><li><a href="/form-helpers">Хелперы форм в Action View</a>
</li></ul></li><li><p><strong>Контроллеры</strong></p><ul><li><a href="/action-controller-overview">Обзор Action Controller</a>
</li><li><a href="/routing">Роутинг в Rails</a>
</li></ul></li><li><p><strong>Другие компоненты</strong></p><ul><li><a href="/active-support-core-extensions">Расширения ядра Active Support</a>
</li><li><a href="/action-mailer-basics">Основы Action Mailer</a>
</li><li><a href="/action-mailbox-basics">Основы Action Mailbox</a>
</li><li><a href="/action-text-overview">Обзор Action Text</a>
</li><li><a href="/active_job_basics">Основы Active Job</a>
</li><li><a href="/active_storage_overview">Обзор Active Storage</a>
</li><li><a href="/action-cable-overview">Обзор Action Cable</a>
</li></ul></li><li><p><strong>Копаем глубже</strong></p><ul><li><a href="/i18n">API интернационализации Rails (I18n)</a>
</li><li><a href="/testing">Тестирование приложений на Rails</a>
</li><li><a href="/security">Безопасность приложений на Rails</a>
</li><li><a href="/error-reporting">Отчет об ошибках в приложениях Rails</a>
</li><li><a href="/debugging-rails-applications">Отладка приложений на Rails</a>
</li></ul></li></ul><p>next_column</p><ul><li><p><strong>Копаем глубже</strong></p><ul><li><a href="/configuring">Конфигурирование приложений на Rails</a>
</li><li><a href="/command-line">Командная строка Rails</a>
</li><li><a href="/asset-pipeline">Asset Pipeline</a>
</li><li><a href="/working-with-javascript-in-rails">Работа с JavaScript в Rails</a>
</li><li><a href="/initialization">Процесс инициализации в Rails</a>
</li><li><a href="/autoloading-and-reloading-constants">Автозагрузка и перезагрузка констант</a>
</li><li><a href="/caching-with-rails">Кэширование с Rails: Обзор</a>
</li><li><a href="/active-support-instrumentation">Инструментарий Active Support</a>
</li><li><a href="/api-app">Использование Rails для API-приложений</a>
</li><li><a href="/active-record-postgresql">Active Record для PostgreSQL</a>
</li><li><a href="/active-record-multiple-databases">Несколько баз данных с Active Record</a>
</li><li><a href="/active-record-encryption">Шифрование Active Record</a>
</li></ul></li><li><p><strong>Расширяем Rails</strong></p><ul><li><a href="/plugins">Основы создания плагинов Rails</a>
</li><li><a href="/rails-on-rack">Rails on Rack</a>
</li><li><a href="/generators">Создание и настройка генераторов и шаблонов Rails</a>
</li><li><a href="/engines">Engine для начинающих</a>
</li><li><a href="/threading_and_code_execution">Треды и выполнение кода в Rails</a>
</li><li><a href="/rails-application-templates">Шаблоны приложения Rails</a>
</li></ul></li><li><p><strong>Вносим вклад в Ruby on Rails</strong></p><ul><li><a href="/contributing_to_ruby_on_rails">Вносим вклад в Ruby on Rails</a>
</li><li><a href="/api_documentation_guidelines">Рекомендации по документированию API</a>
</li><li><a href="/ruby_on_rails_guides_guidelines">Рекомендации для руководств по Ruby on Rails</a>
</li><li><a href="/development_dependencies_install">Установка зависимостей для разработки</a>
</li><li><a href="/maintenance-policy">Политика поддержки (версий)</a>
</li></ul></li><li><p><strong>Заметки о релизах</strong></p><ul><li><a href="/upgrading-ruby-on-rails">Апгрейд Ruby on Rails</a>
</li><li><a href="/7_2_release_notes">Версия 7.2 - ?</a>
</li><li><a href="/7_1_release_notes">Версия 7.1 - Октябрь 2023</a>
</li><li><a href="/7_0_release_notes">Версия 7.0 - Декабрь 2021</a>
</li><li><a href="/6_1_release_notes">Версия 6.1 - Декабрь 2020</a>
</li><li><a href="/6_0_release_notes">Версия 6.0 - Август 2019</a>
</li></ul></li></ul>
</div>
</li>
<li>
<a href="/search">Поиск</a>
</li>
<li>
<a target="blank" href="http://api.rusrails.ru">Ruby & Rails API</a>
</li>
</ul>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
<div class="row-fluid">
<div class="span3 pull-right">
<div class="well social">
<h4>Принимаем пожелания и пул-реквесты!</h4>
<iframe allowtransparency="true" frameborder="0" height="30" src="http://ghbtns.com/github-btn.html?user=rusrails&repo=rusrails&type=watch&count=true&size=large" width="180"></iframe>
</div>
<div class="well menu">
<ul class="nav nav-list">
<li>
<h4>
<a href="#chto-takoe-action-mailbox">1. Что такое Action Mailbox?</a>
</h4> </li>
<li>
<h4>
<a href="#nastroyka">2. Настройка</a>
</h4> </li>
<li>
<h4>
<a href="#nastroyka-ingressa">3. Настройка ингресса</a>
</h4> </li>
<li>
<h5>
<a href="#exim">3.1. Exim</a>
</h5> </li>
<li>
<h5>
<a href="#mailgun">3.2. Mailgun</a>
</h5> </li>
<li>
<h5>
<a href="#mandrill">3.3. Mandrill</a>
</h5> </li>
<li>
<h5>
<a href="#postfix">3.4. Postfix</a>
</h5> </li>
<li>
<h5>
<a href="#postmark">3.5. Postmark</a>
</h5> </li>
<li>
<h5>
<a href="#qmail">3.6. Qmail</a>
</h5> </li>
<li>
<h5>
<a href="#sendgrid">3.7. SendGrid</a>
</h5> </li>
<li>
<h4>
<a href="#obrabotka-vhodyaschih-elektronnyh-pisem">4. Обработка входящих электронных писем</a>
</h4> </li>
<li>
<h5>
<a href="#nastroyka-marshrutizatsii">4.1. Настройка маршрутизации</a>
</h5> </li>
<li>
<h5>
<a href="#sozdanie-pochtovogo-yaschika">4.2. Создание почтового ящика</a>
</h5> </li>
<li>
<h5>
<a href="#obrabotka-email">4.3. Обработка Email</a>
</h5> </li>
<li>
<h5>
<a href="#status-vhodyaschego-pisma">4.4. Статус входящего письма</a>
</h5> </li>
<li>
<h4>
<a href="#primer">5. Пример</a>
</h4> </li>
<li>
<h4>
<a href="#local-development-and-testing">6. Локальная разработка и тестирование</a>
</h4> </li>
<li>
<h4>
<a href="#incineration-of-inboundemails">7. Уничтожение InboundEmails</a>
</h4> </li>
</ul>
</div>
<div class="well banner300 banner">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- sidebar rusrails -->
<ins class="adsbygoogle"
style="display:inline-block;width:300px;height:600px"
data-ad-client="ca-pub-7764391801669990"
data-ad-slot="6089520660"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</div>
<div class="span9 content pull-left">
<div class="banner">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- top rusrails -->
<ins class="adsbygoogle"
style="display:inline-block;width:980px;height:120px"
data-ad-client="ca-pub-7764391801669990"
data-ad-slot="4891989065"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
<h2 id='osnovy-action-mailbox' class='inside_page_header'> Основы Action Mailbox</h2><p>Это руководство предоставляет вам все, что нужно для того, чтобы начать получать письма в вашем приложении.</p><p>После его прочтения, вы узнаете:</p><ul><li>Как получать письма в приложении Rails.
</li><li>Как настраивать Action Mailbox.
</li><li>Как генерировать и маршрутизировать письма в ящик.
</li><li>Как тестировать входящие письма.
</li></ul>
<hr>
<h3 id='chto-takoe-action-mailbox' class='inside_page_header'><a href="#chto-takoe-action-mailbox">1.</a> Что такое Action Mailbox?</h3><p>Action Mailbox маршрутизирует входящие письма в подобные контроллеру ящики для обработки в приложении Rails. Action Mailbox предназначен для получения электронных писем, в то время как <a href="/action-mailer-basics">Action Mailer</a> используется для их <em>отправки</em>.</p><p>Входящие электронные письма асинхронно направляются с помощью <a href="/active_job_basics">Active Job</a> в один или несколько специализированных почтовых ящиков. Затем эти письма преобразуются в записи <a href="https://api.rubyonrails.org/classes/ActionMailbox/InboundEmail.html"><code>InboundEmail</code></a> с помощью <a href="/active-record-basics">Active Record</a>, которые могут взаимодействовать напрямую с остальными моделями вашей предметной области.</p><p>Записи <code>InboundEmail</code> также обеспечивают отслеживание жизненного цикла, хранение исходного письма с помощью <a href="/active_storage_overview">Active Storage</a> и ответственное управление данными с автоматическим <a href="#incineration-of-inboundemails">уничтожением</a> по умолчанию.</p><p>Action Mailbox поставляется с ингрессами, которые позволяют вашему приложению получать электронные письма от внешних почтовых провайдеров, таких как Mailgun, Mandrill, Postmark и SendGrid. Также можно обрабатывать входящие письма напрямую, с помощью встроенных ингрессов Exim, Postfix и Qmail.</p><h3 id='nastroyka' class='inside_page_header'><a href="#nastroyka">2.</a> Настройка</h3><p>В Action Mailbox есть несколько ключевых этапов настройки. Сначала запускаете установщик. Затем выбираете и конфигурируете ингресс для обработки входящих писем. И затем вы уже можете добавлять маршрутизацию Action Mailbox, создание почтовых ящиков и начать обрабатывать входящие письма.</p><p>Для начала давайте установим Action Mailbox:</p><div class="code_container">
<pre><code class="highlight console"><span class="gp">$</span><span class="w"> </span><span class="nb">bin/rails </span>action_mailbox:install
</code></pre>
</div>
<p>Это создаст файл <code>application_mailbox.rb</code> и скопирует миграции.</p><div class="code_container">
<pre><code class="highlight console"><span class="gp">$</span><span class="w"> </span><span class="nb">bin/rails </span>db:migrate
</code></pre>
</div>
<p>Эта команда выполнит миграции для Action Mailbox и Active Storage.</p><p>Таблица <code>action_mailbox_inbound_emails</code> в Action Mailbox хранит входящие сообщения и их статус обработки.</p><p>Теперь вы можете запустить сервер Rails и перейти по ссылке <code>http://localhost:3000/rails/conductor/action_mailbox/inbound_emails</code>. Подробности смотрите в <a href="#local-development-and-testing">Локальная разработка и тестирование</a></p><p>Следующим шагом будет настройка ингресса в вашем приложении Rails для определения способа получения входящих электронных писем.</p><h3 id='nastroyka-ingressa' class='inside_page_header'><a href="#nastroyka-ingressa">3.</a> Настройка ингресса</h3><p>Настройка ингресса включает в себя определение учетных данных и информации о конечной точке для выбранной службы электронной почты. Вот инструкции для каждого из поддерживаемого ингресса.</p><h4 id='exim' class='inside_page_header'><a href="#exim">3.1.</a> Exim</h4><p>Сообщите Action Mailbox принимать письма от релея SMTP:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="c1"># config/environments/production.rb</span>
<span class="n">config</span><span class="p">.</span><span class="nf">action_mailbox</span><span class="p">.</span><span class="nf">ingress</span> <span class="o">=</span> <span class="ss">:relay</span>
</code></pre>
</div>
<p>Сгенерируйте сложный пароль, который Action Mailbox может использовать для аутентификации запросов к ингрессу релея.</p><p>Используйте <code>bin/rails credentials:edit</code> чтобы добавить пароль в зашифрованные учетные данные вашего приложения под именем <code>action_mailbox.ingress_password</code>, по которому Action Mailbox автоматически найдет его:</p><div class="code_container">
<pre><code class="highlight yaml"><span class="na">action_mailbox</span><span class="pi">:</span>
<span class="na">ingress_password</span><span class="pi">:</span> <span class="s">...</span>
</code></pre>
</div>
<p>Альтернативно можно предоставить пароль в переменной среды <code>RAILS_INBOUND_EMAIL_PASSWORD</code>.</p><p>Настройте Exim передавать входящие письма в <code>bin/rails action_mailbox:ingress:exim</code>, предоставив <code>URL</code> ингресса релея и <code>INGRESS_PASSWORD</code>, созданный ранее. Если ваше приложение находится по адресу <code>https://example.com</code>, полная команда будет выглядеть так:</p><div class="code_container">
<pre><code class="highlight console"><span class="gp">$</span><span class="w"> </span><span class="nb">bin/rails </span>action_mailbox:ingress:exim <span class="nv">URL</span><span class="o">=</span>https://example.com/rails/action_mailbox/relay/inbound_emails <span class="nv">INGRESS_PASSWORD</span><span class="o">=</span>...
</code></pre>
</div>
<h4 id='mailgun' class='inside_page_header'><a href="#mailgun">3.2.</a> Mailgun</h4><p>Передайте Action Mailbox ваш ключ Mailgun Signing (который можно найти в Settings -> Security & Users -> API security в Mailgun), таким образом он сможет аутентифицировать запросы к ингрессу Mailgun.</p><p>Используйте <code>bin/rails credentials:edit</code>, чтобы добавить ключ Signing в зашифрованные учетные данные вашего приложения под именем <code>action_mailbox.mailgun_signing_key</code>, по которому Action Mailbox автоматически найдет его:</p><div class="code_container">
<pre><code class="highlight yaml"><span class="na">action_mailbox</span><span class="pi">:</span>
<span class="na">mailgun_signing_key</span><span class="pi">:</span> <span class="s">...</span>
</code></pre>
</div>
<p>Альтернативно можно предоставить ключ Signing в переменной среды <code>MAILGUN_INGRESS_SIGNING_KEY</code>.</p><p>Сообщите Action Mailbox принимать письма от Mailgun:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="c1"># config/environments/production.rb</span>
<span class="n">config</span><span class="p">.</span><span class="nf">action_mailbox</span><span class="p">.</span><span class="nf">ingress</span> <span class="o">=</span> <span class="ss">:mailgun</span>
</code></pre>
</div>
<p><a href="https://documentation.mailgun.com/en/latest/user_manual.html#receiving-forwarding-and-storing-messages">Настройте Mailgun</a>
перенаправлять входящие письма в <code>/rails/action_mailbox/mailgun/inbound_emails/mime</code>. Если ваше приложение находится по адресу <code>https://example.com</code>, нужно указать полный URL <code>https://example.com/rails/action_mailbox/mailgun/inbound_emails/mime</code>.</p><h4 id='mandrill' class='inside_page_header'><a href="#mandrill">3.3.</a> Mandrill</h4><p>Передайте Action Mailbox ваш ключ Mandrill API, таким образом он сможет аутентифицировать запросы к ингрессу Mandrill.</p><p>Используйте <code>bin/rails credentials:edit</code> чтобы добавить ключ API в зашифрованные учетные данные вашего приложения под именем <code>action_mailbox.mandrill_api_key</code>, по которому Action Mailbox автоматически найдет его:</p><div class="code_container">
<pre><code class="highlight yaml"><span class="na">action_mailbox</span><span class="pi">:</span>
<span class="na">mandrill_api_key</span><span class="pi">:</span> <span class="s">...</span>
</code></pre>
</div>
<p>Альтернативно можно предоставить ключ API в переменной среды <code>MANDRILL_INGRESS_API_KEY</code>.</p><p>Сообщите Action Mailbox принимать письма от Mandrill:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="c1"># config/environments/production.rb</span>
<span class="n">config</span><span class="p">.</span><span class="nf">action_mailbox</span><span class="p">.</span><span class="nf">ingress</span> <span class="o">=</span> <span class="ss">:mandrill</span>
</code></pre>
</div>
<p><a href="https://mandrill.zendesk.com/hc/en-us/articles/205583197-Inbound-Email-Processing-Overview">Настройте Mandrill</a> перенаправлять входящие письма в <code>/rails/action_mailbox/mandrill/inbound_emails</code>. Если ваше приложение находится по адресу <code>https://example.com</code>, нужно указать полный URL <code>https://example.com/rails/action_mailbox/mandrill/inbound_emails</code>.</p><h4 id='postfix' class='inside_page_header'><a href="#postfix">3.4.</a> Postfix</h4><p>Сообщите Action Mailbox принимать письма от релея SMTP:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="c1"># config/environments/production.rb</span>
<span class="n">config</span><span class="p">.</span><span class="nf">action_mailbox</span><span class="p">.</span><span class="nf">ingress</span> <span class="o">=</span> <span class="ss">:relay</span>
</code></pre>
</div>
<p>Сгенерируйте сложный пароль, который Action Mailbox может использовать для аутентификации запросов к ингрессу релея.</p><p>Используйте <code>bin/rails credentials:edit</code> чтобы добавить пароль в зашифрованные учетные данные вашего приложения под именем <code>action_mailbox.ingress_password</code>, по которому Action Mailbox автоматически найдет его:</p><div class="code_container">
<pre><code class="highlight yaml"><span class="na">action_mailbox</span><span class="pi">:</span>
<span class="na">ingress_password</span><span class="pi">:</span> <span class="s">...</span>
</code></pre>
</div>
<p>Альтернативно можно предоставить пароль в переменной среды <code>RAILS_INBOUND_EMAIL_PASSWORD</code>.</p><p><a href="https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script">Настройте Postfix</a> передавать входящие письма в <code>bin/rails action_mailbox:ingress:postfix</code>, предоставив <code>URL</code> ингресса релея и <code>INGRESS_PASSWORD</code>, созданный ранее. Если ваше приложение находится по адресу <code>https://example.com</code>, полная команда будет выглядеть так:</p><div class="code_container">
<pre><code class="highlight console"><span class="gp">$</span><span class="w"> </span><span class="nb">bin/rails </span>action_mailbox:ingress:postfix <span class="nv">URL</span><span class="o">=</span>https://example.com/rails/action_mailbox/relay/inbound_emails <span class="nv">INGRESS_PASSWORD</span><span class="o">=</span>...
</code></pre>
</div>
<h4 id='postmark' class='inside_page_header'><a href="#postmark">3.5.</a> Postmark</h4><p>Сообщите Action Mailbox принимать письма от Postmark:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="c1"># config/environments/production.rb</span>
<span class="n">config</span><span class="p">.</span><span class="nf">action_mailbox</span><span class="p">.</span><span class="nf">ingress</span> <span class="o">=</span> <span class="ss">:postmark</span>
</code></pre>
</div>
<p>Сгенерируйте сложный пароль, который Action Mailbox может использовать для аутентификации запросов к ингрессу Postmark.</p><p>Используйте <code>bin/rails credentials:edit</code> чтобы добавить пароль в зашифрованные учетные данные вашего приложения под именем <code>action_mailbox.ingress_password</code>, по которому Action Mailbox автоматически найдет его:</p><div class="code_container">
<pre><code class="highlight yaml"><span class="na">action_mailbox</span><span class="pi">:</span>
<span class="na">ingress_password</span><span class="pi">:</span> <span class="s">...</span>
</code></pre>
</div>
<p>Альтернативно можно предоставить пароль в переменной среды <code>RAILS_INBOUND_EMAIL_PASSWORD</code>.</p><p><a href="https://postmarkapp.com/manual#configure-your-inbound-webhook-url">Настройте веб-хук входящих Postmark</a>, чтобы перенаправлять входящие письма в <code>/rails/action_mailbox/postmark/inbound_emails</code> с именем пользователя <code>actionmailbox</code> и созданным ранее паролем. Если ваше приложение находится по адресу <code>https://example.com</code>, нужно указать в настройках Postmark следующий полный URL:</p><div class="code_container">
<pre><code class="highlight plaintext">https://actionmailbox:[email protected]/rails/action_mailbox/postmark/inbound_emails
</code></pre>
</div>
<div class="note"><p>При настройке веб-хука входящих Postmark, убедитесь, что вы включили <strong>"Include raw email content in JSON payload"</strong>.
Action Mailbox нужно исходное содержимое email для работы.</p></div><h4 id='qmail' class='inside_page_header'><a href="#qmail">3.6.</a> Qmail</h4><p>Сообщите Action Mailbox принимать письма от релея SMTP:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="c1"># config/environments/production.rb</span>
<span class="n">config</span><span class="p">.</span><span class="nf">action_mailbox</span><span class="p">.</span><span class="nf">ingress</span> <span class="o">=</span> <span class="ss">:relay</span>
</code></pre>
</div>
<p>Сгенерируйте сложный пароль, который Action Mailbox может использовать для аутентификации запросов к ингрессу релея.</p><p>Используйте <code>bin/rails credentials:edit</code> чтобы добавить пароль в зашифрованные учетные данные вашего приложения под именем <code>action_mailbox.ingress_password</code>, по которому Action Mailbox автоматически найдет его:</p><div class="code_container">
<pre><code class="highlight yaml"><span class="na">action_mailbox</span><span class="pi">:</span>
<span class="na">ingress_password</span><span class="pi">:</span> <span class="s">...</span>
</code></pre>
</div>
<p>Альтернативно можно предоставить пароль в переменной среды <code>RAILS_INBOUND_EMAIL_PASSWORD</code>.</p><p>Настройте Qmail передавать входящие письма в <code>bin/rails action_mailbox:ingress:qmail</code>, предоставив <code>URL</code> ингресса релея и <code>INGRESS_PASSWORD</code>, созданный ранее. Если ваше приложение находится по адресу <code>https://example.com</code>, полная команда будет выглядеть так:</p><div class="code_container">
<pre><code class="highlight console"><span class="gp">$</span><span class="w"> </span><span class="nb">bin/rails </span>action_mailbox:ingress:qmail <span class="nv">URL</span><span class="o">=</span>https://example.com/rails/action_mailbox/relay/inbound_emails <span class="nv">INGRESS_PASSWORD</span><span class="o">=</span>...
</code></pre>
</div>
<h4 id='sendgrid' class='inside_page_header'><a href="#sendgrid">3.7.</a> SendGrid</h4><p>Сообщите Action Mailbox принимать письма от SendGrid:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="c1"># config/environments/production.rb</span>
<span class="n">config</span><span class="p">.</span><span class="nf">action_mailbox</span><span class="p">.</span><span class="nf">ingress</span> <span class="o">=</span> <span class="ss">:sendgrid</span>
</code></pre>
</div>
<p>Сгенерируйте сложный пароль, который Action Mailbox может использовать для аутентификации запросов к ингрессу SendGrid.</p><p>Используйте <code>bin/rails credentials:edit</code> чтобы добавить пароль в зашифрованные учетные данные вашего приложения под именем <code>action_mailbox.ingress_password</code>, по которому Action Mailbox автоматически найдет его:</p><div class="code_container">
<pre><code class="highlight yaml"><span class="na">action_mailbox</span><span class="pi">:</span>
<span class="na">ingress_password</span><span class="pi">:</span> <span class="s">...</span>
</code></pre>
</div>
<p>Альтернативно можно предоставить пароль в переменной среды <code>RAILS_INBOUND_EMAIL_PASSWORD</code>.</p><p><a href="https://sendgrid.com/docs/for-developers/parsing-email/setting-up-the-inbound-parse-webhook/">Настройте SendGrid Inbound Parse</a> передавать входящие письма в <code>/rails/action_mailbox/sendgrid/inbound_emails</code> с именем пользователя <code>actionmailbox</code> и ранее созданным паролем. Если ваше приложение находится по адресу <code>https://example.com</code>, нужно настроить SendGrid следующим URL:</p><div class="code_container">
<pre><code class="highlight plaintext">https://actionmailbox:[email protected]/rails/action_mailbox/sendgrid/inbound_emails
</code></pre>
</div>
<div class="note"><p>При настройке веб хука SendGrid Inbound Parse, убедитесь, что включили флажок с надписью <strong>“Post the raw, full MIME message.”</strong> Action Mailbox для работы требует исходное сообщение MIME.</p></div><h3 id='obrabotka-vhodyaschih-elektronnyh-pisem' class='inside_page_header'><a href="#obrabotka-vhodyaschih-elektronnyh-pisem">4.</a> Обработка входящих электронных писем</h3><p>Обработка входящих электронных писем в вашем Rails-приложении обычно включает в себя использование содержимого письма для создания моделей, обновления вью, постановки фоновых задач в очередь.</p><p>Прежде чем приступить к обработке входящих писем, необходимо настроить маршрутизацию Action Mailbox и создать почтовые ящики.</p><h4 id='nastroyka-marshrutizatsii' class='inside_page_header'><a href="#nastroyka-marshrutizatsii">4.1.</a> Настройка маршрутизации</h4><p>После того, как входящее письмо получено через настроенный ингресс, оно должно быть направлено в почтовый ящик для дальнейшей обработки вашим приложением Подобно тому, как <a href="/routing">маршрутизатор Rails</a> направляет URL-адреса к контроллерам, маршрутизация в Action Mailbox определяет, какие письма отправляются в какие почтовые ящики для обработки. Маршруты добавляются в файл <code>application_mailbox.rb</code> с использованием регулярных выражений:</p><div class="code_container">
<pre><code class="highlight ruby"><span class="c1"># app/mailboxes/application_mailbox.rb</span>
<span class="k">class</span> <span class="nc">ApplicationMailbox</span> <span class="o"><</span> <span class="no">ActionMailbox</span><span class="o">::</span><span class="no">Base</span>
<span class="n">routing</span><span class="p">(</span><span class="sr">/^save@/i</span> <span class="o">=></span> <span class="ss">:forwards</span><span class="p">)</span>
<span class="n">routing</span><span class="p">(</span><span class="sr">/@replies\./i</span> <span class="o">=></span> <span class="ss">:replies</span><span class="p">)</span>
<span class="k">end</span>
</code></pre>
</div>
<p>Регулярное выражение совпадает с полями <code>to</code> (кому), <code>cc</code> (копия) или <code>bcc</code> (скрытая копия) входящего письма. Например, приведенный выше код будет направлять любое письмо, отправленное на адрес <code>save@</code>, в почтовый ящик "forwards". Существуют и другие способы маршрутизации писем, подробности смотрите в
<a href="https://api.rubyonrails.org/classes/ActionMailbox/Base.html"><code>ActionMailbox::Base</code></a>.</p><p>Далее нам нужно создать этот почтовый ящик "forwards".</p><h4 id='sozdanie-pochtovogo-yaschika' class='inside_page_header'><a href="#sozdanie-pochtovogo-yaschika">4.2.</a> Создание почтового ящика</h4><div class="code_container">
<pre><code class="highlight console"><span class="gp">#</span><span class="w"> </span>Создайте новый почтовый ящик
<span class="gp">$</span><span class="w"> </span><span class="nb">bin/rails </span>generate mailbox forwards
</code></pre>
</div>
<p>Это создаст файл <code>app/mailboxes/forwards_mailbox.rb</code>, содержащий класс <code>ForwardsMailbox</code> и метод <code>process</code>.</p><h4 id='obrabotka-email' class='inside_page_header'><a href="#obrabotka-email">4.3.</a> Обработка Email</h4><p>При обработке <code>InboundEmail</code> вы можете получить структурированную версию письма в виде объекта <a href="https://github.com/mikel/mail"><code>Mail</code></a> с помощью метода <code>InboundEmail#mail</code>. Вы также можете получить исходный код письма напрямую с помощью метода <code>#source</code>. Объект <code>Mail</code> предоставляет доступ к различным полям письма, таким как <code>mail.to</code>, <code>mail.body.decoded</code> и т.д.</p><div class="code_container">
<pre><code class="highlight irb"><span class="gp">irb></span><span class="w"> </span><span class="n">mail</span>
<span class="p">=></span> <span class="kt">#<</span><span class="no">Mail</span><span class="o">::</span><span class="no">Message</span><span class="p">:</span><span class="mi">33780</span><span class="p">,</span> <span class="no">Multipart</span><span class="p">:</span> <span class="kp">false</span><span class="p">,</span> <span class="no">Headers</span><span class="p">:</span> <span class="o"><</span><span class="no">Date</span><span class="p">:</span> <span class="no">Wed</span><span class="p">,</span> <span class="mi">31</span> <span class="no">Jan</span> <span class="mi">2024</span> <span class="mi">22</span><span class="p">:</span><span class="mi">18</span><span class="p">:</span><span class="mi">40</span> <span class="o">-</span><span class="mo">0600</span><span class="kt">></span><span class="p">,</span> <span class="o"><</span><span class="no">From</span><span class="p">:</span> <span class="n">someone</span><span class="vi">@hey</span><span class="p">.</span><span class="nf">com</span><span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="no">To</span><span class="p">:</span> <span class="n">save</span><span class="vi">@example</span><span class="p">.</span><span class="nf">com</span><span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="no">Message</span><span class="o">-</span><span class="no">ID</span><span class="p">:</span> <span class="o"><</span><span class="mi">65</span><span class="n">bb1ba066830_50303a70397e</span><span class="vi">@Bhumis</span><span class="o">-</span><span class="no">MacBook</span><span class="o">-</span><span class="no">Pro</span><span class="p">.</span><span class="nf">local</span><span class="p">.</span><span class="nf">mail</span><span class="o">>></span><span class="p">,</span> <span class="o"><</span><span class="no">In</span><span class="o">-</span><span class="no">Reply</span><span class="o">-</span><span class="no">To</span><span class="p">:</span> <span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="no">Subject</span><span class="p">:</span> <span class="no">Hello</span> <span class="no">Action</span> <span class="no">Mailbox</span><span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="no">Mime</span><span class="o">-</span><span class="no">Version</span><span class="p">:</span> <span class="mf">1.0</span><span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="no">Content</span><span class="o">-</span><span class="no">Type</span><span class="p">:</span> <span class="n">text</span><span class="o">/</span><span class="n">plain</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="no">UTF</span><span class="o">-</span><span class="mi">8</span><span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="no">Content</span><span class="o">-</span><span class="no">Transfer</span><span class="o">-</span><span class="no">Encoding</span><span class="p">:</span> <span class="mi">7</span><span class="n">bit</span><span class="o">></span><span class="p">,</span> <span class="o"><</span><span class="n">x</span><span class="o">-</span><span class="n">original</span><span class="o">-</span><span class="ss">to: </span><span class="o">>></span>
<span class="gp">irb></span><span class="w"> </span><span class="n">mail</span><span class="p">.</span><span class="nf">to</span>
<span class="p">=></span> <span class="p">[</span><span class="s2">"[email protected]"</span><span class="p">]</span>
<span class="gp">irb></span><span class="w"> </span><span class="n">mail</span><span class="p">.</span><span class="nf">from</span>
<span class="p">=></span> <span class="p">[</span><span class="s2">"[email protected]"</span><span class="p">]</span>
<span class="gp">irb></span><span class="w"> </span><span class="n">mail</span><span class="p">.</span><span class="nf">date</span>
<span class="p">=></span> <span class="no">Wed</span><span class="p">,</span> <span class="mi">31</span> <span class="no">Jan</span> <span class="mi">2024</span> <span class="mi">22</span><span class="p">:</span><span class="mi">18</span><span class="p">:</span><span class="mi">40</span> <span class="o">-</span><span class="mo">0600</span>
<span class="gp">irb></span><span class="w"> </span><span class="n">mail</span><span class="p">.</span><span class="nf">subject</span>
<span class="p">=></span> <span class="s2">"Hello Action Mailbox"</span>
<span class="gp">irb></span><span class="w"> </span><span class="n">mail</span><span class="p">.</span><span class="nf">body</span><span class="p">.</span><span class="nf">decoded</span>
<span class="p">=></span> <span class="s2">"This is the body of the email message."</span>
<span class="c"># mail.decoded, a shorthand for mail.body.decoded, also works
</span><span class="gp">irb></span><span class="w"> </span><span class="n">mail</span><span class="p">.</span><span class="nf">decoded</span>
<span class="p">=></span> <span class="s2">"This is the body of the email message."</span>
<span class="gp">irb></span><span class="w"> </span><span class="n">mail</span><span class="p">.</span><span class="nf">body</span>
<span class="p">=></span> <span class="o"><</span><span class="no">Mail</span><span class="o">::</span><span class="no">Body</span><span class="p">:</span><span class="mh">0x00007fc74cbf46c0</span> <span class="vi">@boundary</span><span class="o">=</span><span class="kp">nil</span><span class="p">,</span> <span class="vi">@preamble</span><span class="o">=</span><span class="kp">nil</span><span class="p">,</span> <span class="vi">@epilogue</span><span class="o">=</span><span class="kp">nil</span><span class="p">,</span> <span class="vi">@charset</span><span class="o">=</span><span class="s2">"US-ASCII"</span><span class="p">,</span> <span class="vi">@part_sort_order</span><span class="o">=</span><span class="p">[</span><span class="s2">"text/plain"</span><span class="p">,</span> <span class="s2">"text/enriched"</span><span class="p">,</span> <span class="s2">"text/html"</span><span class="p">,</span> <span class="s2">"multipart/alternative"</span><span class="p">],</span> <span class="vi">@parts</span><span class="o">=</span><span class="p">[],</span> <span class="vi">@raw_source</span><span class="o">=</span><span class="s2">"This is the body of the email message."</span><span class="p">,</span> <span class="vi">@ascii_only</span><span class="o">=</span><span class="kp">true</span><span class="p">,</span> <span class="vi">@encoding</span><span class="o">=</span><span class="s2">"7bit"</span><span class="o">></span>
</code></pre>
</div>
<h4 id='status-vhodyaschego-pisma' class='inside_page_header'><a href="#status-vhodyaschego-pisma">4.4.</a> Статус входящего письма</h4><p>Во время маршрутизации к соответствующему почтовому ящику и обработки Action Mailbox обновляет статус письма, хранящийся в таблице <code>action_mailbox_inbound_emails</code>, одним из следующих значений:</p><ul><li><code>pending</code>: письмо получено одним из контроллеров ингресса и запланировано к маршрутизации.
</li><li><code>processing</code>: письмо активно обрабатывается определенным почтовым ящиком, выполняющим его метод <code>process</code>.
</li><li><code>delivered</code>: письмо успешно обработано конкретным почтовым ящиком.
</li><li><code>failed</code>: во время выполнения метода <code>process</code> конкретного почтового ящика возникла ошибка.
</li><li><code>bounced</code>: письмо отклонено конкретным почтовым ящиком и возвращено отправителю.
</li></ul><p>Если письмо помечено как <code>delivered</code>, <code>failed</code> или <code>bounced</code>, оно считается "обработанным" и помечается на <a href="#incineration-of-inboundemails">уничтожение</a>.</p><h3 id='primer' class='inside_page_header'><a href="#primer">5.</a> Пример</h3><p>Ниже приведен пример Action Mailbox, который обрабатывает электронные письма для создания "переадресаций" для проектов пользователя.</p><p>Колбэк <code>before_processing</code> используется для обеспечения выполнения определенных условий перед вызовом метода <code>process</code>. В данном случае <code>before_processing</code> проверяет наличие у пользователя хотя бы одного проекта. Другие поддерживаемые <a href="https://api.rubyonrails.org/classes/ActionMailbox/Callbacks.html">колбэки Action Mailbox</a> - <code>after_processing</code> и <code>around_processing</code>.</p><p>Письмо может быть возвращено отправителю с помощью <code>bounced_with</code>, если у "переадресанта" нет проектов. "Переадресант" - это <code>User</code> с тем же адресом электронной почты, что и <code>mail.from</code>.</p><p>Если у "переадресанта" есть хотя бы один проект, метод <code>record_forward</code> создает модель Active Record в приложении, используя данные письма <code>mail.subject</code> и <code>mail.decoded</code>. В противном случае он отправляет электронное письмо с помощью Action Mailer, с просьбой к "переадресанту" выбрать проект.</p><div class="code_container">
<pre><code class="highlight ruby"><span class="c1"># app/mailboxes/forwards_mailbox.rb</span>
<span class="k">class</span> <span class="nc">ForwardsMailbox</span> <span class="o"><</span> <span class="no">ApplicationMailbox</span>
<span class="c1"># Колбэки, указывающие предусловия обработки</span>
<span class="n">before_processing</span> <span class="ss">:require_projects</span>
<span class="k">def</span> <span class="nf">process</span>
<span class="c1"># Запишите перенаправление на единственный проект, или…</span>
<span class="k">if</span> <span class="n">forwarder</span><span class="p">.</span><span class="nf">projects</span><span class="p">.</span><span class="nf">one?</span>
<span class="n">record_forward</span>
<span class="k">else</span>
<span class="c1"># …вовлеките второй Action Mailer, чтобы спросить, в какой проект это нужно направить.</span>
<span class="n">request_forwarding_project</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="kp">private</span>
<span class="k">def</span> <span class="nf">require_projects</span>
<span class="k">if</span> <span class="n">forwarder</span><span class="p">.</span><span class="nf">projects</span><span class="p">.</span><span class="nf">none?</span>
<span class="c1"># Используйте Action Mailers для возврата входящих писем отправителю – это прервет обработку</span>
<span class="n">bounce_with</span> <span class="no">Forwards</span><span class="o">::</span><span class="no">BounceMailer</span><span class="p">.</span><span class="nf">no_projects</span><span class="p">(</span><span class="n">inbound_email</span><span class="p">,</span> <span class="ss">forwarder: </span><span class="n">forwarder</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">record_forward</span>
<span class="n">forwarder</span><span class="p">.</span><span class="nf">forwards</span><span class="p">.</span><span class="nf">create</span> <span class="ss">subject: </span><span class="n">mail</span><span class="p">.</span><span class="nf">subject</span><span class="p">,</span> <span class="ss">content: </span><span class="n">mail</span><span class="p">.</span><span class="nf">decoded</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">request_forwarding_project</span>
<span class="no">Forwards</span><span class="o">::</span><span class="no">RoutingMailer</span><span class="p">.</span><span class="nf">choose_project</span><span class="p">(</span><span class="n">inbound_email</span><span class="p">,</span> <span class="ss">forwarder: </span><span class="n">forwarder</span><span class="p">).</span><span class="nf">deliver_now</span>
<span class="k">end</span>
<span class="k">def</span> <span class="nf">forwarder</span>
<span class="vi">@forwarder</span> <span class="o">||=</span> <span class="no">User</span><span class="p">.</span><span class="nf">find_by</span><span class="p">(</span><span class="ss">email_address: </span><span class="n">mail</span><span class="p">.</span><span class="nf">from</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
</div>
<h3 id='local-development-and-testing' class='inside_page_header'><a href="#local-development-and-testing">6.</a> Локальная разработка и тестирование</h3><p>Полезно иметь возможность тестирования входящих писем при разработке без фактического отправления и получения реальных писем. Для этого есть вспомогательный контроллер, смонтированный на <code>/rails/conductor/action_mailbox/inbound_emails</code>, дающий перечень всех InboundEmail в системе, состояние их обработки, а также форму для создания нового InboundEmail.</p><p>Вот пример тестирования входящего письма с помощью Action Mailbox TestHelpers.</p><div class="code_container">
<pre><code class="highlight ruby"><span class="k">class</span> <span class="nc">ForwardsMailboxTest</span> <span class="o"><</span> <span class="no">ActionMailbox</span><span class="o">::</span><span class="no">TestCase</span>
<span class="nb">test</span> <span class="s2">"directly recording a client forward for a forwarder and forwardee corresponding to one project"</span> <span class="k">do</span>
<span class="n">assert_difference</span> <span class="o">-></span> <span class="p">{</span> <span class="n">people</span><span class="p">(</span><span class="ss">:david</span><span class="p">).</span><span class="nf">buckets</span><span class="p">.</span><span class="nf">first</span><span class="p">.</span><span class="nf">recordings</span><span class="p">.</span><span class="nf">count</span> <span class="p">}</span> <span class="k">do</span>
<span class="n">receive_inbound_email_from_mail</span> <span class="p">\</span>
<span class="ss">to: </span><span class="s1">'[email protected]'</span><span class="p">,</span>
<span class="ss">from: </span><span class="n">people</span><span class="p">(</span><span class="ss">:david</span><span class="p">).</span><span class="nf">email_address</span><span class="p">,</span>
<span class="ss">subject: </span><span class="s2">"Fwd: Status update?"</span><span class="p">,</span>
<span class="ss">body: </span><span class="o"><<~</span><span class="no">BODY</span><span class="sh">
--- Begin forwarded message ---
From: Frank Holland <[email protected]>
What's the status?
</span><span class="no"> BODY</span>
<span class="k">end</span>
<span class="n">recording</span> <span class="o">=</span> <span class="n">people</span><span class="p">(</span><span class="ss">:david</span><span class="p">).</span><span class="nf">buckets</span><span class="p">.</span><span class="nf">first</span><span class="p">.</span><span class="nf">recordings</span><span class="p">.</span><span class="nf">last</span>
<span class="n">assert_equal</span> <span class="n">people</span><span class="p">(</span><span class="ss">:david</span><span class="p">),</span> <span class="n">recording</span><span class="p">.</span><span class="nf">creator</span>
<span class="n">assert_equal</span> <span class="s2">"Status update?"</span><span class="p">,</span> <span class="n">recording</span><span class="p">.</span><span class="nf">forward</span><span class="p">.</span><span class="nf">subject</span>
<span class="n">assert_match</span> <span class="s2">"What's the status?"</span><span class="p">,</span> <span class="n">recording</span><span class="p">.</span><span class="nf">forward</span><span class="p">.</span><span class="nf">content</span><span class="p">.</span><span class="nf">to_s</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
</div>
<p>За остальными тестовыми вспомогательными методами обратитесь к <a href="https://api.rubyonrails.org/classes/ActionMailbox/TestHelper.html">ActionMailbox::TestHelper API</a>.</p><h3 id='incineration-of-inboundemails' class='inside_page_header'><a href="#incineration-of-inboundemails">7.</a> Уничтожение InboundEmails</h3><p>По умолчанию <code>InboundEmail</code>, которое было обработано, будет уничтожено через 30 дней. <code>InboundEmail</code> рассматривается обработанным, когда его статус изменяется на <code>delivered</code>, <code>failed</code> или <code>bounced</code>.</p><p>Фактическое уничтожение выполняется с помощью <a href="https://api.rubyonrails.org/classes/ActionMailbox/IncinerationJob.html"><code>IncinerationJob</code></a>, которая запланирована на запуск через <a href="/configuring#config-action-mailbox-incinerate-after"><code>config.action_mailbox.incinerate_after</code></a>. Это значение по умолчанию установлено <code>30.days</code>, но его можно изменить в настройках production.rb. (Отметьте, что это планируемое будущее уничтожение полагается на возможность вашей очереди задач хранить задачи на такой промежуток времени.)</p><p>Уничтожение данных по умолчанию гарантирует, что вы не будете хранить данные пользователей без необходимости, после того, как они отменили свои учетные записи или удалили свой контент.</p><p>Предполагается, что при обработке входящего письма с помощью Action Mailbox вы извлекаете из него все необходимые данные и сохраняете их в моделях предметной области вашего приложения. Запись <code>InboundEmail</code> остается в системе в течение настроенного времени для целей отладки и криминалистики, а затем удаляется.</p>
<div class="banner">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- bottom rusrails -->
<ins class="adsbygoogle"
style="display:inline-block;width:580px;height:400px"
data-ad-client="ca-pub-7764391801669990"
data-ad-slot="7566253867"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</div>
</div>
<div class="row-fluid">
<div class="span12" id="footer">
<p>
<a target="blank" href="https://github.com/rusrails/rusrails"><img src="/assets/github-7cc23602a5ac2465f14c19492358a5a67dc24636761cc723e4d621cea0c09225.png" /></a>
</p>
<p>
<a href="https://creativecommons.org/licenses/by-sa/4.0/">Лицензия CC BY-SA 4.0</a>
"Rails", "Ruby on Rails" и логотип Rails - торговые марки DHH
<!-- Yandex.Metrika counter -->
<script>
(function (d, w, c) {
(w[c] = w[c] || []).push(function() {
try {
w.yaCounter1006929 = new Ya.Metrika({id:1006929,
webvisor:true,
clickmap:true,
trackLinks:true,
accurateTrackBounce:true});
} catch(e) { }
});
var n = d.getElementsByTagName("script")[0],
s = d.createElement("script"),
f = function () { n.parentNode.insertBefore(s, n); };
s.type = "text/javascript";
s.async = true;
s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js";
if (w.opera == "[object Opera]") {
d.addEventListener("DOMContentLoaded", f, false);
} else { f(); }
})(document, window, "yandex_metrika_callbacks");
</script>
<noscript>
<div>
<img style="position:absolute; left:-9999px;" alt="" src="//mc.yandex.ru/watch/1006929" />
</div>
</noscript>
<!-- /Yandex.Metrika counter -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-64955373-1', 'auto');
ga('send', 'pageview');
var trackOutboundLink = function(url) {
ga('send', 'event', 'outbound', 'click', url, {
'transport': 'beacon',
'hitCallback': function(){ }
});
}
</script>
</p>
</div>
</div>
</div>
</div>
<div class="to_top" style="display: block">
<div class="to_top_panel"></div>
</div>
<script src="/assets/application-48ac5c5be8858f5558a99606c2d341f9fee482f22db6deee5def03837c505584.js"></script>
</body>
</html>