~openerp-groupes/openobject-server/6.0-fix-setup-windows

« back to all changes in this revision

Viewing changes to bin/tools/import_email.py

  • Committer: pinky
  • Date: 2006-12-07 13:41:40 UTC
  • Revision ID: pinky-3f10ee12cea3c4c75cef44ab04ad33ef47432907
New trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- encoding: utf-8 -*-
 
2
import os, sys
 
3
import re
 
4
import smtplib
 
5
import email, mimetypes
 
6
from email.Header import decode_header
 
7
from email.MIMEText import MIMEText
 
8
import xmlrpclib
 
9
 
 
10
warn_msg = """
 
11
Bonjour,
 
12
 
 
13
Le message avec le sujet "%s" n'a pu être archivé dans l'ERP.
 
14
 
 
15
""".decode('utf-8')
 
16
 
 
17
class EmailParser(object):
 
18
 
 
19
        def __init__(self, headers, dispatcher):
 
20
                self.headers = headers
 
21
                self.dispatcher = dispatcher
 
22
        
 
23
        def parse(self, msg):
 
24
                dispatcher((self.headers, msg))
 
25
 
 
26
class CommandDispatcher(object):
 
27
 
 
28
        def __init__(self, receiver):
 
29
                self.receiver = receiver
 
30
        
 
31
        def __call__(self, request):
 
32
                return self.receiver(request)
 
33
 
 
34
class RPCProxy(object):
 
35
 
 
36
        def __init__(self, uid, passwd, host='localhost', port=8069, path='object'):
 
37
                self.rpc = xmlrpclib.ServerProxy('http://%s:%s/%s' % (host, port, path))
 
38
                self.user_id = uid
 
39
                self.passwd = passwd
 
40
        
 
41
        def __call__(self, request):
 
42
                return self.rpc.execute(self.user_id, self.passwd, *request)
 
43
 
 
44
class ReceiverEmail2Event(object):
 
45
 
 
46
        email_re = re.compile(r"""
 
47
                ([a-zA-Z][\w\.-]*[a-zA-Z0-9]     # username part
 
48
                @                                # mandatory @ sign
 
49
                [a-zA-Z0-9][\w\.-]*              # domain must start with a letter
 
50
                 \.
 
51
                 [a-z]{2,3}                      # TLD
 
52
                )
 
53
                """, re.VERBOSE)
 
54
 
 
55
        project_re = re.compile(r"^ *\[?(\d{4}\.?\d{0,3})\]?", re.UNICODE)
 
56
 
 
57
 
 
58
        def __init__(self, rpc):
 
59
                self.rpc = rpc
 
60
        
 
61
        def get_addresses(self, headers, msg):
 
62
                hcontent = ''
 
63
                for header in [h for h in headers if msg.has_key(h)]:
 
64
                        hcontent += msg[header]
 
65
                return self.email_re.findall(hcontent)
 
66
 
 
67
        def get_partners(self, headers, msg):
 
68
                alladdresses = self.get_addresses(headers, msg)
 
69
                address_ids = self.rpc(('res.partner.address', 'search', [('email', 'in', alladdresses)]))
 
70
                addresses = self.rpc(('res.partner.address', 'read', address_ids))
 
71
                return [x['partner_id'][0] for x in addresses]
 
72
 
 
73
        def __call__(self, request):
 
74
                headers, msg = request
 
75
                partners = self.get_partners(headers, msg)
 
76
                subject = u''
 
77
                for string, charset in decode_header(msg['Subject']):
 
78
                        if charset:
 
79
                                subject += string.decode(charset)
 
80
                        else:
 
81
                                subject += unicode(string)
 
82
                if partners:
 
83
                        self.save_mail(msg, subject, partners)
 
84
                else:
 
85
                        warning = MIMEText((warn_msg % (subject,)).encode('utf-8'), 'plain', 'utf-8')
 
86
                        warning['Subject'] = 'Message de TinyERP'
 
87
                        warning['From'] = 'erp@steel-sa.com'
 
88
                        warning['To'] = msg['From']
 
89
                        s = smtplib.SMTP()
 
90
                        s.connect()
 
91
                        s.sendmail('erp@steel-sa.com', self.email_re.findall(msg['From']), warning.as_string())
 
92
                        s.close()
 
93
 
 
94
                if msg.is_multipart():
 
95
                        for message in [m for m in msg.get_payload() if m.get_content_type() == 'message/rfc822']:
 
96
                                self((headers, message.get_payload()[0]))
 
97
        
 
98
        def save_mail(self, msg, subject, partners):
 
99
                counter, description = 1, u''
 
100
                if msg.is_multipart():
 
101
                        for part in msg.get_payload():
 
102
                                stockdir = os.path.join('emails', msg['Message-Id'][1:-1])
 
103
                                newdir = os.path.join('/tmp', stockdir)
 
104
                                filename = part.get_filename()
 
105
                                if not filename:
 
106
                                        ext = mimetypes.guess_extension(part.get_type())
 
107
                                        if not ext:
 
108
                                                ext = '.bin'
 
109
                                        filename = 'part-%03d%s' % (counter, ext)
 
110
 
 
111
                                if part.get_content_maintype() == 'multipart':
 
112
                                        continue
 
113
                                elif part.get_content_maintype() == 'text':
 
114
                                        if part.get_content_subtype() == 'plain':
 
115
                                                description += part.get_payload(decode=1).decode(part.get_charsets()[0])
 
116
                                                description += u'\n\nVous trouverez les éventuels fichiers dans le répertoire: %s' % stockdir
 
117
                                                continue
 
118
                                        else:
 
119
                                                description += u'\n\nCe message est en "%s", vous trouverez ce texte dans le répertoire: %s' % (part.get_content_type(), stockdir)
 
120
                                elif part.get_content_type() == 'message/rfc822':
 
121
                                        continue
 
122
                                if not os.path.isdir(newdir):
 
123
                                        os.mkdir(newdir)
 
124
 
 
125
                                counter += 1
 
126
                                fd = file(os.path.join(newdir, filename), 'w')
 
127
                                fd.write(part.get_payload(decode=1))
 
128
                                fd.close()
 
129
                else:
 
130
                        description = msg.get_payload(decode=1).decode(msg.get_charsets()[0])
 
131
 
 
132
                project = self.project_re.search(subject)
 
133
                if project:
 
134
                        project = project.groups()[0]
 
135
                else:
 
136
                        project = ''
 
137
 
 
138
                for partner in partners:
 
139
                        self.rpc(('res.partner.event', 'create', {'name' : subject, 'partner_id' : partner, 'description' : description, 'project' : project}))
 
140
 
 
141
 
 
142
if __name__ == '__main__':
 
143
        rpc_dispatcher = CommandDispatcher(RPCProxy(4, 'admin'))
 
144
        dispatcher = CommandDispatcher(ReceiverEmail2Event(rpc_dispatcher))
 
145
        parser = EmailParser(['To', 'Cc', 'From'], dispatcher)
 
146
        parser.parse(email.message_from_file(sys.stdin))