can post replies (pipe email with 'monboob post')
This commit is contained in:
parent
db32ee67f9
commit
14518d060f
1 changed files with 56 additions and 7 deletions
|
|
@ -24,14 +24,16 @@ from email.mime.text import MIMEText
|
||||||
from smtplib import SMTP
|
from smtplib import SMTP
|
||||||
from email.Header import Header
|
from email.Header import Header
|
||||||
from email.Utils import parseaddr, formataddr
|
from email.Utils import parseaddr, formataddr
|
||||||
|
from email import message_from_file
|
||||||
import time
|
import time
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
from html2text import html2text
|
from html2text import html2text
|
||||||
|
|
||||||
from weboob.capabilities.messages import ICapMessages
|
from weboob.capabilities.messages import ICapMessages
|
||||||
from weboob.tools.application import BaseApplication
|
from weboob.tools.application import ConsoleApplication
|
||||||
|
|
||||||
class Monboob(BaseApplication):
|
class Monboob(ConsoleApplication):
|
||||||
APPNAME = 'monboob'
|
APPNAME = 'monboob'
|
||||||
CONFIG = {'interval': 15,
|
CONFIG = {'interval': 15,
|
||||||
'domain': 'weboob.example.org',
|
'domain': 'weboob.example.org',
|
||||||
|
|
@ -41,13 +43,60 @@ class Monboob(BaseApplication):
|
||||||
|
|
||||||
def main(self, argv):
|
def main(self, argv):
|
||||||
self.load_config()
|
self.load_config()
|
||||||
if not self.config:
|
|
||||||
print >>sys.stderr, "Error: %s is not configured yet. Please call 'monboob -c'" % argv[0]
|
|
||||||
print >>sys.stderr, "Also, you need to use 'weboobcfg' to set backend configs"
|
|
||||||
return -1
|
|
||||||
|
|
||||||
self.weboob.load_backends(ICapMessages, storage=self.create_storage())
|
self.weboob.load_backends(ICapMessages, storage=self.create_storage())
|
||||||
|
|
||||||
|
return self.process_command(*argv[1:])
|
||||||
|
|
||||||
|
@ConsoleApplication.command("pipe with a mail to post message")
|
||||||
|
def command_post(self):
|
||||||
|
msg = message_from_file(sys.stdin)
|
||||||
|
reply_to = msg.get('In-Reply-To')
|
||||||
|
if not reply_to:
|
||||||
|
print >>sys.stderr, 'This is not a reply (no Reply-To field)'
|
||||||
|
return 1
|
||||||
|
|
||||||
|
m = re.match('<(.*)@(.*)>', reply_to)
|
||||||
|
if m:
|
||||||
|
reply_to = m.group(1)
|
||||||
|
title = msg.get('Subject')
|
||||||
|
|
||||||
|
content = u''
|
||||||
|
for part in msg.walk():
|
||||||
|
if part.get_content_type() == 'text/plain':
|
||||||
|
s = part.get_payload(decode=True)
|
||||||
|
charsets = part.get_charsets() + msg.get_charsets()
|
||||||
|
for charset in charsets:
|
||||||
|
try:
|
||||||
|
content += unicode(s, charset)
|
||||||
|
except:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
|
||||||
|
# remove signature
|
||||||
|
content = content.split(u'\n-- \n')[0]
|
||||||
|
|
||||||
|
bname, id = reply_to.split('.', 1)
|
||||||
|
backend = self.weboob.backends[bname]
|
||||||
|
|
||||||
|
thread_id, msg_id = id.rsplit('.', 1)
|
||||||
|
backend.post_reply(thread_id, msg_id, title, content)
|
||||||
|
|
||||||
|
MAIL_REGEXP = re.compile('(.*) <(.*)@(.*)>')
|
||||||
|
def get_mail(self, text):
|
||||||
|
if not text:
|
||||||
|
return None
|
||||||
|
|
||||||
|
m = self.MAIL_REGEXP.match(text)
|
||||||
|
if not m:
|
||||||
|
to = text.split('@')[0]
|
||||||
|
else:
|
||||||
|
to = m.group(2)
|
||||||
|
|
||||||
|
return to
|
||||||
|
|
||||||
|
@ConsoleApplication.command("run daemon")
|
||||||
|
def command_run(self):
|
||||||
self.weboob.repeat(self.config.get('interval'), self.process)
|
self.weboob.repeat(self.config.get('interval'), self.process)
|
||||||
self.weboob.loop()
|
self.weboob.loop()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue