Используя RPC по электронной почте? - PullRequest
3 голосов
/ 01 ноября 2010

Может кто-нибудь сказать мне, как они сделали это в какой-то форме, будь то XML-RPC, SOAP, сделанный на заказ и т. Д. Не слишком беспокоюсь о формате пакета.по электронной почте, настройку программы для получения команд по электронной почте от другого приложения или даже от пользователей в списке подписки.По сути, идея заключается в том, что вы даете кому-то адрес электронной почты, а затем отправляете сообщения активным командам, и ответ возвращается по электронной почте.Хороший пример того, где я мог бы взять это, может быть, шахматная программа, где время не имеет значения, но доставка - это все, и последовательное упорядочение ходов - это данность.особенно с характером электронной почты и любым специфическим поведением, о котором я должен знать.

У меня довольно большой опыт RPC над очередями сообщений и асинхронной доставкой, но я хотел бы найти решение, в котором япереключить связь на hotmail или gmail, освобождая мои серверы и головную боль асинхронных домофонов.

Ответы [ 2 ]

2 голосов
/ 06 ноября 2010

Я уже делаю это с Google AppEngine и Python. Это действительно просто.

В вашем app.yaml файле вам нужно настроить, что вы будете использовать службу электронной почты, и вы подаете файл для управления ими:

application: appname
version: 1
runtime: python
api_version: 1

handlers:
- url: /_ah/mail/.+
  script: mail.py
  login: admin

inbound_services:
- mail

Затем создайте файл mail.py с чем-то вроде этого:

#!/usr/bin/env python

import rfc822
import logging

from google.appengine.ext import db
from google.appengine.ext import webapp 
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler 
from google.appengine.ext.webapp.util import run_wsgi_app

class LogSenderHandler(InboundMailHandler):
    def receive(self, message):
        service_name, service_email = rfc822.parseaddr(message.to)
        service_request = service_email.split('@').pop(0)
        sender_name, sender_email = rfc822.parseaddr(message.sender)

        logging.info('Service `%s` activated by `%s`.' % (service_request, sender_email))

if __name__ == '__main__':
    application = webapp.WSGIApplication(
        [LogSenderHandler.mapping()])
    run_wsgi_app(application)

Все, что вам нужно сделать, это отправить электронное письмо на servicename@appname.appspotmail.com. Voila!

2 голосов
/ 05 ноября 2010

Вы можете использовать fetchmail следующим образом:

#!/bin/bash
while sleep 1
do
    fetchmail --idle --mda python program_that_accepts_email_with_headers_on_stdin.py
done

Тогда Ваша программа может выполнять различные действия: от запросов к базе данных, с помощью некоторых служб http, до отправкиписьмо кому-то.Как это работает, сначала он спит секунду, а затем проверяет почтовый ящик в соответствии с настройками, которые необходимо поместить в ~ / .fetchmailrc (для получения информации о том, как это сделать, прочитайте man fetchmail).Если он находит какое-либо электронное письмо, он вызывает вашу программу, если нет, и цикл возвращается к начальной точке.Если он не находит никаких писем, он ждет до тех пор, пока письмо не придет (или почтовый сервер не перезагрузится).

Суть в том, что если указанная система не загружена, он будет почти мгновенно реагировать на электронные письма (обычно вы отправляете электронное письмо с командой, ждете 3 секунды и у вас есть ответ в папке «Входящие»).

ПРИМЕЧАНИЕ: остановка (--idle)работает только с серверами IMAP.С поп-серверами вы можете сделать то же самое, но спать 10 секунд вместо 1. Спать в течение 1 секунды хорошо, потому что ваша программа может быть сверхбыстрой и может создать бесконечный цикл с другой программой (например, демон mailer, говорящий, что кто-то в отпуске) иобычно было бы хорошо, по крайней мере, ограничить их безумие зацикливания до 1 электронной почты в секунду.Я научился этому нелегко :) Спать будет плохо, если вы захотите обрабатывать более 1 письма в секунду.Если это так, переключите sleep 1 на true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...