scripting/source/pyprov/mailmerge.README |   18 +++
 scripting/source/pyprov/mailmerge.py     |  154 ++++++++++++++++++-------------
 2 files changed, 110 insertions(+), 62 deletions(-)

New commits:
commit f1396430d6b075a7ce2eade9629e69297b814ea2
Author: Caolán McNamara <[email protected]>
Date:   Mon Jan 16 18:50:50 2012 +0000

    make emailmerge work with python3 and python2 at the same time
    
    squashed single 4-0 backport commit to sync 4-0 mailmerge.py
    with that of current master to get a mailmerge.py that works
    with python3 and python2, and successfully
    
    a) sends utf-8 plain text
    b) html
    c) odt, pdf, doc attachments
    
    (cherry picked from commit c25bee9ca3c3015c46c8fcb28654e5bed8a4d912)
    
    i118736 - i118787 : fix XMailMessage implementation in mailmerge.py
    
    (cherry picked from commit 4166969f3b8ed05e91c10a724ce7bd39074012a1)
    
    (cherry picked from commit 3f2f92b753474883b5cd97aff3e00ac55fd23f3f)
    
    i118791 - Encode ReadableName in UTF-8 only when necessary
    
    (cherry picked from commit a5cefd4007be4789f550ee559aa832ddb04c2dc3)
    
    i118814 - Allow set connection timeout in Mail API
    
    (cherry picked from commit 8a324a3ba599bee03311e5f6ba6e1c83edc1e343)
    
    make emailmerge work for me with python3
    
    (cherry picked from commit e48a060eb80b76c943e7dbd815b63429905a14b6)
    
    Change-Id: I6289b522513a2fc86e261c85a04ca9c89fd55b63
    Reviewed-on: https://gerrit.libreoffice.org/1713
    Reviewed-by: Michael Stahl <[email protected]>
    Tested-by: Michael Stahl <[email protected]>

diff --git a/scripting/source/pyprov/mailmerge.README 
b/scripting/source/pyprov/mailmerge.README
new file mode 100644
index 0000000..6b4fb5b
--- /dev/null
+++ b/scripting/source/pyprov/mailmerge.README
@@ -0,0 +1,18 @@
+Easiest way I find to test this is to...
+
+1)
+
+a) install fakemail and run it
+b) tools->options->writer->mail merge email
+c) localhost 8025
+
+2)
+
+a) type some text into writer that will exercise utf-8, e.g. "Caolán's test"
+b) tools->mail merge wizard->next->email message->select address book
+c) create, add one user with your own email address, ok
+d) next, next, text, send merged document as email
+e) and test all of plain text, html and the various attachment options
+
+fake mail will dump the mail it gets into its pwd, if all that works, you can
+then try with your own normal mail server.
diff --git a/scripting/source/pyprov/mailmerge.py 
b/scripting/source/pyprov/mailmerge.py
index c606143..18b476c 100755
--- a/scripting/source/pyprov/mailmerge.py
+++ b/scripting/source/pyprov/mailmerge.py
@@ -11,6 +11,8 @@
 #   <value>true</value>
 #  </prop>
 
+from __future__ import print_function
+
 import unohelper
 import uno
 import re
@@ -36,11 +38,14 @@ from com.sun.star.mail import SendMailMessageFailedException
 
 from email.mime.base import MIMEBase
 from email.message import Message
+from email.charset import Charset
+from email.charset import QP
 from email.encoders import encode_base64
 from email.header import Header
 from email.mime.multipart import MIMEMultipart
 from email.utils import formatdate
 from email.utils import parseaddr
+from socket import _GLOBAL_DEFAULT_TIMEOUT
 
 import sys, smtplib, imaplib, poplib
 dbg = False
@@ -59,42 +64,51 @@ class PyMailSMTPService(unohelper.Base, XSmtpService):
                self.supportedtypes = ('Insecure', 'Ssl')
                self.server = None
                self.connectioncontext = None
-               self.notify = EventObject()
+               self.notify = EventObject(self)
                if dbg:
-                       print("PyMailSMPTService init", file=dbgout)
+                       print("PyMailSMTPService init", file=dbgout)
        def addConnectionListener(self, xListener):
                if dbg:
