2010-11-01 75 views
3

有人可以告訴我他們是如何以某種形式做到這一點的,無論是XML-RPC,SOAP,定製等。不要太擔心數據包格式。通過電子郵件使用RPC?

我有興趣做一些RPC over email,設置一個程序來通過電子郵件從另一個應用程序或甚至訂閱列表中的用戶接收命令。基本上這個想法是,你給某人的電子郵件地址,然後發送消息到活動的命令,並回覆電子郵件。一個很好的例子,我會採取這種做法可能是一個國際象棋程序,其中時間是無關緊要的,但交付是一切,順序排列的動作是給定的。

我會對其他人的經驗最感興趣,尤其是電子郵件的性質和任何我應該注意的特殊行爲。

我有很多關於消息隊列和異步傳遞的RPC的經驗,但想要提出一個解決方案,我將通信轉移到hotmail或gmail,釋放我的服務器和異步的頭痛對講機。

+1

+1考慮替代HTTP。我真的有興趣看看它是否可以通過Gopher協議完成。:-) – amphetamachine 2010-11-01 03:43:44

+0

@apheta crickey這是從過去的爆炸,加上1​​甚至記住gopher,並在談話中提出:) – WeNeedAnswers 2010-11-01 10:43:19

+0

我會嚴格使用電子郵件系統的消息傳遞,它將是無狀態的操作。我正在考慮通過電子郵件的SOAP的線,會說一個電子郵件協議,但我想到的是谷歌郵箱或Hotmail的。我想這些操作通過HTTP。對@amphet抱歉。 – WeNeedAnswers 2010-11-01 10:46:30

回答

2

你可以使用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秒是好的,因爲你的程序可能超快,並可能與其他程序(fe郵件服務器守護程序說有人在度假)產生無限循環,通常情況下,至少將他們的循環狂潮限制爲1封電子郵件/秒是件好事。我很難學會它:)如果您想要處理超過1封電子郵件/秒,睡覺會很糟糕。如果是這樣,請將sleep 1切換爲true

+0

需要跨OS。 – WeNeedAnswers 2010-11-06 11:33:01

+0

你可以說在這個問題;)我只使用Linux,所以它對我很好 – 2010-11-06 19:27:38

+0

我喜歡fetchmail選項,循環是如何工作的,你能舉一個例子,循環是否昂貴,想知道更多,如果使用bash腳本,我將如何睡眠任務? – WeNeedAnswers 2010-11-06 22:47:24

2

我已經在使用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) 

您只需發送電子郵件至[email protected]即可。瞧!

+0

很酷。我喜歡。需要通過谷歌服務嗎?,而不是看看年齡的appengine,但我喜歡這種方法+1 – WeNeedAnswers 2010-11-06 11:29:29