xref: /trunk/main/scripting/source/pyprov/mailmerge.py (revision d3d1f4e0bc386b3bcc45e56bbff80fd5331a20b3)
1cdf0e10cSrcweir# Caolan McNamara caolanm@redhat.com
2cdf0e10cSrcweir# a simple email mailmerge component
3cdf0e10cSrcweir
4cdf0e10cSrcweir# manual installation for hackers, not necessary for users
5cdf0e10cSrcweir# cp mailmerge.py /usr/lib/openoffice.org2.0/program
6cdf0e10cSrcweir# cd /usr/lib/openoffice.org2.0/program
7cdf0e10cSrcweir# ./unopkg add --shared mailmerge.py
8cdf0e10cSrcweir# edit ~/.openoffice.org2/user/registry/data/org/openoffice/Office/Writer.xcu
9cdf0e10cSrcweir# and change EMailSupported to as follows...
10cdf0e10cSrcweir#  <prop oor:name="EMailSupported" oor:type="xs:boolean">
11cdf0e10cSrcweir#   <value>true</value>
12cdf0e10cSrcweir#  </prop>
13cdf0e10cSrcweir
14cdf0e10cSrcweirimport unohelper
15cdf0e10cSrcweirimport uno
16cdf0e10cSrcweirimport re
17cdf0e10cSrcweir
18cdf0e10cSrcweir#to implement com::sun::star::mail::XMailServiceProvider
19cdf0e10cSrcweir#and
20cdf0e10cSrcweir#to implement com.sun.star.mail.XMailMessage
21cdf0e10cSrcweir
22cdf0e10cSrcweirfrom com.sun.star.mail import XMailServiceProvider
23cdf0e10cSrcweirfrom com.sun.star.mail import XMailService
24cdf0e10cSrcweirfrom com.sun.star.mail import XSmtpService
25cdf0e10cSrcweirfrom com.sun.star.mail import XConnectionListener
26cdf0e10cSrcweirfrom com.sun.star.mail import XAuthenticator
27cdf0e10cSrcweirfrom com.sun.star.mail import XMailMessage
28cdf0e10cSrcweirfrom com.sun.star.mail.MailServiceType import SMTP
29cdf0e10cSrcweirfrom com.sun.star.mail.MailServiceType import POP3
30cdf0e10cSrcweirfrom com.sun.star.mail.MailServiceType import IMAP
31cdf0e10cSrcweirfrom com.sun.star.uno import XCurrentContext
32cdf0e10cSrcweirfrom com.sun.star.lang import IllegalArgumentException
33cdf0e10cSrcweirfrom com.sun.star.lang import EventObject
34cdf0e10cSrcweirfrom com.sun.star.mail import SendMailMessageFailedException
35cdf0e10cSrcweir
36cdf0e10cSrcweirfrom email.MIMEBase import MIMEBase
37cdf0e10cSrcweirfrom email.Message import Message
38cdf0e10cSrcweirfrom email import Encoders
39cdf0e10cSrcweirfrom email.Header import Header
40cdf0e10cSrcweirfrom email.MIMEMultipart import MIMEMultipart
41cdf0e10cSrcweirfrom email.Utils import formatdate
42cdf0e10cSrcweirfrom email.Utils import parseaddr
43*d3d1f4e0SAriel Constenla-Hailefrom socket import _GLOBAL_DEFAULT_TIMEOUT
44cdf0e10cSrcweir
45cdf0e10cSrcweirimport sys, smtplib, imaplib, poplib
46cdf0e10cSrcweir
47cdf0e10cSrcweirdbg = False
48cdf0e10cSrcweir
49cdf0e10cSrcweirclass PyMailSMTPService(unohelper.Base, XSmtpService):
50cdf0e10cSrcweir    def __init__( self, ctx ):
51cdf0e10cSrcweir        self.ctx = ctx
52cdf0e10cSrcweir        self.listeners = []
53cdf0e10cSrcweir        self.supportedtypes = ('Insecure', 'Ssl')
54cdf0e10cSrcweir        self.server = None
55cdf0e10cSrcweir        self.connectioncontext = None
56bb7facceSAriel Constenla-Haile        self.notify = EventObject(self)
57cdf0e10cSrcweir        if dbg:
58cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService init"
59cdf0e10cSrcweir    def addConnectionListener(self, xListener):
60cdf0e10cSrcweir        if dbg:
61cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService addConnectionListener"
62cdf0e10cSrcweir        self.listeners.append(xListener)
63cdf0e10cSrcweir    def removeConnectionListener(self, xListener):
64cdf0e10cSrcweir        if dbg:
65cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService removeConnectionListener"
66cdf0e10cSrcweir        self.listeners.remove(xListener)
67cdf0e10cSrcweir    def getSupportedConnectionTypes(self):
68cdf0e10cSrcweir        if dbg:
69cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService getSupportedConnectionTypes"
70cdf0e10cSrcweir        return self.supportedtypes
71cdf0e10cSrcweir    def connect(self, xConnectionContext, xAuthenticator):
72cdf0e10cSrcweir        self.connectioncontext = xConnectionContext
73cdf0e10cSrcweir        if dbg:
74cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService connect"
75*d3d1f4e0SAriel Constenla-Haile
76cdf0e10cSrcweir        server = xConnectionContext.getValueByName("ServerName")
77cdf0e10cSrcweir        if dbg:
78*d3d1f4e0SAriel Constenla-Haile            print >> sys.stderr, "ServerName: %s" % server
79*d3d1f4e0SAriel Constenla-Haile
80cdf0e10cSrcweir        port = xConnectionContext.getValueByName("Port")
81cdf0e10cSrcweir        if dbg:
82*d3d1f4e0SAriel Constenla-Haile            print >> sys.stderr, "Port: %d" % port
83*d3d1f4e0SAriel Constenla-Haile
84*d3d1f4e0SAriel Constenla-Haile        tout = xConnectionContext.getValueByName("Timeout")
85*d3d1f4e0SAriel Constenla-Haile        if dbg:
86*d3d1f4e0SAriel Constenla-Haile            print >> sys.stderr, isinstance(tout,int)
87*d3d1f4e0SAriel Constenla-Haile        if not isinstance(tout,int):
88*d3d1f4e0SAriel Constenla-Haile            tout = _GLOBAL_DEFAULT_TIMEOUT
89*d3d1f4e0SAriel Constenla-Haile        if dbg:
90*d3d1f4e0SAriel Constenla-Haile            print >> sys.stderr, "Timeout: %s" % str(tout)
91*d3d1f4e0SAriel Constenla-Haile
92*d3d1f4e0SAriel Constenla-Haile        self.server = smtplib.SMTP(server, port,timeout=tout)
93cdf0e10cSrcweir        if dbg:
94cdf0e10cSrcweir            self.server.set_debuglevel(1)
95*d3d1f4e0SAriel Constenla-Haile
96cdf0e10cSrcweir        connectiontype = xConnectionContext.getValueByName("ConnectionType")
97cdf0e10cSrcweir        if dbg:
98*d3d1f4e0SAriel Constenla-Haile            print >> sys.stderr, "ConnectionType: %s" % connectiontype
99*d3d1f4e0SAriel Constenla-Haile
100bb7facceSAriel Constenla-Haile        if connectiontype.upper() == 'SSL':
101cdf0e10cSrcweir            self.server.ehlo()
102cdf0e10cSrcweir            self.server.starttls()
103cdf0e10cSrcweir            self.server.ehlo()
104cdf0e10cSrcweir
105cdf0e10cSrcweir        user = xAuthenticator.getUserName().encode('ascii')
106cdf0e10cSrcweir        password = xAuthenticator.getPassword().encode('ascii')
107cdf0e10cSrcweir        if user != '':
108cdf0e10cSrcweir            if dbg:
109cdf0e10cSrcweir                print >> sys.stderr, 'Logging in, username of', user
110cdf0e10cSrcweir            self.server.login(user, password)
111cdf0e10cSrcweir
112cdf0e10cSrcweir        for listener in self.listeners:
113cdf0e10cSrcweir            listener.connected(self.notify)
114cdf0e10cSrcweir    def disconnect(self):
115cdf0e10cSrcweir        if dbg:
116cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService disconnect"
117cdf0e10cSrcweir        if self.server:
118cdf0e10cSrcweir            self.server.quit()
119cdf0e10cSrcweir            self.server = None
120cdf0e10cSrcweir        for listener in self.listeners:
121cdf0e10cSrcweir            listener.disconnected(self.notify)
122cdf0e10cSrcweir    def isConnected(self):
123cdf0e10cSrcweir        if dbg:
124cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService isConnected"
125cdf0e10cSrcweir        return self.server != None
126cdf0e10cSrcweir    def getCurrentConnectionContext(self):
127cdf0e10cSrcweir        if dbg:
128cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService getCurrentConnectionContext"
129cdf0e10cSrcweir        return self.connectioncontext
130cdf0e10cSrcweir    def sendMailMessage(self, xMailMessage):
131cdf0e10cSrcweir        COMMASPACE = ', '
132cdf0e10cSrcweir
133cdf0e10cSrcweir        if dbg:
134cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService sendMailMessage"
135cdf0e10cSrcweir        recipients = xMailMessage.getRecipients()
136cdf0e10cSrcweir        sendermail = xMailMessage.SenderAddress
137cdf0e10cSrcweir        sendername = xMailMessage.SenderName
138cdf0e10cSrcweir        subject = xMailMessage.Subject
139cdf0e10cSrcweir        ccrecipients = xMailMessage.getCcRecipients()
140cdf0e10cSrcweir        bccrecipients = xMailMessage.getBccRecipients()
141cdf0e10cSrcweir        if dbg:
142cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService subject", subject
143cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService from", sendername.encode('utf-8')
144cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMTPService from", sendermail
145cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService send to", recipients
146cdf0e10cSrcweir
147cdf0e10cSrcweir        attachments = xMailMessage.getAttachments()
148cdf0e10cSrcweir
149cdf0e10cSrcweir        textmsg = Message()
150cdf0e10cSrcweir
151cdf0e10cSrcweir        content = xMailMessage.Body
152cdf0e10cSrcweir        flavors = content.getTransferDataFlavors()
153cdf0e10cSrcweir        if dbg:
154cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService flavors len", len(flavors)
155cdf0e10cSrcweir
156cdf0e10cSrcweir        #Use first flavor that's sane for an email body
157cdf0e10cSrcweir        for flavor in flavors:
158cdf0e10cSrcweir            if flavor.MimeType.find('text/html') != -1 or flavor.MimeType.find('text/plain') != -1:
159cdf0e10cSrcweir                if dbg:
160cdf0e10cSrcweir                    print >> sys.stderr, "PyMailSMPTService mimetype is", flavor.MimeType
161cdf0e10cSrcweir                textbody = content.getTransferData(flavor)
162cdf0e10cSrcweir                try:
163cdf0e10cSrcweir                    textbody = textbody.value
164cdf0e10cSrcweir                except:
165cdf0e10cSrcweir                    pass
166cdf0e10cSrcweir                textbody = textbody.encode('utf-8')
167cdf0e10cSrcweir
168cdf0e10cSrcweir                if len(textbody):
169cdf0e10cSrcweir                    mimeEncoding = re.sub("charset=.*", "charset=UTF-8", flavor.MimeType)
170cdf0e10cSrcweir                    if mimeEncoding.find('charset=UTF-8') == -1:
171cdf0e10cSrcweir                        mimeEncoding = mimeEncoding + "; charset=UTF-8"
172cdf0e10cSrcweir                    textmsg['Content-Type'] = mimeEncoding
173cdf0e10cSrcweir                    textmsg['MIME-Version'] = '1.0'
174cdf0e10cSrcweir                    textmsg.set_payload(textbody)
175cdf0e10cSrcweir
176cdf0e10cSrcweir                break
177cdf0e10cSrcweir
178cdf0e10cSrcweir        if (len(attachments)):
179cdf0e10cSrcweir            msg = MIMEMultipart()
180cdf0e10cSrcweir            msg.epilogue = ''
181cdf0e10cSrcweir            msg.attach(textmsg)
182cdf0e10cSrcweir        else:
183cdf0e10cSrcweir            msg = textmsg
184cdf0e10cSrcweir
185cdf0e10cSrcweir        hdr = Header(sendername, 'utf-8')
186cdf0e10cSrcweir        hdr.append('<'+sendermail+'>','us-ascii')
187cdf0e10cSrcweir        msg['Subject'] = subject
188cdf0e10cSrcweir        msg['From'] = hdr
189cdf0e10cSrcweir        msg['To'] = COMMASPACE.join(recipients)
190cdf0e10cSrcweir        if len(ccrecipients):
191cdf0e10cSrcweir            msg['Cc'] = COMMASPACE.join(ccrecipients)
192cdf0e10cSrcweir        if xMailMessage.ReplyToAddress != '':
193cdf0e10cSrcweir            msg['Reply-To'] = xMailMessage.ReplyToAddress
194cdf0e10cSrcweir
195cdf0e10cSrcweir        mailerstring = "OpenOffice.org 2.0 via Caolan's mailmerge component"
196cdf0e10cSrcweir        try:
197cdf0e10cSrcweir            ctx = uno.getComponentContext()
198cdf0e10cSrcweir            aConfigProvider = ctx.ServiceManager.createInstance("com.sun.star.configuration.ConfigurationProvider")
199cdf0e10cSrcweir            prop = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
200cdf0e10cSrcweir            prop.Name = "nodepath"
201cdf0e10cSrcweir            prop.Value = "/org.openoffice.Setup/Product"
202cdf0e10cSrcweir            aSettings = aConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess",
203cdf0e10cSrcweir                (prop,))
204cdf0e10cSrcweir            mailerstring = aSettings.getByName("ooName") + " " + \
205cdf0e10cSrcweir                aSettings.getByName("ooSetupVersion") + " via Caolan's mailmerge component"
206cdf0e10cSrcweir        except:
207cdf0e10cSrcweir            pass
208cdf0e10cSrcweir
209cdf0e10cSrcweir        msg['X-Mailer'] = mailerstring
210cdf0e10cSrcweir        msg['Date'] = formatdate(localtime=True)
211cdf0e10cSrcweir
212cdf0e10cSrcweir        for attachment in attachments:
213cdf0e10cSrcweir            content = attachment.Data
214cdf0e10cSrcweir            flavors = content.getTransferDataFlavors()
215cdf0e10cSrcweir            flavor = flavors[0]
216cdf0e10cSrcweir            ctype = flavor.MimeType
217cdf0e10cSrcweir            maintype, subtype = ctype.split('/', 1)
218cdf0e10cSrcweir            msgattachment = MIMEBase(maintype, subtype)
219cdf0e10cSrcweir            data = content.getTransferData(flavor)
220cdf0e10cSrcweir            msgattachment.set_payload(data)
221cdf0e10cSrcweir            Encoders.encode_base64(msgattachment)
222a0292563SAriel Constenla-Haile            fname = attachment.ReadableName
223a0292563SAriel Constenla-Haile            try:
224a0292563SAriel Constenla-Haile                fname.encode('ascii')
225a0292563SAriel Constenla-Haile            except:
226a0292563SAriel Constenla-Haile                fname = ('utf-8','',fname.encode('utf-8'))
227cdf0e10cSrcweir            msgattachment.add_header('Content-Disposition', 'attachment', \
228a0292563SAriel Constenla-Haile                filename=fname)
229cdf0e10cSrcweir            msg.attach(msgattachment)
230cdf0e10cSrcweir
231cdf0e10cSrcweir        uniquer = {}
232cdf0e10cSrcweir        for key in recipients:
233cdf0e10cSrcweir            uniquer[key] = True
234cdf0e10cSrcweir        if len(ccrecipients):
235cdf0e10cSrcweir            for key in ccrecipients:
236cdf0e10cSrcweir                uniquer[key] = True
237cdf0e10cSrcweir        if len(bccrecipients):
238cdf0e10cSrcweir            for key in bccrecipients:
239cdf0e10cSrcweir                uniquer[key] = True
240cdf0e10cSrcweir        truerecipients = uniquer.keys()
241cdf0e10cSrcweir
242cdf0e10cSrcweir        if dbg:
243cdf0e10cSrcweir            print >> sys.stderr, "PyMailSMPTService recipients are", truerecipients
244cdf0e10cSrcweir
245cdf0e10cSrcweir        self.server.sendmail(sendermail, truerecipients, msg.as_string())
246cdf0e10cSrcweir
247cdf0e10cSrcweirclass PyMailIMAPService(unohelper.Base, XMailService):
248cdf0e10cSrcweir    def __init__( self, ctx ):
249cdf0e10cSrcweir        self.ctx = ctx
250cdf0e10cSrcweir        self.listeners = []
251cdf0e10cSrcweir        self.supportedtypes = ('Insecure', 'Ssl')
252cdf0e10cSrcweir        self.server = None
253cdf0e10cSrcweir        self.connectioncontext = None
254bb7facceSAriel Constenla-Haile        self.notify = EventObject(self)
255cdf0e10cSrcweir        if dbg:
256cdf0e10cSrcweir            print >> sys.stderr, "PyMailIMAPService init"
257cdf0e10cSrcweir    def addConnectionListener(self, xListener):
258cdf0e10cSrcweir        if dbg:
259cdf0e10cSrcweir            print >> sys.stderr, "PyMailIMAPService addConnectionListener"
260cdf0e10cSrcweir        self.listeners.append(xListener)
261cdf0e10cSrcweir    def removeConnectionListener(self, xListener):
262cdf0e10cSrcweir        if dbg:
263cdf0e10cSrcweir            print >> sys.stderr, "PyMailIMAPService removeConnectionListener"
264cdf0e10cSrcweir        self.listeners.remove(xListener)
265cdf0e10cSrcweir    def getSupportedConnectionTypes(self):
266cdf0e10cSrcweir        if dbg:
267cdf0e10cSrcweir            print >> sys.stderr, "PyMailIMAPService getSupportedConnectionTypes"
268cdf0e10cSrcweir        return self.supportedtypes
269cdf0e10cSrcweir    def connect(self, xConnectionContext, xAuthenticator):
270cdf0e10cSrcweir        if dbg:
271cdf0e10cSrcweir            print >> sys.stderr, "PyMailIMAPService connect"
272cdf0e10cSrcweir
273cdf0e10cSrcweir        self.connectioncontext = xConnectionContext
274cdf0e10cSrcweir        server = xConnectionContext.getValueByName("ServerName")
275cdf0e10cSrcweir        if dbg:
276cdf0e10cSrcweir            print >> sys.stderr, server
277cdf0e10cSrcweir        port = xConnectionContext.getValueByName("Port")
278cdf0e10cSrcweir        if dbg:
279cdf0e10cSrcweir            print >> sys.stderr, port
280cdf0e10cSrcweir        connectiontype = xConnectionContext.getValueByName("ConnectionType")
281cdf0e10cSrcweir        if dbg:
282cdf0e10cSrcweir            print >> sys.stderr, connectiontype
283cdf0e10cSrcweir        print >> sys.stderr, "BEFORE"
284bb7facceSAriel Constenla-Haile        if connectiontype.upper() == 'SSL':
285cdf0e10cSrcweir            self.server = imaplib.IMAP4_SSL(server, port)
286cdf0e10cSrcweir        else:
287cdf0e10cSrcweir            self.server = imaplib.IMAP4(server, port)
288cdf0e10cSrcweir        print >> sys.stderr, "AFTER"
289cdf0e10cSrcweir
290cdf0e10cSrcweir        user = xAuthenticator.getUserName().encode('ascii')
291cdf0e10cSrcweir        password = xAuthenticator.getPassword().encode('ascii')
292cdf0e10cSrcweir        if user != '':
293cdf0e10cSrcweir            if dbg:
294cdf0e10cSrcweir                print >> sys.stderr, 'Logging in, username of', user
295cdf0e10cSrcweir            self.server.login(user, password)
296cdf0e10cSrcweir
297cdf0e10cSrcweir        for listener in self.listeners:
298cdf0e10cSrcweir            listener.connected(self.notify)
299cdf0e10cSrcweir    def disconnect(self):
300cdf0e10cSrcweir        if dbg:
301cdf0e10cSrcweir            print >> sys.stderr, "PyMailIMAPService disconnect"
302cdf0e10cSrcweir        if self.server:
303cdf0e10cSrcweir            self.server.logout()
304cdf0e10cSrcweir            self.server = None
305cdf0e10cSrcweir        for listener in self.listeners:
306cdf0e10cSrcweir            listener.disconnected(self.notify)
307cdf0e10cSrcweir    def isConnected(self):
308cdf0e10cSrcweir        if dbg:
309cdf0e10cSrcweir            print >> sys.stderr, "PyMailIMAPService isConnected"
310cdf0e10cSrcweir        return self.server != None
311cdf0e10cSrcweir    def getCurrentConnectionContext(self):
312cdf0e10cSrcweir        if dbg:
313cdf0e10cSrcweir            print >> sys.stderr, "PyMailIMAPService getCurrentConnectionContext"
314cdf0e10cSrcweir        return self.connectioncontext
315cdf0e10cSrcweir
316cdf0e10cSrcweirclass PyMailPOP3Service(unohelper.Base, XMailService):
317cdf0e10cSrcweir    def __init__( self, ctx ):
318cdf0e10cSrcweir        self.ctx = ctx
319cdf0e10cSrcweir        self.listeners = []
320cdf0e10cSrcweir        self.supportedtypes = ('Insecure', 'Ssl')
321cdf0e10cSrcweir        self.server = None
322cdf0e10cSrcweir        self.connectioncontext = None
323bb7facceSAriel Constenla-Haile        self.notify = EventObject(self)
324cdf0e10cSrcweir        if dbg:
325cdf0e10cSrcweir            print >> sys.stderr, "PyMailPOP3Service init"
326cdf0e10cSrcweir    def addConnectionListener(self, xListener):
327cdf0e10cSrcweir        if dbg:
328cdf0e10cSrcweir            print >> sys.stderr, "PyMailPOP3Service addConnectionListener"
329cdf0e10cSrcweir        self.listeners.append(xListener)
330cdf0e10cSrcweir    def removeConnectionListener(self, xListener):
331cdf0e10cSrcweir        if dbg:
332cdf0e10cSrcweir            print >> sys.stderr, "PyMailPOP3Service removeConnectionListener"
333cdf0e10cSrcweir        self.listeners.remove(xListener)
334cdf0e10cSrcweir    def getSupportedConnectionTypes(self):
335cdf0e10cSrcweir        if dbg:
336cdf0e10cSrcweir            print >> sys.stderr, "PyMailPOP3Service getSupportedConnectionTypes"
337cdf0e10cSrcweir        return self.supportedtypes
338cdf0e10cSrcweir    def connect(self, xConnectionContext, xAuthenticator):
339cdf0e10cSrcweir        if dbg:
340cdf0e10cSrcweir            print >> sys.stderr, "PyMailPOP3Service connect"
341cdf0e10cSrcweir
342cdf0e10cSrcweir        self.connectioncontext = xConnectionContext
343cdf0e10cSrcweir        server = xConnectionContext.getValueByName("ServerName")
344cdf0e10cSrcweir        if dbg:
345cdf0e10cSrcweir            print >> sys.stderr, server
346cdf0e10cSrcweir        port = xConnectionContext.getValueByName("Port")
347cdf0e10cSrcweir        if dbg:
348cdf0e10cSrcweir            print >> sys.stderr, port
349cdf0e10cSrcweir        connectiontype = xConnectionContext.getValueByName("ConnectionType")
350cdf0e10cSrcweir        if dbg:
351cdf0e10cSrcweir            print >> sys.stderr, connectiontype
352cdf0e10cSrcweir        print >> sys.stderr, "BEFORE"
353bb7facceSAriel Constenla-Haile        if connectiontype.upper() == 'SSL':
354cdf0e10cSrcweir            self.server = poplib.POP3_SSL(server, port)
355cdf0e10cSrcweir        else:
356*d3d1f4e0SAriel Constenla-Haile            tout = xConnectionContext.getValueByName("Timeout")
357*d3d1f4e0SAriel Constenla-Haile            if dbg:
358*d3d1f4e0SAriel Constenla-Haile                print >> sys.stderr, isinstance(tout,int)
359*d3d1f4e0SAriel Constenla-Haile            if not isinstance(tout,int):
360*d3d1f4e0SAriel Constenla-Haile                tout = _GLOBAL_DEFAULT_TIMEOUT
361*d3d1f4e0SAriel Constenla-Haile            if dbg:
362*d3d1f4e0SAriel Constenla-Haile                print >> sys.stderr, "Timeout: %s" % str(tout)
363*d3d1f4e0SAriel Constenla-Haile            self.server = poplib.POP3(server, port, timeout=tout)
364cdf0e10cSrcweir        print >> sys.stderr, "AFTER"
365cdf0e10cSrcweir
366cdf0e10cSrcweir        user = xAuthenticator.getUserName().encode('ascii')
367cdf0e10cSrcweir        password = xAuthenticator.getPassword().encode('ascii')
368cdf0e10cSrcweir        if dbg:
369cdf0e10cSrcweir            print >> sys.stderr, 'Logging in, username of', user
370cdf0e10cSrcweir        self.server.user(user)
371bb7facceSAriel Constenla-Haile        self.server.pass_(password)
372cdf0e10cSrcweir
373cdf0e10cSrcweir        for listener in self.listeners:
374cdf0e10cSrcweir            listener.connected(self.notify)
375cdf0e10cSrcweir    def disconnect(self):
376cdf0e10cSrcweir        if dbg:
377cdf0e10cSrcweir            print >> sys.stderr, "PyMailPOP3Service disconnect"
378cdf0e10cSrcweir        if self.server:
379cdf0e10cSrcweir            self.server.quit()
380cdf0e10cSrcweir            self.server = None
381cdf0e10cSrcweir        for listener in self.listeners:
382cdf0e10cSrcweir            listener.disconnected(self.notify)
383cdf0e10cSrcweir    def isConnected(self):
384cdf0e10cSrcweir        if dbg:
385cdf0e10cSrcweir            print >> sys.stderr, "PyMailPOP3Service isConnected"
386cdf0e10cSrcweir        return self.server != None
387cdf0e10cSrcweir    def getCurrentConnectionContext(self):
388cdf0e10cSrcweir        if dbg:
389cdf0e10cSrcweir            print >> sys.stderr, "PyMailPOP3Service getCurrentConnectionContext"
390cdf0e10cSrcweir        return self.connectioncontext
391cdf0e10cSrcweir
392cdf0e10cSrcweirclass PyMailServiceProvider(unohelper.Base, XMailServiceProvider):
393cdf0e10cSrcweir    def __init__( self, ctx ):
394cdf0e10cSrcweir        if dbg:
395cdf0e10cSrcweir            print >> sys.stderr, "PyMailServiceProvider init"
396cdf0e10cSrcweir        self.ctx = ctx
397cdf0e10cSrcweir    def create(self, aType):
398cdf0e10cSrcweir        if dbg:
399cdf0e10cSrcweir            print >> sys.stderr, "PyMailServiceProvider create with", aType
400cdf0e10cSrcweir        if aType == SMTP:
401cdf0e10cSrcweir            return PyMailSMTPService(self.ctx);
402cdf0e10cSrcweir        elif aType == POP3:
403cdf0e10cSrcweir            return PyMailPOP3Service(self.ctx);
404cdf0e10cSrcweir        elif aType == IMAP:
405cdf0e10cSrcweir            return PyMailIMAPService(self.ctx);
406cdf0e10cSrcweir        else:
407cdf0e10cSrcweir            print >> sys.stderr, "PyMailServiceProvider, unknown TYPE", aType
408cdf0e10cSrcweir
409cdf0e10cSrcweirclass PyMailMessage(unohelper.Base, XMailMessage):
410cdf0e10cSrcweir    def __init__( self, ctx, sTo='', sFrom='', Subject='', Body=None, aMailAttachment=None ):
411cdf0e10cSrcweir        if dbg:
412cdf0e10cSrcweir            print >> sys.stderr, "PyMailMessage init"
413cdf0e10cSrcweir        self.ctx = ctx
414cdf0e10cSrcweir
415bb7facceSAriel Constenla-Haile        self.recipients = [sTo]
416bb7facceSAriel Constenla-Haile        self.ccrecipients = []
417bb7facceSAriel Constenla-Haile        self.bccrecipients = []
418bb7facceSAriel Constenla-Haile        self.aMailAttachments = []
419cdf0e10cSrcweir        if aMailAttachment != None:
420bb7facceSAriel Constenla-Haile            self.aMailAttachments.append(aMailAttachment)
421cdf0e10cSrcweir
422cdf0e10cSrcweir        self.SenderName, self.SenderAddress = parseaddr(sFrom)
423cdf0e10cSrcweir        self.ReplyToAddress = sFrom
424cdf0e10cSrcweir        self.Subject = Subject
425cdf0e10cSrcweir        self.Body = Body
426cdf0e10cSrcweir        if dbg:
427cdf0e10cSrcweir            print >> sys.stderr, "post PyMailMessage init"
428cdf0e10cSrcweir    def addRecipient( self, recipient ):
429cdf0e10cSrcweir        if dbg:
430cdf0e10cSrcweir            print >> sys.stderr, "PyMailMessage.addRecipient", recipient
431bb7facceSAriel Constenla-Haile        self.recipients.append(recipient)
432cdf0e10cSrcweir    def addCcRecipient( self, ccrecipient ):
433cdf0e10cSrcweir        if dbg:
434cdf0e10cSrcweir            print >> sys.stderr, "PyMailMessage.addCcRecipient", ccrecipient
435bb7facceSAriel Constenla-Haile        self.ccrecipients.append(ccrecipient)
436cdf0e10cSrcweir    def addBccRecipient( self, bccrecipient ):
437cdf0e10cSrcweir        if dbg:
438cdf0e10cSrcweir            print >> sys.stderr, "PyMailMessage.addBccRecipient", bccrecipient
439bb7facceSAriel Constenla-Haile        self.bccrecipients.append(bccrecipient)
440cdf0e10cSrcweir    def getRecipients( self ):
441cdf0e10cSrcweir        if dbg:
442cdf0e10cSrcweir            print >> sys.stderr, "PyMailMessage.getRecipients", self.recipients
443bb7facceSAriel Constenla-Haile        return tuple(self.recipients)
444cdf0e10cSrcweir    def getCcRecipients( self ):
445cdf0e10cSrcweir        if dbg:
446cdf0e10cSrcweir            print >> sys.stderr, "PyMailMessage.getCcRecipients", self.ccrecipients
447bb7facceSAriel Constenla-Haile        return tuple(self.ccrecipients)
448cdf0e10cSrcweir    def getBccRecipients( self ):
449cdf0e10cSrcweir        if dbg:
450cdf0e10cSrcweir            print >> sys.stderr, "PyMailMessage.getBccRecipients", self.bccrecipients
451bb7facceSAriel Constenla-Haile        return tuple(self.bccrecipients)
452cdf0e10cSrcweir    def addAttachment( self, aMailAttachment ):
453cdf0e10cSrcweir        if dbg:
454cdf0e10cSrcweir            print >> sys.stderr, "PyMailMessage.addAttachment"
455bb7facceSAriel Constenla-Haile        self.aMailAttachments.append(aMailAttachment)
456cdf0e10cSrcweir    def getAttachments( self ):
457cdf0e10cSrcweir        if dbg:
458cdf0e10cSrcweir            print >> sys.stderr, "PyMailMessage.getAttachments"
459bb7facceSAriel Constenla-Haile        return tuple(self.aMailAttachments)
460bb7facceSAriel Constenla-Haile
461cdf0e10cSrcweir
462cdf0e10cSrcweir# pythonloader looks for a static g_ImplementationHelper variable
463cdf0e10cSrcweirg_ImplementationHelper = unohelper.ImplementationHelper()
464cdf0e10cSrcweirg_ImplementationHelper.addImplementation( \
465cdf0e10cSrcweir    PyMailServiceProvider, "org.openoffice.pyuno.MailServiceProvider",
466cdf0e10cSrcweir        ("com.sun.star.mail.MailServiceProvider",),)
467cdf0e10cSrcweirg_ImplementationHelper.addImplementation( \
468cdf0e10cSrcweir    PyMailMessage, "org.openoffice.pyuno.MailMessage",
469cdf0e10cSrcweir        ("com.sun.star.mail.MailMessage",),)
470