-                       print("PyMailSMPTService addConnectionListener", 
file=dbgout)
+                       print("PyMailSMTPService addConnectionListener", 
file=dbgout)
                self.listeners.append(xListener)
        def removeConnectionListener(self, xListener):
                if dbg:
-                       print("PyMailSMPTService removeConnectionListener", 
file=dbgout)
+                       print("PyMailSMTPService removeConnectionListener", 
file=dbgout)
                self.listeners.remove(xListener)
        def getSupportedConnectionTypes(self):
                if dbg:
-                       print("PyMailSMPTService getSupportedConnectionTypes", 
file=dbgout)
+                       print("PyMailSMTPService getSupportedConnectionTypes", 
file=dbgout)
                return self.supportedtypes
        def connect(self, xConnectionContext, xAuthenticator):
                self.connectioncontext = xConnectionContext
                if dbg:
-                       print("PyMailSMPTService connect", file=dbgout)
+                       print("PyMailSMTPService connect", file=dbgout)
                server = xConnectionContext.getValueByName("ServerName")
                if dbg:
-                       print(server, file=dbgout)
+                       print("ServerName: " + server, file=dbgout)
                port = int(xConnectionContext.getValueByName("Port"))
                if dbg:
-                       print(port, file=dbgout)
-               self.server = smtplib.SMTP(server, port)
+                       print("Port: " + str(port), file=dbgout)
+               tout = xConnectionContext.getValueByName("Timeout")
+               if dbg:
+                       print(isinstance(tout,int), file=dbgout)
+               if not isinstance(tout,int):
+                       tout = _GLOBAL_DEFAULT_TIMEOUT
+               if dbg:
+                       print("Timeout: " + str(tout), file=dbgout)
+               self.server = smtplib.SMTP(server, port,timeout=tout)
+
                #stderr not available for us under windows, but
                #set_debuglevel outputs there, and so throw
                #an exception under windows on debugging mode
                #with this enabled
                if dbg and os.name != 'nt':
                        self.server.set_debuglevel(1)
+
                connectiontype = 
xConnectionContext.getValueByName("ConnectionType")
                if dbg:
-                       print(connectiontype, file=dbgout)
-               if connectiontype == 'Ssl':
+                       print("ConnectionType: " + connectiontype, file=dbgout)
+               if connectiontype.upper() == 'SSL':
                        self.server.ehlo()
                        self.server.starttls()
                        self.server.ehlo()
@@ -106,14 +120,14 @@ class PyMailSMTPService(unohelper.Base, XSmtpService):
                                user = user.encode('ascii')
                                password = password.encode('ascii')
                        if dbg:
-                               print("Logging in, username of" + user, 
file=dbgout)
+                               print("Logging in, username of: " + user, 
file=dbgout)
                        self.server.login(user, password)
 
                for listener in self.listeners:
                        listener.connected(self.notify)
        def disconnect(self):
                if dbg:
-                       print("PyMailSMPTService disconnect", file=dbgout)
+                       print("PyMailSMTPService disconnect", file=dbgout)
                if self.server:
                        self.server.quit()
                        self.server = None
@@ -121,17 +135,17 @@ class PyMailSMTPService(unohelper.Base, XSmtpService):
                        listener.disconnected(self.notify)
        def isConnected(self):
                if dbg:
-                       print("PyMailSMPTService isConnected", file=dbgout)
+                       print("PyMailSMTPService isConnected", file=dbgout)
                return self.server != None
        def getCurrentConnectionContext(self):
                if dbg:
-                       print("PyMailSMPTService getCurrentConnectionContext", 
file=dbgout)
+                       print("PyMailSMTPService getCurrentConnectionContext", 
file=dbgout)
                return self.connectioncontext
        def sendMailMessage(self, xMailMessage):
                COMMASPACE = ', '
 
                if dbg:
-                       print("PyMailSMPTService sendMailMessage", file=dbgout)
+                       print("PyMailSMTPService sendMailMessage", file=dbgout)
                recipients = xMailMessage.getRecipients()
                sendermail = xMailMessage.SenderAddress
                sendername = xMailMessage.SenderName
