Пересылка электронной почты как Craigslist - Rails - PullRequest
8 голосов
/ 21 мая 2011

Я пытаюсь сделать то, что делает анонимная электронная почта craigslist, но с Rails, также по дешевке.Для меня важно иметь возможность добавить заголовок к электронному письму, поэтому базовая пересылка электронной почты не работает.

Одним из способов, которым я думал, был SMTP-сервер всякий раз, когда я читал почту через POP /IMAP, я затем отправляю электронное письмо истинному получателю электронной почты с правильным адресом FROM и добавляю в заголовок.Это работает, но SMTP-сервер относительно дорог.

Другой способ - переадресация / перенаправление электронной почты, но добавление заголовка между ними.Хотя я не могу найти никаких сервисов или драгоценных камней для этого.

Пожалуйста, не говорите просто «Email Piping», потому что все, что действительно означает, - это подача электронной почты в вашу программу Rails, что вы делаете после того, как выесть электронная почта?Как вы на самом деле продвигаете это.

Есть идеи?

Ответы [ 2 ]

12 голосов
/ 21 мая 2011

Вам понадобится адрес электронной почты, используя домен с MX-сервером, который контролирует ваш системный администратор. Это может быть поддомен вашего основного домена. Затем вы настраиваете программное обеспечение MTA (Exim, Postfix ... надеюсь, не qMail!) Для передачи этой электронной почты в Rails:

http://guides.rubyonrails.org/action_mailer_basics.html#receiving-emails

Если адаптер MTA не установлен на том же сервере, что и само приложение rails, вам придется направить электронное письмо на небольшой специальный сценарий пересылки, который выполняет что-то вроде отправки почты в ваше приложение, где Затем вы вручную передаете это своей почтовой программе.

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

Мы еще не сделали этого, но собираемся сделать это по тем же причинам. Это может быть немного над вашей головой, если вы не знакомы с настройкой MTA, однако. У вас есть системный администратор, которому вы можете выполнить это задание?

На уровне кода я бы делал это:

  1. Пользователь A (id = 1234) отправляет электронное письмо пользователю B (id = 5678)
  2. Отправьте электронное письмо с любого адреса, который вам нужен, но установите для Reply-To: что-то вроде Reply-To: <mail-1234-5678-abcdefabcd1234567890abcdefabcdef@usermessages.your-domain.com>

    Это абсолютно ключ к этой работе. Он включает в себя идентификатор отправителя, идентификатор получателя и контрольную сумму для предотвращения подделки. Контрольная сумма может быть сгенерирована из соли, уникальной для каждого пользователя, и просто:

    checksum = Digest::MD5.hexdigest("#{sender.id}-#{recipient.id}-#{sender.mailer_salt}")

  3. Теперь, когда вы получаете ответ через MX, который вы настроили для своего домена «usermessages.your-domain.com», первое, что вы делаете, это идентифицируете отправителя и получателя, проанализировав поле To: , Вы можете легко определить, кто является отправителем и получателем, split. Затем вы можете сгенерировать контрольную сумму и убедиться, что она совпадает, чтобы гарантировать, что кто-то не пытается злонамеренно отправить почту, как если бы она была от другого пользователя.

  4. После того, как вы выяснили вовлеченных пользователей, продолжайте и отправьте еще одно электронное письмо с одним из этих специальных Reply-To: заголовков (с перевернутым идентификатором и дайджестом, очевидно, с использованием другой соли).

Это очень элементарный, но совершенно функциональный пример. Вы можете поместить этот дайджест куда угодно, при условии, что он будет сохранен при возвращении ответа (что делает заголовок Reply-To: подходящим. Некоторые службы используют вместо него строку темы.

Я бы не стал делать солью нечто контролируемое пользователем, такое как хэш пароля пользователя, поскольку, если пользователь изменяет эту информацию (изменяет свой пароль), контрольная сумма больше не будет проверяться.

4 голосов
/ 21 мая 2011

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

Основная предпосылка заключается в том, что вы хотите получать почту на перехвате всего домена.Вы можете пересылать / собирать с помощью imap / pop3 с сервера, такого как gmail, или использовать сервис, такой как CloudMailin, для доставки сообщения в ваше приложение.Вы можете дать каждому пользователю уникальный адрес или даже просто использовать одноразовую часть сообщения, например normal+disposable@domain.com.

Тогда это просто случай использования mail gem чтобы просмотреть сообщение, добавить все необходимые заголовки и снова отправить сообщение.Опять же, вы можете использовать свой собственный почтовый сервер для выполнения этой доставки или воспользоваться услугами, такими как Amazon Simple Mail Service, если хотите улучшить свою доставку.

...