19f22d7c2SAndrew Rist# *************************************************************
2a5dab537Smseidel#
39f22d7c2SAndrew Rist#  Licensed to the Apache Software Foundation (ASF) under one
49f22d7c2SAndrew Rist#  or more contributor license agreements.  See the NOTICE file
59f22d7c2SAndrew Rist#  distributed with this work for additional information
69f22d7c2SAndrew Rist#  regarding copyright ownership.  The ASF licenses this file
79f22d7c2SAndrew Rist#  to you under the Apache License, Version 2.0 (the
89f22d7c2SAndrew Rist#  "License"); you may not use this file except in compliance
99f22d7c2SAndrew Rist#  with the License.  You may obtain a copy of the License at
10a5dab537Smseidel#
119f22d7c2SAndrew Rist#    http://www.apache.org/licenses/LICENSE-2.0
12a5dab537Smseidel#
139f22d7c2SAndrew Rist#  Unless required by applicable law or agreed to in writing,
149f22d7c2SAndrew Rist#  software distributed under the License is distributed on an
159f22d7c2SAndrew Rist#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
169f22d7c2SAndrew Rist#  KIND, either express or implied.  See the License for the
179f22d7c2SAndrew Rist#  specific language governing permissions and limitations
189f22d7c2SAndrew Rist#  under the License.
19a5dab537Smseidel#
209f22d7c2SAndrew Rist# *************************************************************
219f22d7c2SAndrew Rist
22cdf0e10cSrcweir# Caolan McNamara caolanm@redhat.com
23cdf0e10cSrcweir# a simple email mailmerge component
24cdf0e10cSrcweir
25cdf0e10cSrcweir# manual installation for hackers, not necessary for users
26cdf0e10cSrcweir# cp mailmerge.py /usr/lib/openoffice.org2.0/program
27cdf0e10cSrcweir# cd /usr/lib/openoffice.org2.0/program
28cdf0e10cSrcweir# ./unopkg add --shared mailmerge.py
29cdf0e10cSrcweir# edit ~/.openoffice.org2/user/registry/data/org/openoffice/Office/Writer.xcu
30cdf0e10cSrcweir# and change EMailSupported to as follows...
31cdf0e10cSrcweir#  <prop oor:name="EMailSupported" oor:type="xs:boolean">
32cdf0e10cSrcweir#   <value>true</value>
33cdf0e10cSrcweir#  </prop>
34cdf0e10cSrcweir
35cdf0e10cSrcweirimport unohelper
36cdf0e10cSrcweirimport uno
37cdf0e10cSrcweirimport re
38cdf0e10cSrcweir
39cdf0e10cSrcweir#to implement com::sun::star::mail::XMailServiceProvider
40cdf0e10cSrcweir#and
41cdf0e10cSrcweir#to implement com.sun.star.mail.XMailMessage
42cdf0e10cSrcweir
43cdf0e10cSrcweirfrom com.sun.star.mail import XMailServiceProvider
44cdf0e10cSrcweirfrom com.sun.star.mail import XMailService
45cdf0e10cSrcweirfrom com.sun.star.mail import XSmtpService
46cdf0e10cSrcweirfrom com.sun.star.mail import XConnectionListener
47cdf0e10cSrcweirfrom com.sun.star.mail import XAuthenticator
48cdf0e10cSrcweirfrom com.sun.star.mail import XMailMessage
49cdf0e10cSrcweirfrom com.sun.star.mail.MailServiceType import SMTP
50cdf0e10cSrcweirfrom com.sun.star.mail.MailServiceType import POP3
51cdf0e10cSrcweirfrom com.sun.star.mail.MailServiceType import IMAP
52cdf0e10cSrcweirfrom com.sun.star.uno import XCurrentContext
53cdf0e10cSrcweirfrom com.sun.star.lang import IllegalArgumentException
54cdf0e10cSrcweirfrom com.sun.star.lang import EventObject
55cdf0e10cSrcweirfrom com.sun.star.mail import SendMailMessageFailedException
56cdf0e10cSrcweir
57cdf0e10cSrcweirfrom email.MIMEBase import MIMEBase
58cdf0e10cSrcweirfrom email.Message import Message
59cdf0e10cSrcweirfrom email import Encoders
60cdf0e10cSrcweirfrom email.Header import Header
61cdf0e10cSrcweirfrom email.MIMEMultipart import MIMEMultipart
62cdf0e10cSrcweirfrom email.Utils import formatdate
63cdf0e10cSrcweirfrom email.Utils import parseaddr
64d3d1f4e0SAriel Constenla-Hailefrom socket import _GLOBAL_DEFAULT_TIMEOUT
65cdf0e10cSrcweir
66cdf0e10cSrcweirimport sys, smtplib, imaplib, poplib
67cdf0e10cSrcweir
68cdf0e10cSrcweirdbg = False
69bc42e70bSAriel Constenla-Haileout = sys.stderr
70cdf0e10cSrcweir
71cdf0e10cSrcweirclass PyMailSMTPService(unohelper.Base, XSmtpService):
7213cfd8dfSPedro Giffuni    def __init__( self, ctx ):
7313cfd8dfSPedro Giffuni        self.ctx = ctx
7413cfd8dfSPedro Giffuni        self.listeners = []
7513cfd8dfSPedro Giffuni        self.supportedtypes = ('Insecure', 'Ssl')
7613cfd8dfSPedro Giffuni        self.server = None
7713cfd8dfSPedro Giffuni        self.connectioncontext = None
7813cfd8dfSPedro Giffuni        self.notify = EventObject(self)
7913cfd8dfSPedro Giffuni        if dbg:
80a5dab537Smseidel            out.write("PyMailSMTPService init\n")
8113cfd8dfSPedro Giffuni    def addConnectionListener(self, xListener):
8213cfd8dfSPedro Giffuni        if dbg:
83a5dab537Smseidel            out.write("PyMailSMTPService addConnectionListener\n")
8413cfd8dfSPedro Giffuni        self.listeners.append(xListener)
8513cfd8dfSPedro Giffuni    def removeConnectionListener(self, xListener):
8613cfd8dfSPedro Giffuni        if dbg:
87a5dab537Smseidel            out.write("PyMailSMTPService removeConnectionListener\n")
8813cfd8dfSPedro Giffuni        self.listeners.remove(xListener)
8913cfd8dfSPedro Giffuni    def getSupportedConnectionTypes(self):
9013cfd8dfSPedro Giffuni        if dbg:
91a5dab537Smseidel            out.write("PyMailSMTPService getSupportedConnectionTypes\n")
9213cfd8dfSPedro Giffuni        return self.supportedtypes
9313cfd8dfSPedro Giffuni    def connect(self, xConnectionContext, xAuthenticator):
9413cfd8dfSPedro Giffuni        self.connectioncontext = xConnectionContext
9513cfd8dfSPedro Giffuni        if dbg:
96a5dab537Smseidel            out.write("PyMailSMTPService connect\n")
9713cfd8dfSPedro Giffuni
9813cfd8dfSPedro Giffuni        server = xConnectionContext.getValueByName("ServerName")
9913cfd8dfSPedro Giffuni        if dbg:
100bc42e70bSAriel Constenla-Haile            out.write("ServerName: %s\n" % server)
10113cfd8dfSPedro Giffuni
10213cfd8dfSPedro Giffuni        port = xConnectionContext.getValueByName("Port")
10313cfd8dfSPedro Giffuni        if dbg:
104bc42e70bSAriel Constenla-Haile            out.write("Port: %d\n" % port)
10513cfd8dfSPedro Giffuni
10613cfd8dfSPedro Giffuni        tout = xConnectionContext.getValueByName("Timeout")
10713cfd8dfSPedro Giffuni        if dbg:
108bc42e70bSAriel Constenla-Haile            out.write("Timeout is instance of int? %s\n" % isinstance(tout,int))
10913cfd8dfSPedro Giffuni        if not isinstance(tout,int):
11013cfd8dfSPedro Giffuni            tout = _GLOBAL_DEFAULT_TIMEOUT
11113cfd8dfSPedro Giffuni        if dbg:
112bc42e70bSAriel Constenla-Haile            out.write("Timeout: %s\n" % str(tout))
11313cfd8dfSPedro Giffuni
114*6e1ccbb0SBidouille        connectiontype = xConnectionContext.getValueByName("ConnectionType")
115*6e1ccbb0SBidouille        if connectiontype.upper() == "SSL":
116*6e1ccbb0SBidouille            if not hasattr(smtplib, "SMTP_SSL"):
117*6e1ccbb0SBidouille                raise IllegalArgumentException("Connection type is not supported: " + connectiontype, self, 1)
118*6e1ccbb0SBidouille            self.server = smtplib.SMTP_SSL(server, port, timeout=tout)
119*6e1ccbb0SBidouille        else:
120*6e1ccbb0SBidouille            self.server = smtplib.SMTP(server, port,timeout=tout)
12113cfd8dfSPedro Giffuni        if dbg:
12213cfd8dfSPedro Giffuni            self.server.set_debuglevel(1)
123*6e1ccbb0SBidouille
12413cfd8dfSPedro Giffuni        if dbg:
125bc42e70bSAriel Constenla-Haile            out.write("ConnectionType: %s\n" % str(connectiontype))
12613cfd8dfSPedro Giffuni
127*6e1ccbb0SBidouille        if connectiontype.upper() == 'INSECURE':
12813cfd8dfSPedro Giffuni            self.server.ehlo()
12913cfd8dfSPedro Giffuni            self.server.starttls()
13013cfd8dfSPedro Giffuni            self.server.ehlo()
13113cfd8dfSPedro Giffuni
13213cfd8dfSPedro Giffuni        user = xAuthenticator.getUserName().encode('ascii')
13313cfd8dfSPedro Giffuni        password = xAuthenticator.getPassword().encode('ascii')
13413cfd8dfSPedro Giffuni        if user != '':
13513cfd8dfSPedro Giffuni            if dbg:
136bc42e70bSAriel Constenla-Haile                out.write('Logging in, username of %s\n' % user)
13713cfd8dfSPedro Giffuni            self.server.login(user, password)
13813cfd8dfSPedro Giffuni
13913cfd8dfSPedro Giffuni        for listener in self.listeners:
14013cfd8dfSPedro Giffuni            listener.connected(self.notify)
14113cfd8dfSPedro Giffuni    def disconnect(self):
14213cfd8dfSPedro Giffuni        if dbg:
143a5dab537Smseidel            out.write("PyMailSMTPService disconnect\n")
14413cfd8dfSPedro Giffuni        if self.server:
14513cfd8dfSPedro Giffuni            self.server.quit()
14613cfd8dfSPedro Giffuni            self.server = None
14713cfd8dfSPedro Giffuni        for listener in self.listeners:
14813cfd8dfSPedro Giffuni            listener.disconnected(self.notify)
14913cfd8dfSPedro Giffuni    def isConnected(self):
15013cfd8dfSPedro Giffuni        if dbg:
151a5dab537Smseidel            out.write("PyMailSMTPService isConnected\n")
15213cfd8dfSPedro Giffuni        return self.server != None
15313cfd8dfSPedro Giffuni    def getCurrentConnectionContext(self):
15413cfd8dfSPedro Giffuni        if dbg:
155a5dab537Smseidel            out.write("PyMailSMTPService getCurrentConnectionContext\n")
15613cfd8dfSPedro Giffuni        return self.connectioncontext
15713cfd8dfSPedro Giffuni    def sendMailMessage(self, xMailMessage):
15813cfd8dfSPedro Giffuni        COMMASPACE = ', '
15913cfd8dfSPedro Giffuni
16013cfd8dfSPedro Giffuni        if dbg:
161a5dab537Smseidel            out.write("PyMailSMTPService sendMailMessage\n")
16213cfd8dfSPedro Giffuni        recipients = xMailMessage.getRecipients()
16313cfd8dfSPedro Giffuni        sendermail = xMailMessage.SenderAddress
16413cfd8dfSPedro Giffuni        sendername = xMailMessage.SenderName
16513cfd8dfSPedro Giffuni        subject = xMailMessage.Subject
16613cfd8dfSPedro Giffuni        ccrecipients = xMailMessage.getCcRecipients()
16713cfd8dfSPedro Giffuni        bccrecipients = xMailMessage.getBccRecipients()
16813cfd8dfSPedro Giffuni        if dbg:
169a5dab537Smseidel            out.write("PyMailSMTPService subject %s\n" % subject)
170a5dab537Smseidel            out.write("PyMailSMTPService from %s\n" % sendername.encode('utf-8'))
171bc42e70bSAriel Constenla-Haile            out.write("PyMailSMTPService from %s\n" % sendermail)
172a5dab537Smseidel            out.write("PyMailSMTPService send to %s\n" % str(recipients))
17313cfd8dfSPedro Giffuni
17413cfd8dfSPedro Giffuni        attachments = xMailMessage.getAttachments()
17513cfd8dfSPedro Giffuni
17613cfd8dfSPedro Giffuni        textmsg = Message()
17713cfd8dfSPedro Giffuni
17813cfd8dfSPedro Giffuni        content = xMailMessage.Body
17913cfd8dfSPedro Giffuni        flavors = content.getTransferDataFlavors()
18013cfd8dfSPedro Giffuni        if dbg:
181a5dab537Smseidel            out.write("PyMailSMTPService flavors len %d\n" % len(flavors))
18213cfd8dfSPedro Giffuni
18313cfd8dfSPedro Giffuni        #Use first flavor that's sane for an email body
18413cfd8dfSPedro Giffuni        for flavor in flavors:
18513cfd8dfSPedro Giffuni            if flavor.MimeType.find('text/html') != -1 or flavor.MimeType.find('text/plain') != -1:
18613cfd8dfSPedro Giffuni                if dbg:
187a5dab537Smseidel                    out.write("PyMailSMTPService mimetype is %s\n" % flavor.MimeType)
18813cfd8dfSPedro Giffuni                textbody = content.getTransferData(flavor)
18913cfd8dfSPedro Giffuni                try:
19013cfd8dfSPedro Giffuni                    textbody = textbody.value
19113cfd8dfSPedro Giffuni                except:
19213cfd8dfSPedro Giffuni                    pass
19313cfd8dfSPedro Giffuni                textbody = textbody.encode('utf-8')
19413cfd8dfSPedro Giffuni
19513cfd8dfSPedro Giffuni                if len(textbody):
19613cfd8dfSPedro Giffuni                    mimeEncoding = re.sub("charset=.*", "charset=UTF-8", flavor.MimeType)
19713cfd8dfSPedro Giffuni                    if mimeEncoding.find('charset=UTF-8') == -1:
19813cfd8dfSPedro Giffuni                        mimeEncoding = mimeEncoding + "; charset=UTF-8"
19913cfd8dfSPedro Giffuni                    textmsg['Content-Type'] = mimeEncoding
20013cfd8dfSPedro Giffuni                    textmsg['MIME-Version'] = '1.0'
20113cfd8dfSPedro Giffuni                    textmsg.set_payload(textbody)
20213cfd8dfSPedro Giffuni
20313cfd8dfSPedro Giffuni                break
20413cfd8dfSPedro Giffuni
20513cfd8dfSPedro Giffuni        if (len(attachments)):
20613cfd8dfSPedro Giffuni            msg = MIMEMultipart()
20713cfd8dfSPedro Giffuni            msg.epilogue = ''
20813cfd8dfSPedro Giffuni            msg.attach(textmsg)
20913cfd8dfSPedro Giffuni        else:
21013cfd8dfSPedro Giffuni            msg = textmsg
21113cfd8dfSPedro Giffuni
21213cfd8dfSPedro Giffuni        hdr = Header(sendername, 'utf-8')
21313cfd8dfSPedro Giffuni        hdr.append('<'+sendermail+'>','us-ascii')
21413cfd8dfSPedro Giffuni        msg['Subject'] = subject
21513cfd8dfSPedro Giffuni        msg['From'] = hdr
21613cfd8dfSPedro Giffuni        msg['To'] = COMMASPACE.join(recipients)
21713cfd8dfSPedro Giffuni        if len(ccrecipients):
21813cfd8dfSPedro Giffuni            msg['Cc'] = COMMASPACE.join(ccrecipients)
21913cfd8dfSPedro Giffuni        if xMailMessage.ReplyToAddress != '':
22013cfd8dfSPedro Giffuni            msg['Reply-To'] = xMailMessage.ReplyToAddress
22113cfd8dfSPedro Giffuni
222a5dab537Smseidel        mailerstring = "OpenOffice via Caolan's mailmerge component"
22313cfd8dfSPedro Giffuni        try:
22413cfd8dfSPedro Giffuni            ctx = uno.getComponentContext()
22513cfd8dfSPedro Giffuni            aConfigProvider = ctx.ServiceManager.createInstance("com.sun.star.configuration.ConfigurationProvider")
22613cfd8dfSPedro Giffuni            prop = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
22713cfd8dfSPedro Giffuni            prop.Name = "nodepath"
22813cfd8dfSPedro Giffuni            prop.Value = "/org.openoffice.Setup/Product"
22913cfd8dfSPedro Giffuni            aSettings = aConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess",
23013cfd8dfSPedro Giffuni                    (prop,))
23113cfd8dfSPedro Giffuni            mailerstring = aSettings.getByName("ooName") + " " + \
23213cfd8dfSPedro Giffuni                    aSettings.getByName("ooSetupVersion") + " via Caolan's mailmerge component"
23313cfd8dfSPedro Giffuni        except:
23413cfd8dfSPedro Giffuni            pass
23513cfd8dfSPedro Giffuni
23613cfd8dfSPedro Giffuni        msg['X-Mailer'] = mailerstring
23713cfd8dfSPedro Giffuni        msg['Date'] = formatdate(localtime=True)
23813cfd8dfSPedro Giffuni
23913cfd8dfSPedro Giffuni        for attachment in attachments:
24013cfd8dfSPedro Giffuni            content = attachment.Data
24113cfd8dfSPedro Giffuni            flavors = content.getTransferDataFlavors()
24213cfd8dfSPedro Giffuni            flavor = flavors[0]
24313cfd8dfSPedro Giffuni            ctype = flavor.MimeType
24413cfd8dfSPedro Giffuni            maintype, subtype = ctype.split('/', 1)
24513cfd8dfSPedro Giffuni            msgattachment = MIMEBase(maintype, subtype)
24613cfd8dfSPedro Giffuni            data = content.getTransferData(flavor)
24713cfd8dfSPedro Giffuni            msgattachment.set_payload(data)
24813cfd8dfSPedro Giffuni            Encoders.encode_base64(msgattachment)
24913cfd8dfSPedro Giffuni            fname = attachment.ReadableName
25013cfd8dfSPedro Giffuni            try:
25113cfd8dfSPedro Giffuni                fname.encode('ascii')
25213cfd8dfSPedro Giffuni            except:
25313cfd8dfSPedro Giffuni                fname = ('utf-8','',fname.encode('utf-8'))
25413cfd8dfSPedro Giffuni            msgattachment.add_header('Content-Disposition', 'attachment', \
25513cfd8dfSPedro Giffuni                    filename=fname)
25613cfd8dfSPedro Giffuni            msg.attach(msgattachment)
25713cfd8dfSPedro Giffuni
25813cfd8dfSPedro Giffuni        uniquer = {}
25913cfd8dfSPedro Giffuni        for key in recipients:
26013cfd8dfSPedro Giffuni            uniquer[key] = True
26113cfd8dfSPedro Giffuni        if len(ccrecipients):
26213cfd8dfSPedro Giffuni            for key in ccrecipients:
26313cfd8dfSPedro Giffuni                uniquer[key] = True
26413cfd8dfSPedro Giffuni        if len(bccrecipients):
26513cfd8dfSPedro Giffuni            for key in bccrecipients:
26613cfd8dfSPedro Giffuni                uniquer[key] = True
2677d9fa7c3SPedro Giffuni        truerecipients = list(uniquer.keys())
26813cfd8dfSPedro Giffuni
26913cfd8dfSPedro Giffuni        if dbg:
270a5dab537Smseidel            out.write("PyMailSMTPService recipients are %s\n" % str(truerecipients))
27113cfd8dfSPedro Giffuni
27213cfd8dfSPedro Giffuni        self.server.sendmail(sendermail, truerecipients, msg.as_string())
273cdf0e10cSrcweir
274cdf0e10cSrcweirclass PyMailIMAPService(unohelper.Base, XMailService):
27513cfd8dfSPedro Giffuni    def __init__( self, ctx ):
27613cfd8dfSPedro Giffuni        self.ctx = ctx
27713cfd8dfSPedro Giffuni        self.listeners = []
27813cfd8dfSPedro Giffuni        self.supportedtypes = ('Insecure', 'Ssl')
27913cfd8dfSPedro Giffuni        self.server = None
28013cfd8dfSPedro Giffuni        self.connectioncontext = None
28113cfd8dfSPedro Giffuni        self.notify = EventObject(self)
28213cfd8dfSPedro Giffuni        if dbg:
283bc42e70bSAriel Constenla-Haile            out.write("PyMailIMAPService init\n")
28413cfd8dfSPedro Giffuni    def addConnectionListener(self, xListener):
28513cfd8dfSPedro Giffuni        if dbg:
286bc42e70bSAriel Constenla-Haile            out.write("PyMailIMAPService addConnectionListener\n")
28713cfd8dfSPedro Giffuni        self.listeners.append(xListener)
28813cfd8dfSPedro Giffuni    def removeConnectionListener(self, xListener):
28913cfd8dfSPedro Giffuni        if dbg:
290bc42e70bSAriel Constenla-Haile            out.write("PyMailIMAPService removeConnectionListener\n")
29113cfd8dfSPedro Giffuni        self.listeners.remove(xListener)
29213cfd8dfSPedro Giffuni    def getSupportedConnectionTypes(self):
29313cfd8dfSPedro Giffuni        if dbg:
294bc42e70bSAriel Constenla-Haile            out.write("PyMailIMAPService getSupportedConnectionTypes\n")
29513cfd8dfSPedro Giffuni        return self.supportedtypes
29613cfd8dfSPedro Giffuni    def connect(self, xConnectionContext, xAuthenticator):
29713cfd8dfSPedro Giffuni        if dbg:
298bc42e70bSAriel Constenla-Haile            out.write("PyMailIMAPService connect\n")
29913cfd8dfSPedro Giffuni
30013cfd8dfSPedro Giffuni        self.connectioncontext = xConnectionContext
30113cfd8dfSPedro Giffuni        server = xConnectionContext.getValueByName("ServerName")
30213cfd8dfSPedro Giffuni        if dbg:
303bc42e70bSAriel Constenla-Haile            out.write("Server: %s\n" % server)
30413cfd8dfSPedro Giffuni        port = xConnectionContext.getValueByName("Port")
30513cfd8dfSPedro Giffuni        if dbg:
306bc42e70bSAriel Constenla-Haile            out.write("Port: %d\n" % port)
30713cfd8dfSPedro Giffuni        connectiontype = xConnectionContext.getValueByName("ConnectionType")
30813cfd8dfSPedro Giffuni        if dbg:
309bc42e70bSAriel Constenla-Haile            out.write("Connection type: %s\n" % connectiontype)
310bc42e70bSAriel Constenla-Haile        out.write("BEFORE\n")
31113cfd8dfSPedro Giffuni        if connectiontype.upper() == 'SSL':
31213cfd8dfSPedro Giffuni            self.server = imaplib.IMAP4_SSL(server, port)
31313cfd8dfSPedro Giffuni        else:
31413cfd8dfSPedro Giffuni            self.server = imaplib.IMAP4(server, port)
315bc42e70bSAriel Constenla-Haile        out.write("AFTER\n")
31613cfd8dfSPedro Giffuni
31713cfd8dfSPedro Giffuni        user = xAuthenticator.getUserName().encode('ascii')
31813cfd8dfSPedro Giffuni        password = xAuthenticator.getPassword().encode('ascii')
31913cfd8dfSPedro Giffuni        if user != '':
32013cfd8dfSPedro Giffuni            if dbg:
321bc42e70bSAriel Constenla-Haile                out.write('Logging in, username of %s\n' % user)
32213cfd8dfSPedro Giffuni            self.server.login(user, password)
32313cfd8dfSPedro Giffuni
32413cfd8dfSPedro Giffuni        for listener in self.listeners:
32513cfd8dfSPedro Giffuni            listener.connected(self.notify)
32613cfd8dfSPedro Giffuni    def disconnect(self):
32713cfd8dfSPedro Giffuni        if dbg:
328bc42e70bSAriel Constenla-Haile            out.write("PyMailIMAPService disconnect\n")
32913cfd8dfSPedro Giffuni        if self.server:
33013cfd8dfSPedro Giffuni            self.server.logout()
33113cfd8dfSPedro Giffuni            self.server = None
33213cfd8dfSPedro Giffuni        for listener in self.listeners:
33313cfd8dfSPedro Giffuni            listener.disconnected(self.notify)
33413cfd8dfSPedro Giffuni    def isConnected(self):
33513cfd8dfSPedro Giffuni        if dbg:
336bc42e70bSAriel Constenla-Haile            out.write("PyMailIMAPService isConnected\n")
33713cfd8dfSPedro Giffuni        return self.server != None
33813cfd8dfSPedro Giffuni    def getCurrentConnectionContext(self):
33913cfd8dfSPedro Giffuni        if dbg:
340bc42e70bSAriel Constenla-Haile            out.write("PyMailIMAPService getCurrentConnectionContext\n")
34113cfd8dfSPedro Giffuni        return self.connectioncontext
342cdf0e10cSrcweir
343cdf0e10cSrcweirclass PyMailPOP3Service(unohelper.Base, XMailService):
34413cfd8dfSPedro Giffuni    def __init__( self, ctx ):
34513cfd8dfSPedro Giffuni        self.ctx = ctx
34613cfd8dfSPedro Giffuni        self.listeners = []
34713cfd8dfSPedro Giffuni        self.supportedtypes = ('Insecure', 'Ssl')
34813cfd8dfSPedro Giffuni        self.server = None
34913cfd8dfSPedro Giffuni        self.connectioncontext = None
35013cfd8dfSPedro Giffuni        self.notify = EventObject(self)
35113cfd8dfSPedro Giffuni        if dbg:
352bc42e70bSAriel Constenla-Haile            out.write("PyMailPOP3Service init\n")
35313cfd8dfSPedro Giffuni    def addConnectionListener(self, xListener):
35413cfd8dfSPedro Giffuni        if dbg:
355bc42e70bSAriel Constenla-Haile            out.write("PyMailPOP3Service addConnectionListener\n")
35613cfd8dfSPedro Giffuni        self.listeners.append(xListener)
35713cfd8dfSPedro Giffuni    def removeConnectionListener(self, xListener):
35813cfd8dfSPedro Giffuni        if dbg:
359bc42e70bSAriel Constenla-Haile            out.write("PyMailPOP3Service removeConnectionListener\n")
36013cfd8dfSPedro Giffuni        self.listeners.remove(xListener)
36113cfd8dfSPedro Giffuni    def getSupportedConnectionTypes(self):
36213cfd8dfSPedro Giffuni        if dbg:
363bc42e70bSAriel Constenla-Haile            out.write("PyMailPOP3Service getSupportedConnectionTypes\n")
36413cfd8dfSPedro Giffuni        return self.supportedtypes
36513cfd8dfSPedro Giffuni    def connect(self, xConnectionContext, xAuthenticator):
36613cfd8dfSPedro Giffuni        if dbg:
367bc42e70bSAriel Constenla-Haile            out.write("PyMailPOP3Service connect\n")
36813cfd8dfSPedro Giffuni
36913cfd8dfSPedro Giffuni        self.connectioncontext = xConnectionContext
37013cfd8dfSPedro Giffuni        server = xConnectionContext.getValueByName("ServerName")
37113cfd8dfSPedro Giffuni        if dbg:
372bc42e70bSAriel Constenla-Haile            out.write("Server: %s\n" % server)
37313cfd8dfSPedro Giffuni        port = xConnectionContext.getValueByName("Port")
37413cfd8dfSPedro Giffuni        if dbg:
375bc42e70bSAriel Constenla-Haile            out.write("Port: %s\n" % port)
37613cfd8dfSPedro Giffuni        connectiontype = xConnectionContext.getValueByName("ConnectionType")
37713cfd8dfSPedro Giffuni        if dbg:
378bc42e70bSAriel Constenla-Haile            out.write("Connection type: %s\n" % str(connectiontype))
379bc42e70bSAriel Constenla-Haile        out.write("BEFORE\n")
38013cfd8dfSPedro Giffuni        if connectiontype.upper() == 'SSL':
38113cfd8dfSPedro Giffuni            self.server = poplib.POP3_SSL(server, port)
38213cfd8dfSPedro Giffuni        else:
38313cfd8dfSPedro Giffuni            tout = xConnectionContext.getValueByName("Timeout")
38413cfd8dfSPedro Giffuni            if dbg:
385bc42e70bSAriel Constenla-Haile                out.write("Timeout is instance of int? %s\n" % isinstance(tout,int))
38613cfd8dfSPedro Giffuni            if not isinstance(tout,int):
38713cfd8dfSPedro Giffuni                tout = _GLOBAL_DEFAULT_TIMEOUT
38813cfd8dfSPedro Giffuni            if dbg:
389bc42e70bSAriel Constenla-Haile                out.write("Timeout: %s\n" % str(tout))
39013cfd8dfSPedro Giffuni            self.server = poplib.POP3(server, port, timeout=tout)
391bc42e70bSAriel Constenla-Haile        out.write("AFTER\n")
39213cfd8dfSPedro Giffuni
39313cfd8dfSPedro Giffuni        user = xAuthenticator.getUserName().encode('ascii')
39413cfd8dfSPedro Giffuni        password = xAuthenticator.getPassword().encode('ascii')
39513cfd8dfSPedro Giffuni        if dbg:
396bc42e70bSAriel Constenla-Haile            out.write('Logging in, username of %s\n' % user)
39713cfd8dfSPedro Giffuni        self.server.user(user)
39813cfd8dfSPedro Giffuni        self.server.pass_(password)
39913cfd8dfSPedro Giffuni
40013cfd8dfSPedro Giffuni        for listener in self.listeners:
40113cfd8dfSPedro Giffuni            listener.connected(self.notify)
40213cfd8dfSPedro Giffuni    def disconnect(self):
40313cfd8dfSPedro Giffuni        if dbg:
404bc42e70bSAriel Constenla-Haile            out.write("PyMailPOP3Service disconnect\n")
40513cfd8dfSPedro Giffuni        if self.server:
40613cfd8dfSPedro Giffuni            self.server.quit()
40713cfd8dfSPedro Giffuni            self.server = None
40813cfd8dfSPedro Giffuni        for listener in self.listeners:
40913cfd8dfSPedro Giffuni            listener.disconnected(self.notify)
41013cfd8dfSPedro Giffuni    def isConnected(self):
41113cfd8dfSPedro Giffuni        if dbg:
412bc42e70bSAriel Constenla-Haile            out.write("PyMailPOP3Service isConnected\n")
41313cfd8dfSPedro Giffuni        return self.server != None
41413cfd8dfSPedro Giffuni    def getCurrentConnectionContext(self):
41513cfd8dfSPedro Giffuni        if dbg:
416bc42e70bSAriel Constenla-Haile            out.write("PyMailPOP3Service getCurrentConnectionContext\n")
41713cfd8dfSPedro Giffuni        return self.connectioncontext
418cdf0e10cSrcweir
419cdf0e10cSrcweirclass PyMailServiceProvider(unohelper.Base, XMailServiceProvider):
42013cfd8dfSPedro Giffuni    def __init__( self, ctx ):
42113cfd8dfSPedro Giffuni        if dbg:
422bc42e70bSAriel Constenla-Haile            out.write("PyMailServiceProvider init\n")
42313cfd8dfSPedro Giffuni        self.ctx = ctx
42413cfd8dfSPedro Giffuni    def create(self, aType):
42513cfd8dfSPedro Giffuni        if dbg:
426bc42e70bSAriel Constenla-Haile            out.write("PyMailServiceProvider create with %s\n" % aType)
42713cfd8dfSPedro Giffuni        if aType == SMTP:
42813cfd8dfSPedro Giffuni            return PyMailSMTPService(self.ctx);
42913cfd8dfSPedro Giffuni        elif aType == POP3:
43013cfd8dfSPedro Giffuni            return PyMailPOP3Service(self.ctx);
43113cfd8dfSPedro Giffuni        elif aType == IMAP:
43213cfd8dfSPedro Giffuni            return PyMailIMAPService(self.ctx);
43313cfd8dfSPedro Giffuni        else:
434bc42e70bSAriel Constenla-Haile            out.write("PyMailServiceProvider, unknown TYPE %s\n" % aType)
435cdf0e10cSrcweir
436cdf0e10cSrcweirclass PyMailMessage(unohelper.Base, XMailMessage):
43713cfd8dfSPedro Giffuni    def __init__( self, ctx, sTo='', sFrom='', Subject='', Body=None, aMailAttachment=None ):
43813cfd8dfSPedro Giffuni        if dbg:
439bc42e70bSAriel Constenla-Haile            out.write("PyMailMessage init\n")
44013cfd8dfSPedro Giffuni        self.ctx = ctx
44113cfd8dfSPedro Giffuni
44213cfd8dfSPedro Giffuni        self.recipients = [sTo]
44313cfd8dfSPedro Giffuni        self.ccrecipients = []
44413cfd8dfSPedro Giffuni        self.bccrecipients = []
44513cfd8dfSPedro Giffuni        self.aMailAttachments = []
44613cfd8dfSPedro Giffuni        if aMailAttachment != None:
44713cfd8dfSPedro Giffuni            self.aMailAttachments.append(aMailAttachment)
44813cfd8dfSPedro Giffuni
44913cfd8dfSPedro Giffuni        self.SenderName, self.SenderAddress = parseaddr(sFrom)
45013cfd8dfSPedro Giffuni        self.ReplyToAddress = sFrom
45113cfd8dfSPedro Giffuni        self.Subject = Subject
45213cfd8dfSPedro Giffuni        self.Body = Body
45313cfd8dfSPedro Giffuni        if dbg:
454bc42e70bSAriel Constenla-Haile            out.write("post PyMailMessage init\n")
45513cfd8dfSPedro Giffuni    def addRecipient( self, recipient ):
45613cfd8dfSPedro Giffuni        if dbg:
457bc42e70bSAriel Constenla-Haile            out.write("PyMailMessage.addRecipient%s\n" % recipient)
45813cfd8dfSPedro Giffuni        self.recipients.append(recipient)
45913cfd8dfSPedro Giffuni    def addCcRecipient( self, ccrecipient ):
46013cfd8dfSPedro Giffuni        if dbg:
461bc42e70bSAriel Constenla-Haile            out.write("PyMailMessage.addCcRecipient%s\n" % ccrecipient)
46213cfd8dfSPedro Giffuni        self.ccrecipients.append(ccrecipient)
46313cfd8dfSPedro Giffuni    def addBccRecipient( self, bccrecipient ):
46413cfd8dfSPedro Giffuni        if dbg:
465bc42e70bSAriel Constenla-Haile            out.write("PyMailMessage.addBccRecipient%s\n" % bccrecipient)
46613cfd8dfSPedro Giffuni        self.bccrecipients.append(bccrecipient)
46713cfd8dfSPedro Giffuni    def getRecipients( self ):
46813cfd8dfSPedro Giffuni        if dbg:
469bc42e70bSAriel Constenla-Haile            out.write("PyMailMessage.getRecipients%s\n" % self.recipients)
47013cfd8dfSPedro Giffuni        return tuple(self.recipients)
47113cfd8dfSPedro Giffuni    def getCcRecipients( self ):
47213cfd8dfSPedro Giffuni        if dbg:
473bc42e70bSAriel Constenla-Haile            out.write("PyMailMessage.getCcRecipients%s\n" % self.ccrecipients)
47413cfd8dfSPedro Giffuni        return tuple(self.ccrecipients)
47513cfd8dfSPedro Giffuni    def getBccRecipients( self ):
47613cfd8dfSPedro Giffuni        if dbg:
477bc42e70bSAriel Constenla-Haile            out.write("PyMailMessage.getBccRecipients%s\n" % self.bccrecipients)
47813cfd8dfSPedro Giffuni        return tuple(self.bccrecipients)
47913cfd8dfSPedro Giffuni    def addAttachment( self, aMailAttachment ):
48013cfd8dfSPedro Giffuni        if dbg:
481bc42e70bSAriel Constenla-Haile            out.write("PyMailMessage.addAttachment\n")
48213cfd8dfSPedro Giffuni        self.aMailAttachments.append(aMailAttachment)
48313cfd8dfSPedro Giffuni    def getAttachments( self ):
48413cfd8dfSPedro Giffuni        if dbg:
485bc42e70bSAriel Constenla-Haile            out.write("PyMailMessage.getAttachments\n")
48613cfd8dfSPedro Giffuni        return tuple(self.aMailAttachments)
487bb7facceSAriel Constenla-Haile
488cdf0e10cSrcweir
489cdf0e10cSrcweir# pythonloader looks for a static g_ImplementationHelper variable
490cdf0e10cSrcweirg_ImplementationHelper = unohelper.ImplementationHelper()
491cdf0e10cSrcweirg_ImplementationHelper.addImplementation( \
49213cfd8dfSPedro Giffuni        PyMailServiceProvider, "org.openoffice.pyuno.MailServiceProvider",
49313cfd8dfSPedro Giffuni                ("com.sun.star.mail.MailServiceProvider",),)
494cdf0e10cSrcweirg_ImplementationHelper.addImplementation( \
49513cfd8dfSPedro Giffuni        PyMailMessage, "org.openoffice.pyuno.MailMessage",
49613cfd8dfSPedro Giffuni                ("com.sun.star.mail.MailMessage",),)
497