@@ -139,10 +153,10 @@ class PyMailSMTPService(unohelper.Base, XSmtpService):
                ccrecipients = xMailMessage.getCcRecipients()
                bccrecipients = xMailMessage.getBccRecipients()
                if dbg:
-                       print("PyMailSMPTService subject " + subject, 
file=dbgout)
-                       print("PyMailSMPTService from " + 
sendername.encode('utf-8'), file=dbgout)
-                       print("PyMailSMTPService from " + sendermail, 
file=dbgout)
-                       print("PyMailSMPTService send to " + recipients, 
file=dbgout)
+                       print("PyMailSMTPService subject: " + subject, 
file=dbgout)
+                       print("PyMailSMTPService from:  " + sendername, 
file=dbgout)
+                       print("PyMailSMTPService from:  " + sendermail, 
file=dbgout)
+                       print("PyMailSMTPService send to: %s" % (recipients,), 
file=dbgout)
 
                attachments = xMailMessage.getAttachments()
 
@@ -151,19 +165,14 @@ class PyMailSMTPService(unohelper.Base, XSmtpService):
                content = xMailMessage.Body
                flavors = content.getTransferDataFlavors()
                if dbg:
-                       print("PyMailSMPTService flavors len " + len(flavors), 
file=dbgout)
+                       print("PyMailSMTPService flavors len: %d" % 
(len(flavors),), file=dbgout)
 
                #Use first flavor that's sane for an email body
                for flavor in flavors:
                        if flavor.MimeType.find('text/html') != -1 or 
flavor.MimeType.find('text/plain') != -1:
                                if dbg:
-                                       print("PyMailSMPTService mimetype is " 
+ flavor.MimeType, file=dbgout)
+                                       print("PyMailSMTPService mimetype is: " 
+ flavor.MimeType, file=dbgout)
                                textbody = content.getTransferData(flavor)
-                               try:
-                                       textbody = textbody.value
-                               except:
-                                       pass
-                               textbody = textbody.encode('utf-8')
 
                                if len(textbody):
                                        mimeEncoding = re.sub("charset=.*", 
"charset=UTF-8", flavor.MimeType)
@@ -171,7 +180,16 @@ class PyMailSMTPService(unohelper.Base, XSmtpService):
                                                mimeEncoding = mimeEncoding + 
"; charset=UTF-8"
                                        textmsg['Content-Type'] = mimeEncoding
                                        textmsg['MIME-Version'] = '1.0'
-                                       textmsg.set_payload(textbody)
+
+                                       textbody = textbody.encode('utf-8')
+                                       if sys.version >= '3':
+                                               
#http://stackoverflow.com/questions/9403265/how-do-i-use-python-3-2-email-module-to-send-unicode-messages-encoded-in-utf-8-w
+                                               textbody = 
textbody.decode('iso8859-1')
+                                               c = Charset('utf-8')
+                                               c.body_encoding = QP
+                                               textmsg.set_payload(textbody, c)
+                                       else:
+                                               textmsg.set_payload(textbody)
 
                                break
 
@@ -194,7 +212,7 @@ class PyMailSMTPService(unohelper.Base, XSmtpService):
 
                mailerstring = "LibreOffice via Caolan's mailmerge component"
                try:
-                       ctx = uno.getComponentContext() 
+                       ctx = uno.getComponentContext()
                        aConfigProvider = 
ctx.ServiceManager.createInstance("com.sun.star.configuration.ConfigurationProvider")
                        prop = 
uno.createUnoStruct('com.sun.star.beans.PropertyValue')
                        prop.Name = "nodepath"
@@ -205,7 +223,7 @@ class PyMailSMTPService(unohelper.Base, XSmtpService):
                                aSettings.getByName("ooSetupVersion") + " via 
Caolan's mailmerge component"
                except:
                        pass
-               
+
                msg['X-Mailer'] = mailerstring
                msg['Date'] = formatdate(localtime=True)
 
@@ -217,10 +235,15 @@ class PyMailSMTPService(unohelper.Base, XSmtpService):
                        maintype, subtype = ctype.split('/', 1)
                        msgattachment = MIMEBase(maintype, subtype)
                        data = content.getTransferData(flavor)
