19f22d7c2SAndrew Rist# ************************************************************* 24861d9f0Smseidel# 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 104861d9f0Smseidel# 119f22d7c2SAndrew Rist# http://www.apache.org/licenses/LICENSE-2.0 124861d9f0Smseidel# 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. 194861d9f0Smseidel# 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: 804861d9f0Smseidel out.write("PyMailSMTPService init\n") 8113cfd8dfSPedro Giffuni def addConnectionListener(self, xListener): 8213cfd8dfSPedro Giffuni if dbg: 834861d9f0Smseidel out.write("PyMailSMTPService addConnectionListener\n") 8413cfd8dfSPedro Giffuni self.listeners.append(xListener) 8513cfd8dfSPedro Giffuni def removeConnectionListener(self, xListener): 8613cfd8dfSPedro Giffuni if dbg: 874861d9f0Smseidel out.write("PyMailSMTPService removeConnectionListener\n") 8813cfd8dfSPedro Giffuni self.listeners.remove(xListener) 8913cfd8dfSPedro Giffuni def getSupportedConnectionTypes(self): 9013cfd8dfSPedro Giffuni if dbg: 914861d9f0Smseidel 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: 964861d9f0Smseidel 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*4ec7525eSBidouille connectiontype = xConnectionContext.getValueByName("ConnectionType") 115*4ec7525eSBidouille if connectiontype.upper() == "SSL": 116*4ec7525eSBidouille if not hasattr(smtplib, "SMTP_SSL"): 117*4ec7525eSBidouille raise IllegalArgumentException("Connection type is not supported: " + connectiontype, self, 1) 118*4ec7525eSBidouille self.server = smtplib.SMTP_SSL(server, port, timeout=tout) 119*4ec7525eSBidouille else: 120*4ec7525eSBidouille self.server = smtplib.SMTP(server, port,timeout=tout) 12113cfd8dfSPedro Giffuni if dbg: 12213cfd8dfSPedro Giffuni self.server.set_debuglevel(1) 123*4ec7525eSBidouille 12413cfd8dfSPedro Giffuni if dbg: 125bc42e70bSAriel Constenla-Haile out.write("ConnectionType: %s\n" % str(connectiontype)) 12613cfd8dfSPedro Giffuni 127*4ec7525eSBidouille 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: 1434861d9f0Smseidel 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: 1514861d9f0Smseidel out.write("PyMailSMTPService isConnected\n") 15213cfd8dfSPedro Giffuni return self.server != None 15313cfd8dfSPedro Giffuni def getCurrentConnectionContext(self): 15413cfd8dfSPedro Giffuni if dbg: 1554861d9f0Smseidel 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: 1614861d9f0Smseidel 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: 1694861d9f0Smseidel out.write("PyMailSMTPService subject %s\n" % subject) 1704861d9f0Smseidel out.write("PyMailSMTPService from %s\n" % sendername.encode('utf-8')) 171bc42e70bSAriel Constenla-Haile out.write("PyMailSMTPService from %s\n" % sendermail) 1724861d9f0Smseidel 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: 1814861d9f0Smseidel 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: 1874861d9f0Smseidel 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 2224861d9f0Smseidel 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: 2704861d9f0Smseidel 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