30from com.sun.star.mail.MailServiceType
import SMTP
31from com.sun.star.mail.MailServiceType
import POP3
32from com.sun.star.mail.MailServiceType
import IMAP
39from email.mime.base
import MIMEBase
40from email.message
import Message
41from email.charset
import Charset
42from email.charset
import QP
43from email.encoders
import encode_base64
44from email.header
import Header
45from email.mime.multipart
import MIMEMultipart
46from email.utils
import formatdate
47from email.utils
import parseaddr
48from socket
import _GLOBAL_DEFAULT_TIMEOUT
50import sys, ssl, smtplib, imaplib, poplib
55g_providerImplName =
"org.openoffice.pyuno.MailServiceProvider"
56g_messageImplName =
"org.openoffice.pyuno.MailMessage"
67 print(
"PyMailSMTPService init", file=sys.stderr)
68 print(
"python version is: " + sys.version, file=sys.stderr)
71 print(
"PyMailSMTPService addConnectionListener", file=sys.stderr)
75 print(
"PyMailSMTPService removeConnectionListener", file=sys.stderr)
79 print(
"PyMailSMTPService getSupportedConnectionTypes", file=sys.stderr)
81 def connect(self, xConnectionContext, xAuthenticator):
84 print(
"PyMailSMTPService connect", file=sys.stderr)
85 server = xConnectionContext.getValueByName(
"ServerName").strip()
87 print(
"ServerName: " + server, file=sys.stderr)
88 port = int(xConnectionContext.getValueByName(
"Port"))
90 print(
"Port: " + str(port), file=sys.stderr)
91 tout = xConnectionContext.getValueByName(
"Timeout")
93 print(isinstance(tout,int), file=sys.stderr)
94 if not isinstance(tout,int):
95 tout = _GLOBAL_DEFAULT_TIMEOUT
97 print(
"Timeout: " + str(tout), file=sys.stderr)
99 self.
server = smtplib.SMTP_SSL(server, port, timeout=tout, context=ssl.create_default_context())
101 self.
server = smtplib.SMTP(server, port,timeout=tout)
104 self.
server.set_debuglevel(1)
106 connectiontype = xConnectionContext.getValueByName(
"ConnectionType")
108 print(
"ConnectionType: " + connectiontype, file=sys.stderr)
109 if connectiontype.upper() ==
'SSL' and port != 465:
111 self.
server.starttls(context=ssl.create_default_context())
114 user = xAuthenticator.getUserName()
115 password = xAuthenticator.getPassword()
118 print(
"Logging in, username of: " + user, file=sys.stderr)
119 self.
server.login(user, password)
122 listener.connected(self.
notify)
125 print(
"PyMailSMTPService disconnect", file=sys.stderr)
130 listener.disconnected(self.
notify)
133 print(
"PyMailSMTPService isConnected", file=sys.stderr)
134 return self.
server !=
None
137 print(
"PyMailSMTPService getCurrentConnectionContext", file=sys.stderr)
143 print(
"PyMailSMTPService sendMailMessage", file=sys.stderr)
144 recipients = xMailMessage.getRecipients()
145 sendermail = xMailMessage.SenderAddress
146 sendername = xMailMessage.SenderName
147 subject = xMailMessage.Subject
148 ccrecipients = xMailMessage.getCcRecipients()
149 bccrecipients = xMailMessage.getBccRecipients()
151 print(
"PyMailSMTPService subject: " + subject, file=sys.stderr)
152 print(
"PyMailSMTPService from: " + sendername, file=sys.stderr)
153 print(
"PyMailSMTPService from: " + sendermail, file=sys.stderr)
154 print(
"PyMailSMTPService send to: %s" % (recipients,), file=sys.stderr)
156 attachments = xMailMessage.getAttachments()
160 content = xMailMessage.Body
161 flavors = content.getTransferDataFlavors()
163 print(
"PyMailSMTPService flavors len: %d" % (len(flavors),), file=sys.stderr)
166 for flavor
in flavors:
167 if flavor.MimeType.find(
'text/html') != -1
or flavor.MimeType.find(
'text/plain') != -1:
169 print(
"PyMailSMTPService mimetype is: " + flavor.MimeType, file=sys.stderr)
170 textbody = content.getTransferData(flavor)
173 mimeEncoding = re.sub(
"charset=.*",
"charset=UTF-8", flavor.MimeType)
174 if mimeEncoding.find(
'charset=UTF-8') == -1:
175 mimeEncoding = mimeEncoding +
"; charset=UTF-8"
176 textmsg[
'Content-Type'] = mimeEncoding
177 textmsg[
'MIME-Version'] =
'1.0'
181 textbody = textbody.encode(
'utf-8')
184 textbody = textbody.value
185 textbody = textbody.decode(
'utf-8')
188 textmsg.set_payload(textbody, c)
192 if (len(attachments)):
193 msg = MIMEMultipart()
199 hdr = Header(sendername,
'utf-8')
200 hdr.append(
'<'+sendermail+
'>',
'us-ascii')
201 msg[
'Subject'] = subject
203 msg[
'To'] = COMMASPACE.join(recipients)
204 if len(ccrecipients):
205 msg[
'Cc'] = COMMASPACE.join(ccrecipients)
206 if xMailMessage.ReplyToAddress !=
'':
207 msg[
'Reply-To'] = xMailMessage.ReplyToAddress
209 mailerstring =
"LibreOffice via Caolan's mailmerge component"
212 aConfigProvider = ctx.ServiceManager.createInstance(
"com.sun.star.configuration.ConfigurationProvider")
214 prop.Name =
"nodepath"
215 prop.Value =
"/org.openoffice.Setup/Product"
216 aSettings = aConfigProvider.createInstanceWithArguments(
"com.sun.star.configuration.ConfigurationAccess",
218 mailerstring = aSettings.getByName(
"ooName") +
" " + \
219 aSettings.getByName(
"ooSetupVersion") +
" via Caolan's mailmerge component"
223 msg[
'X-Mailer'] = mailerstring
224 msg[
'Date'] = formatdate(localtime=
True)
226 for attachment
in attachments:
227 content = attachment.Data
228 flavors = content.getTransferDataFlavors()
230 ctype = flavor.MimeType
231 maintype, subtype = ctype.split(
'/', 1)
232 msgattachment = MIMEBase(maintype, subtype)
233 data = content.getTransferData(flavor)
234 msgattachment.set_payload(data.value)
235 encode_base64(msgattachment)
236 fname = attachment.ReadableName
238 msgattachment.add_header(
'Content-Disposition',
'attachment', \
241 msgattachment.add_header(
'Content-Disposition',
'attachment', \
242 filename=(
'utf-8',
'',fname))
244 print((
"PyMailSMTPService attachmentheader: ", str(msgattachment)), file=sys.stderr)
246 msg.attach(msgattachment)
249 for key
in recipients:
251 if len(ccrecipients):
252 for key
in ccrecipients:
254 if len(bccrecipients):
255 for key
in bccrecipients:
257 truerecipients = uniquer.keys()
260 print((
"PyMailSMTPService recipients are: ", truerecipients), file=sys.stderr)
262 self.
server.sendmail(sendermail, truerecipients, msg.as_string())
273 print(
"PyMailIMAPService init", file=sys.stderr)
276 print(
"PyMailIMAPService addConnectionListener", file=sys.stderr)
280 print(
"PyMailIMAPService removeConnectionListener", file=sys.stderr)
284 print(
"PyMailIMAPService getSupportedConnectionTypes", file=sys.stderr)
286 def connect(self, xConnectionContext, xAuthenticator):
288 print(
"PyMailIMAPService connect", file=sys.stderr)
291 server = xConnectionContext.getValueByName(
"ServerName")
293 print(server, file=sys.stderr)
294 port = int(xConnectionContext.getValueByName(
"Port"))
296 print(port, file=sys.stderr)
297 connectiontype = xConnectionContext.getValueByName(
"ConnectionType")
299 print(connectiontype, file=sys.stderr)
300 print(
"BEFORE", file=sys.stderr)
301 if connectiontype.upper() ==
'SSL':
302 self.
server = imaplib.IMAP4_SSL(server, port, ssl_context=ssl.create_default_context())
304 self.
server = imaplib.IMAP4(server, port)
305 print(
"AFTER", file=sys.stderr)
307 user = xAuthenticator.getUserName()
308 password = xAuthenticator.getPassword()
311 print(
"Logging in, username of: " + user, file=sys.stderr)
312 self.
server.login(user, password)
315 listener.connected(self.
notify)
318 print(
"PyMailIMAPService disconnect", file=sys.stderr)
323 listener.disconnected(self.
notify)
326 print(
"PyMailIMAPService isConnected", file=sys.stderr)
327 return self.
server !=
None
330 print(
"PyMailIMAPService getCurrentConnectionContext", file=sys.stderr)
342 print(
"PyMailPOP3Service init", file=sys.stderr)
345 print(
"PyMailPOP3Service addConnectionListener", file=sys.stderr)
349 print(
"PyMailPOP3Service removeConnectionListener", file=sys.stderr)
353 print(
"PyMailPOP3Service getSupportedConnectionTypes", file=sys.stderr)
355 def connect(self, xConnectionContext, xAuthenticator):
357 print(
"PyMailPOP3Service connect", file=sys.stderr)
360 server = xConnectionContext.getValueByName(
"ServerName")
362 print(server, file=sys.stderr)
363 port = int(xConnectionContext.getValueByName(
"Port"))
365 print(port, file=sys.stderr)
366 connectiontype = xConnectionContext.getValueByName(
"ConnectionType")
368 print(connectiontype, file=sys.stderr)
369 print(
"BEFORE", file=sys.stderr)
370 if connectiontype.upper() ==
'SSL':
371 self.
server = poplib.POP3_SSL(server, port, context=ssl.create_default_context())
373 tout = xConnectionContext.getValueByName(
"Timeout")
375 print(isinstance(tout,int), file=sys.stderr)
376 if not isinstance(tout,int):
377 tout = _GLOBAL_DEFAULT_TIMEOUT
379 print(
"Timeout: " + str(tout), file=sys.stderr)
380 self.
server = poplib.POP3(server, port, timeout=tout)
381 print(
"AFTER", file=sys.stderr)
383 user = xAuthenticator.getUserName()
384 password = xAuthenticator.getPassword()
386 print(
"Logging in, username of: " + user, file=sys.stderr)
388 self.
server.pass_(password)
391 listener.connected(self.
notify)
394 print(
"PyMailPOP3Service disconnect", file=sys.stderr)
399 listener.disconnected(self.
notify)
402 print(
"PyMailPOP3Service isConnected", file=sys.stderr)
403 return self.
server !=
None
406 print(
"PyMailPOP3Service getCurrentConnectionContext", file=sys.stderr)
412 print(
"PyMailServiceProvider init", file=sys.stderr)
416 print(
"PyMailServiceProvider create with", aType, file=sys.stderr)
424 print(
"PyMailServiceProvider, unknown TYPE " + aType, file=sys.stderr)
427 return g_providerImplName
430 return g_ImplementationHelper.supportsService(g_providerImplName, ServiceName)
433 return g_ImplementationHelper.getSupportedServiceNames(g_providerImplName)
436 def __init__( self, ctx, sTo='', sFrom='', Subject='', Body=None, aMailAttachment=None ):
438 print(
"PyMailMessage init", file=sys.stderr)
445 if aMailAttachment !=
None:
453 print(
"post PyMailMessage init", file=sys.stderr)
456 print(
"PyMailMessage.addRecipient: " + recipient, file=sys.stderr)
460 print(
"PyMailMessage.addCcRecipient: " + ccrecipient, file=sys.stderr)
464 print(
"PyMailMessage.addBccRecipient: " + bccrecipient, file=sys.stderr)
468 print(
"PyMailMessage.getRecipients: " + str(self.
recipients), file=sys.stderr)
472 print(
"PyMailMessage.getCcRecipients: " + str(self.
ccrecipients), file=sys.stderr)
476 print(
"PyMailMessage.getBccRecipients: " + str(self.
bccrecipients), file=sys.stderr)
480 print(
"PyMailMessage.addAttachment", file=sys.stderr)
484 print(
"PyMailMessage.getAttachments", file=sys.stderr)
488 return g_messageImplName
491 return g_ImplementationHelper.supportsService(g_messageImplName, ServiceName)
494 return g_ImplementationHelper.getSupportedServiceNames(g_messageImplName)
496g_ImplementationHelper.addImplementation( \
497 PyMailServiceProvider, g_providerImplName,
498 (
"com.sun.star.mail.MailServiceProvider",),)
499g_ImplementationHelper.addImplementation( \
500 PyMailMessage, g_messageImplName,
501 (
"com.sun.star.mail.MailMessage",),)
def removeConnectionListener(self, xListener)
def addConnectionListener(self, xListener)
def getSupportedConnectionTypes(self)
def connect(self, xConnectionContext, xAuthenticator)
def getCurrentConnectionContext(self)
def getSupportedServiceNames(self)
def addCcRecipient(self, ccrecipient)
def getCcRecipients(self)
def addBccRecipient(self, bccrecipient)
def supportsService(self, ServiceName)
def addRecipient(self, recipient)
def getBccRecipients(self)
def addAttachment(self, aMailAttachment)
def __init__(self, ctx, sTo='', sFrom='', Subject='', Body=None, aMailAttachment=None)
def getImplementationName(self)
def addConnectionListener(self, xListener)
def getCurrentConnectionContext(self)
def removeConnectionListener(self, xListener)
def getSupportedConnectionTypes(self)
def connect(self, xConnectionContext, xAuthenticator)
def getSupportedConnectionTypes(self)
def removeConnectionListener(self, xListener)
def sendMailMessage(self, xMailMessage)
def getCurrentConnectionContext(self)
def connect(self, xConnectionContext, xAuthenticator)
def addConnectionListener(self, xListener)
def supportsService(self, ServiceName)
def getSupportedServiceNames(self)
def getImplementationName(self)
def getComponentContext()
def createUnoStruct(typeName, *args, **kwargs)