-                       msgattachment.set_payload(data)
+                       msgattachment.set_payload(data.value)
                        encode_base64(msgattachment)
+                       fname = attachment.ReadableName
+                       try:
+                               fname.encode('ascii')
+                       except:
+                               fname = ('utf-8','',fname.encode('utf-8'))
                        msgattachment.add_header('Content-Disposition', 
'attachment', \
-                               filename=attachment.ReadableName)
+                               filename=fname)
                        msg.attach(msgattachment)
 
                uniquer = {}
@@ -235,7 +258,7 @@ class PyMailSMTPService(unohelper.Base, XSmtpService):
                truerecipients = uniquer.keys()
 
                if dbg:
-                       print("PyMailSMPTService recipients are " + 
truerecipients, file=dbgout)
+                       print(("PyMailSMTPService recipients are: ", 
truerecipients), file=dbgout)
 
                self.server.sendmail(sendermail, truerecipients, 
msg.as_string())
 
@@ -246,7 +269,7 @@ class PyMailIMAPService(unohelper.Base, XMailService):
                self.supportedtypes = ('Insecure', 'Ssl')
                self.server = None
                self.connectioncontext = None
-               self.notify = EventObject()
+               self.notify = EventObject(self)
                if dbg:
                        print("PyMailIMAPService init", file=dbgout)
        def addConnectionListener(self, xListener):
@@ -276,12 +299,12 @@ class PyMailIMAPService(unohelper.Base, XMailService):
                if dbg:
                        print(connectiontype, file=dbgout)
                print("BEFORE", file=dbgout)
-               if connectiontype == 'Ssl':
+               if connectiontype.upper() == 'SSL':
                        self.server = imaplib.IMAP4_SSL(server, port)
                else:
                        self.server = imaplib.IMAP4(server, port)
                print("AFTER", file=dbgout)
-                       
+
                user = xAuthenticator.getUserName()
                password = xAuthenticator.getPassword()
                if user != '':
@@ -289,7 +312,7 @@ class PyMailIMAPService(unohelper.Base, XMailService):
                                user = user.encode('ascii')
                                password = password.encode('ascii')
                        if dbg:
-                               print("Logging in, username of" + user, 
file=dbgout)
+                               print("Logging in, username of: " + user, 
file=dbgout)
                        self.server.login(user, password)
 
                for listener in self.listeners:
@@ -318,7 +341,7 @@ class PyMailPOP3Service(unohelper.Base, XMailService):
                self.supportedtypes = ('Insecure', 'Ssl')
                self.server = None
                self.connectioncontext = None
-               self.notify = EventObject()
+               self.notify = EventObject(self)
                if dbg:
                        print("PyMailPOP3Service init", file=dbgout)
        def addConnectionListener(self, xListener):
@@ -348,10 +371,17 @@ class PyMailPOP3Service(unohelper.Base, XMailService):
                if dbg:
                        print(connectiontype, file=dbgout)
                print("BEFORE", file=dbgout)
-               if connectiontype == 'Ssl':
+               if connectiontype.upper() == 'SSL':
                        self.server = poplib.POP3_SSL(server, port)
                else:
-                       self.server = poplib.POP3(server, port)
+                       tout = xConnectionContext.getValueByName("Timeout")
+                       if dbg:
+                               print(isinstance(tout,int), file=dbgout)
+                       if not isinstance(tout,int):
+                               tout = _GLOBAL_DEFAULT_TIMEOUT
+                       if dbg:
+                               print("Timeout: " + str(tout), file=dbgout)
+                       self.server = poplib.POP3(server, port, timeout=tout)
                print("AFTER", file=dbgout)
                        
                user = xAuthenticator.getUserName()
@@ -360,9 +390,9 @@ class PyMailPOP3Service(unohelper.Base, XMailService):
                        user = user.encode('ascii')
                        password = password.encode('ascii')
                if dbg:
-                       print("Logging in, username of" + user, file=dbgout)
+                       print("Logging in, username of: " + user, file=dbgout)
                self.server.user(user)
-               self.server.pass_(user, password)
+               self.server.pass_(password)
 
                for listener in self.listeners:
                        listener.connected(self.notify)
@@ -390,7 +420,7 @@ class PyMailServiceProvider(unohelper.Base, 
XMailServiceProvider):
                self.ctx = ctx
        def create(self, aType):
                if dbg:
-                       print("PyMailServiceProvider create with " + aType, 
file=dbgout)
+                       print("PyMailServiceProvider create with", aType, 
file=dbgout)
                if aType == SMTP:
                        return PyMailSMTPService(self.ctx);
                elif aType == POP3:
@@ -406,12 +436,12 @@ class PyMailMessage(unohelper.Base, XMailMessage):
                        print("PyMailMessage init", file=dbgout)
                self.ctx = ctx
 
-               self.recipients = (sTo,)
-               self.ccrecipients = ()
-               self.bccrecipients = ()
-               self.aMailAttachments = ()
+               self.recipients = [sTo]
+               self.ccrecipients = []
+               self.bccrecipients = []
+               self.aMailAttachments = []
                if aMailAttachment != None:
-                       self.aMailAttachments = (aMailAttachment,)
+                       self.aMailAttachments.append(aMailAttachment)
 
                self.SenderName, self.SenderAddress = parseaddr(sFrom)
                self.ReplyToAddress = sFrom
@@ -421,36 +451,36 @@ class PyMailMessage(unohelper.Base, XMailMessage):
                        print("post PyMailMessage init", file=dbgout)
        def addRecipient( self, recipient ):
                if dbg:
-                       print("PyMailMessage.addRecipient " + recipient, 
file=dbgout)
-               self.recipients = self.recipients + (recipient,)
+                       print("PyMailMessage.addRecipient: " + recipient, 
file=dbgout)
+               self.recipients.append(recipient)
        def addCcRecipient( self, ccrecipient ):
                if dbg:
-                       print("PyMailMessage.addCcRecipient " + ccrecipient, 
file=dbgout)
-               self.ccrecipients = self.ccrecipients + (ccrecipient,)
+                       print("PyMailMessage.addCcRecipient: " + ccrecipient, 
file=dbgout)
+               self.ccrecipients.append(ccrecipient)
        def addBccRecipient( self, bccrecipient ):
                if dbg:
-                       print("PyMailMessage.addBccRecipient " + bccrecipient, 
file=dbgout)
-               self.bccrecipients = self.bccrecipients + (bccrecipient,)
+                       print("PyMailMessage.addBccRecipient: " + bccrecipient, 
file=dbgout)
+               self.bccrecipients.append(bccrecipient)
        def getRecipients( self ):
                if dbg:
-                       print("PyMailMessage.getRecipients " + self.recipients, 
file=dbgout)
-               return self.recipients
+                       print("PyMailMessage.getRecipients: " + 
self.recipients, file=dbgout)
+               return tuple(self.recipients)
        def getCcRecipients( self ):
                if dbg:
-                       print("PyMailMessage.getCcRecipients " + 
self.ccrecipients, file=dbgout)
-               return self.ccrecipients
+                       print("PyMailMessage.getCcRecipients: " + 
self.ccrecipients, file=dbgout)
+               return tuple(self.ccrecipients)
        def getBccRecipients( self ):
                if dbg:
-                       print("PyMailMessage.getBccRecipients " + 
self.bccrecipients, file=dbgout)
-               return self.bccrecipients
+                       print("PyMailMessage.getBccRecipients: " + 
self.bccrecipients, file=dbgout)
+               return tuple(self.bccrecipients)
        def addAttachment( self, aMailAttachment ):
                if dbg:
                        print("PyMailMessage.addAttachment", file=dbgout)
-               self.aMailAttachments = self.aMailAttachments + 
(aMailAttachment,)
+               self.aMailAttachments.append(aMailAttachment)
        def getAttachments( self ):
                if dbg:
                        print("PyMailMessage.getAttachments", file=dbgout)
-               return self.aMailAttachments
+               return tuple(self.aMailAttachments)
 
 # pythonloader looks for a static g_ImplementationHelper variable
 g_ImplementationHelper = unohelper.ImplementationHelper()
_______________________________________________
Libreoffice-commits mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to