def _render_output_html(self): """ Return rendered newsletter with header+body+footer (raw html). """ enl = self.getNewsletter() # get out_template from ENL object and render it in context of issue out_template_pt_field = enl.getField('out_template_pt') ObjectField.set(out_template_pt_field, self, ZopePageTemplate( out_template_pt_field.getName(), enl.getRawOut_template_pt())) output_html = safe_portal_encoding(self.out_template_pt.pt_render()) output_html = compactify(output_html, filter_tags=False) return output_html
def _personalize_texts(self, enl, receiver, text, text_plain): salutation = receiver.get("salutation") or '' fullname = receiver.get('fullname') if not fullname: try: fullname = enl.getFullname_fallback() except AttributeError: fullname = "Sir or Madam" subscriber_salutation = safe_portal_encoding(salutation) + ' ' + \ safe_portal_encoding(fullname) text = text.replace( "[[SUBSCRIBER_SALUTATION]]", str(subscriber_salutation)) text_plain = text_plain.replace( "[[SUBSCRIBER_SALUTATION]]", str(subscriber_salutation)) # we can only build unsubscribe links with subscriber uid if 'uid' in receiver: try: unsubscribe_text = enl.getUnsubscribe_string() except AttributeError: unsubscribe_text = "Click here to unsubscribe" unsubscribe_link = enl.absolute_url() + \ "/unsubscribe?subscriber=" + receiver['uid'] text = text.replace( "[[UNSUBSCRIBE]]", """<a href="%s">%s.</a>""" % ( unsubscribe_link, unsubscribe_text)) text_plain = text_plain.replace( "[[UNSUBSCRIBE]]", """\n%s: %s""" % ( unsubscribe_text, unsubscribe_link)) else: text = text.replace("[[UNSUBSCRIBE]]", "") text_plain = text_plain.replace( "[[UNSUBSCRIBE]]", "") return text, text_plain
def _render_output_html(self): """ Return rendered newsletter with header+body+footer (raw html). """ enl = self.getNewsletter() props = getToolByName(self, "portal_properties").site_properties charset = props.getProperty("default_charset") # get out_template from ENL object and render it in context of issue out_template_pt_field = enl.getField('out_template_pt') ObjectField.set(out_template_pt_field, self, ZopePageTemplate( out_template_pt_field.getName(), enl.getRawOut_template_pt())) output_html = safe_portal_encoding(self.out_template_pt.pt_render()) return output_html
def _render_output_html(self): """ Return rendered newsletter with header+body+footer (raw html). """ enl = self.getNewsletter() # get out_template from ENL object and render it in context of issue out_template_pt_field = enl.getField('out_template_pt') ObjectField.set( out_template_pt_field, self, ZopePageTemplate(out_template_pt_field.getName(), enl.getRawOut_template_pt())) output_html = safe_portal_encoding(self.out_template_pt.pt_render()) output_html = compactify(output_html, filter_tags=False) return output_html
def _render_output_html(self): """ Return rendered newsletter with header+body+footer (raw html). """ enl = self.getNewsletter() props = getToolByName(self, "portal_properties").site_properties charset = props.getProperty("default_charset") # get out_template from ENL object and render it in context of issue out_template_pt_field = enl.getField('out_template_pt') ObjectField.set( out_template_pt_field, self, ZopePageTemplate(out_template_pt_field.getName(), enl.getRawOut_template_pt())) output_html = safe_portal_encoding(self.out_template_pt.pt_render()) return output_html
def send(self, recipients=[]): """Sends the newsletter. An optional list of dicts (keys=fullname|mail) can be passed in for sending a newsletter out addresses != subscribers. """ # preparations request = self.REQUEST # get hold of the parent Newsletter object# enl = self.getNewsletter() # get sender name sender_name = request.get("sender_name", "") if sender_name == "": sender_name = enl.getSenderName() # don't use Header() with a str and a charset arg, even if it is correct # this would generate a encoded header and mail server may not support utf-8 encoded header from_header = Header(safe_unicode(sender_name)) # get sender e-mail sender_email = request.get("sender_email", "") if sender_email == "": sender_email = enl.getSenderEmail() from_header.append('<%s>' % safe_unicode(sender_email)) # get subject subject = request.get("subject", "") if subject == "": subject = self.Title() subject_header = Header(safe_unicode(subject)) # Create from-header #from_header = enl.getSenderName() and '"%s" <%s>' % (sender_name, sender_email) or sender_email #from_header = safe_unicode(from_header) # determine MailHost first (build-in vs. external) deliveryServiceName = enl.getDeliveryService() if deliveryServiceName == 'mailhost': MailHost = getToolByName(enl, 'MailHost') else: MailHost = getUtility(IMailHost, name=deliveryServiceName) log.info('Using mail delivery service "%r"' % MailHost) send_counter = 0 send_error_counter = 0 receivers = self._send_recipients(recipients) output_html = self._render_output_html() rendered_newsletter = self._exchange_relative_urls(output_html) text = rendered_newsletter['html'] text_plain = rendered_newsletter['plain'] image_urls = rendered_newsletter['images'] props = getToolByName(self, "portal_properties").site_properties charset = props.getProperty("default_charset") for receiver in receivers: # create multipart mail outer = MIMEMultipart('alternative') if hasattr(request, "test"): outer['To'] = Header('<%s>' % safe_unicode(receiver['email'])) fullname = receiver['fullname'] salutation = receiver['salutation'] personal_text = text.replace("[[SUBSCRIBER_SALUTATION]]", "") personal_text_plain = text_plain.replace("[[SUBSCRIBER_SALUTATION]]", "") personal_text = text.replace("[[UNSUBSCRIBE]]", "") personal_text_plain = text_plain.replace("[[UNSUBSCRIBE]]", "") else: if 'uid' in receiver: try: unsubscribe_text = enl.getUnsubscribe_string() except AttributeError: unsubscribe_text = "Click here to unsubscribe" unsubscribe_link = enl.absolute_url() + "/unsubscribe?subscriber=" + receiver['uid'] personal_text = text.replace("[[UNSUBSCRIBE]]", """<a href="%s">%s.</a>""" % (unsubscribe_link, unsubscribe_text)) personal_text_plain = text_plain.replace("[[UNSUBSCRIBE]]", """\n%s: %s""" % (unsubscribe_text, unsubscribe_link)) else: personal_text = text.replace("[[UNSUBSCRIBE]]", "") personal_text_plain = text_plain.replace("[[UNSUBSCRIBE]]", "") if 'salutation' in receiver: salutation = receiver["salutation"] else: salutation = '' fullname = receiver['fullname'] if not fullname: try: fullname = enl.getFullname_fallback() except AttributeError: fullname = "Sir or Madam" outer['To'] = Header('<%s>' % safe_unicode(receiver['email'])) subscriber_salutation = safe_portal_encoding(salutation) + ' ' + safe_portal_encoding(fullname) personal_text = personal_text.replace("[[SUBSCRIBER_SALUTATION]]", str(subscriber_salutation)) personal_text_plain = personal_text_plain.replace("[[SUBSCRIBER_SALUTATION]]", str(subscriber_salutation)) outer['From'] = from_header outer['Subject'] = subject_header outer.epilogue = '' # Attach text part #text_part = MIMEText(personal_text_plain, "plain", charset) # Attach html part with images #html_part = MIMEText(personal_text, "html", charset) # Attach text part text_part = MIMEMultipart("related") text_part.attach(MIMEText(personal_text_plain, "plain", charset)) # Attach html part with images html_part = MIMEMultipart("related") html_text = MIMEText(personal_text, "html", charset) html_part.attach(html_text) # Add images to the message image_number = 0 reference_tool = getToolByName(self, 'reference_catalog') for image_url in image_urls: #XXX: we need to provide zope3 resource image too! try: image_url = urlparse(image_url)[2] if 'resolveuid' in image_url: urlparts = image_url.split('/')[1:] uuid = urlparts.pop(0) o = reference_tool.lookupObject(uuid) if o and urlparts: # get thumb o = o.restrictedTraverse(urlparts[0]) else: o = self.restrictedTraverse(urllib.unquote(image_url)) except Exception, e: log.error("Could not resolve the image \"%s\": %s" % (image_url, e)) else: if hasattr(o, "_data"): # file-based image = MIMEImage(o._data) elif hasattr(o, "data"): image = MIMEImage(o.data) # zodb-based else: image = MIMEImage(o.GET()) # z3 resource image image["Content-ID"] = "<image_%s>" % image_number image_number += 1 # attach images only to html parts html_part.attach(image) outer.attach(text_part) outer.attach(html_part) try: #MailHost.send(msg) MailHost.send(outer.as_string()) log.info("Send newsletter to \"%s\"" % receiver['email']) send_counter += 1 except AttributeError: # Plone3.3.x MailHost.send(msg.as_string()) log.info("Send newsletter to \"%s\"" % receiver['email']) send_counter += 1 except Exception, e: log.info("Sending newsletter to \"%s\" failed, with error \"%s\"!" % (receiver['email'], e)) send_error_counter += 1
def send(self, recipients=[]): """Sends the newsletter. An optional list of dicts (keys=fullname|mail) can be passed in for sending a newsletter out addresses != subscribers. """ # preparations request = self.REQUEST # get hold of the parent Newsletter object# enl = self.getNewsletter() # get sender name sender_name = request.get("sender_name", "") if sender_name == "": sender_name = enl.getSenderName() # get sender e-mail sender_email = request.get("sender_email", "") if sender_email == "": sender_email = enl.getSenderEmail() # get subject subject = request.get("subject", "") if subject == "": subject = self.Title() # Create from-header from_header = enl.getSenderName() and '"%s" <%s>' % ( sender_name, sender_email) or sender_email # determine MailHost first (build-in vs. external) deliveryServiceName = enl.getDeliveryService() if deliveryServiceName == 'mailhost': MailHost = getToolByName(enl, 'MailHost') else: MailHost = getUtility(IMailHost, name=deliveryServiceName) log.info('Using mail delivery service "%r"' % MailHost) send_counter = 0 send_error_counter = 0 receivers = self._send_recipients(recipients) output_html = self._render_output_html() rendered_newsletter = self._exchange_relative_urls(output_html) text = rendered_newsletter['html'] text_plain = rendered_newsletter['plain'] image_urls = rendered_newsletter['images'] props = getToolByName(self, "portal_properties").site_properties charset = props.getProperty("default_charset") for receiver in receivers: # create multipart mail outer = MIMEMultipart('alternative') if hasattr(request, "test"): outer['To'] = receiver['email'] fullname = receiver['fullname'] salutation = receiver['salutation'] personal_text = text.replace("[[SUBSCRIBER_SALUTATION]]", "") personal_text_plain = text_plain.replace( "[[SUBSCRIBER_SALUTATION]]", "") personal_text = text.replace("[[UNSUBSCRIBE]]", "") personal_text_plain = text_plain.replace("[[UNSUBSCRIBE]]", "") else: if 'uid' in receiver: try: unsubscribe_text = enl.getUnsubscribe_string() except AttributeError: unsubscribe_text = "Click here to unsubscribe" unsubscribe_link = enl.absolute_url( ) + "/unsubscribe?subscriber=" + receiver['uid'] personal_text = text.replace( "[[UNSUBSCRIBE]]", """<a href="%s">%s.</a>""" % (unsubscribe_link, unsubscribe_text)) personal_text_plain = text_plain.replace( "[[UNSUBSCRIBE]]", """\n%s: %s""" % (unsubscribe_text, unsubscribe_link)) else: personal_text = text.replace("[[UNSUBSCRIBE]]", "") personal_text_plain = text_plain.replace( "[[UNSUBSCRIBE]]", "") if 'salutation' in receiver: salutation = receiver["salutation"] else: salutation = '' fullname = receiver['fullname'] if not fullname: try: fullname = enl.getFullname_fallback() except AttributeError: fullname = "Sir or Madam" subscriber_salutation = safe_portal_encoding( salutation) + ' ' + safe_portal_encoding(fullname) personal_text = personal_text.replace("[[SUBSCRIBER_SALUTATION]]", str(subscriber_salutation)) personal_text_plain = personal_text_plain.replace( "[[SUBSCRIBER_SALUTATION]]", str(subscriber_salutation)) msg = create_html_mail(subject, personal_text.decode("utf-8"), text=personal_text_plain.decode("utf-8"), from_addr=sender_email, to_addr=receiver['email'], headers=None, encoding='UTF-8') try: MailHost.send(msg) log.info("Send newsletter to \"%s\"" % receiver['email']) send_counter += 1 except Exception, e: log.info( "Sending newsletter to \"%s\" failed, with error \"%s\"!" % (receiver['email'], e)) send_error_counter += 1
def send(self, recipients=[]): """Sends the newsletter. An optional list of dicts (keys=fullname|mail) can be passed in for sending a newsletter out addresses != subscribers. """ # preparations request = self.REQUEST # get hold of the parent Newsletter object# enl = self.getNewsletter() # get sender name sender_name = request.get("sender_name", "") if sender_name == "": sender_name = enl.getSenderName() # don't use Header() with a str and a charset arg, even if it is correct # this would generate a encoded header and mail server may not support utf-8 encoded header from_header = Header(safe_unicode(sender_name)) # get sender e-mail sender_email = request.get("sender_email", "") if sender_email == "": sender_email = enl.getSenderEmail() from_header.append('<%s>' % safe_unicode(sender_email)) # get subject subject = request.get("subject", "") if subject == "": subject = self.Title() subject_header = Header(safe_unicode(subject)) # determine MailHost first (build-in vs. external) deliveryServiceName = enl.getDeliveryService() if deliveryServiceName == 'mailhost': MailHost = getToolByName(enl, 'MailHost') else: MailHost = getUtility(IMailHost, name=deliveryServiceName) log.info('Using mail delivery service "%r"' % MailHost) send_counter = 0 send_error_counter = 0 receivers = self._send_recipients(recipients) output_html = self._render_output_html() rendered_newsletter = self._exchange_relative_urls(output_html) text = rendered_newsletter['html'] text_plain = rendered_newsletter['plain'] image_urls = rendered_newsletter['images'] props = getToolByName(self, "portal_properties").site_properties charset = props.getProperty("default_charset") portal = getSite() for receiver in receivers: # create multipart mail outer = MIMEMultipart('alternative') if hasattr(request, "test"): outer['To'] = Header('<%s>' % safe_unicode(receiver['email'])) fullname = receiver['fullname'] salutation = receiver['salutation'] personal_text = text.replace("[[SUBSCRIBER_SALUTATION]]", "") personal_text_plain = text_plain.replace( "[[SUBSCRIBER_SALUTATION]]", "") personal_text = text.replace("[[UNSUBSCRIBE]]", "") personal_text_plain = text_plain.replace("[[UNSUBSCRIBE]]", "") else: if 'uid' in receiver: try: unsubscribe_text = enl.getUnsubscribe_string() except AttributeError: unsubscribe_text = "Click here to unsubscribe" unsubscribe_link = enl.absolute_url( ) + "/unsubscribe?subscriber=" + receiver['uid'] personal_text = text.replace( "[[UNSUBSCRIBE]]", """<a href="%s">%s.</a>""" % (unsubscribe_link, unsubscribe_text)) personal_text_plain = text_plain.replace( "[[UNSUBSCRIBE]]", """\n%s: %s""" % (unsubscribe_text, unsubscribe_link)) else: personal_text = text.replace("[[UNSUBSCRIBE]]", "") personal_text_plain = text_plain.replace( "[[UNSUBSCRIBE]]", "") if 'salutation' in receiver: salutation = receiver["salutation"] else: salutation = '' fullname = receiver['fullname'] if not fullname: try: fullname = enl.getFullname_fallback() except AttributeError: fullname = "Sir or Madam" outer['To'] = Header('<%s>' % safe_unicode(receiver['email'])) subscriber_salutation = safe_portal_encoding( salutation) + ' ' + safe_portal_encoding(fullname) personal_text = personal_text.replace("[[SUBSCRIBER_SALUTATION]]", str(subscriber_salutation)) personal_text_plain = personal_text_plain.replace( "[[SUBSCRIBER_SALUTATION]]", str(subscriber_salutation)) outer['From'] = from_header outer['Subject'] = subject_header outer.epilogue = '' # Attach text part text_part = MIMEText(personal_text_plain, "plain", charset) # Attach html part with images html_part = MIMEMultipart("related") html_text = MIMEText(personal_text, "html", charset) html_part.attach(html_text) # Add images to the message image_number = 0 reference_tool = getToolByName(self, 'reference_catalog') for image_url in image_urls: try: image_url = urlparse(image_url)[2] if 'resolveuid' in image_url: urlparts = image_url.split('/')[1:] uuid = urlparts.pop(0) o = reference_tool.lookupObject(uuid) if o and urlparts: # get thumb o = o.restrictedTraverse(urlparts[0]) elif "@@images" in image_url: image_url_base, image_scale_params = image_url.split( "@@images") image_scale = image_scale_params.split("/")[-1] scales = self.restrictedTraverse( urllib.unquote( image_url_base.strip('/') + '/@@images')) o = scales.scale('image', scale=image_scale) else: o = self.restrictedTraverse(urllib.unquote(image_url)) except Exception, e: log.error("Could not resolve the image \"%s\": %s" % (image_url, e)) else: if hasattr(o, "_data"): # file-based image = MIMEImage(o._data) elif hasattr(o, "data"): image = MIMEImage(o.data) # zodb-based elif hasattr(o, "GET"): image = MIMEImage(o.GET()) # z3 resource image else: log.error( "Could not get the image data from image object!") image["Content-ID"] = "<image_%s>" % image_number image_number += 1 # attach images only to html parts html_part.attach(image) outer.attach(text_part) outer.attach(html_part) try: #MailHost.send(msg) MailHost.send(outer.as_string()) log.info("Send newsletter to \"%s\"" % receiver['email']) send_counter += 1 except AttributeError: # Plone3.3.x MailHost.send(msg.as_string()) log.info("Send newsletter to \"%s\"" % receiver['email']) send_counter += 1 except Exception, e: log.info( "Sending newsletter to \"%s\" failed, with error \"%s\"!" % (receiver['email'], e)) send_error_counter += 1
def send(self, recipients=[]): """Sends the newsletter. An optional list of dicts (keys=fullname|mail) can be passed in for sending a newsletter out addresses != subscribers. """ # preparations request = self.REQUEST # get hold of the parent Newsletter object# enl = self.getNewsletter() # get sender name sender_name = request.get("sender_name", "") if sender_name == "": sender_name = enl.getSenderName() # get sender e-mail sender_email = request.get("sender_email", "") if sender_email == "": sender_email = enl.getSenderEmail() # get subject subject = request.get("subject", "") if subject == "": subject = self.Title() # Create from-header from_header = enl.getSenderName() and '"%s" <%s>' % (sender_name, sender_email) or sender_email # determine MailHost first (build-in vs. external) deliveryServiceName = enl.getDeliveryService() if deliveryServiceName == 'mailhost': MailHost = getToolByName(enl, 'MailHost') else: MailHost = getUtility(IMailHost, name=deliveryServiceName) log.info('Using mail delivery service "%r"' % MailHost) send_counter = 0 send_error_counter = 0 receivers = self._send_recipients(recipients) output_html = self._render_output_html() rendered_newsletter = self._exchange_relative_urls(output_html) text = rendered_newsletter['html'] text_plain = rendered_newsletter['plain'] image_urls = rendered_newsletter['images'] props = getToolByName(self, "portal_properties").site_properties charset = props.getProperty("default_charset") for receiver in receivers: # create multipart mail outer = MIMEMultipart('alternative') if hasattr(request, "test"): outer['To'] = receiver['email'] fullname = receiver['fullname'] salutation = receiver['salutation'] personal_text = text.replace("[[SUBSCRIBER_SALUTATION]]", "") personal_text_plain = text_plain.replace("[[SUBSCRIBER_SALUTATION]]", "") personal_text = text.replace("[[UNSUBSCRIBE]]", "") personal_text_plain = text_plain.replace("[[UNSUBSCRIBE]]", "") else: if 'uid' in receiver: try: unsubscribe_text = enl.getUnsubscribe_string() except AttributeError: unsubscribe_text = "Click here to unsubscribe" unsubscribe_link = enl.absolute_url() + "/unsubscribe?subscriber=" + receiver['uid'] personal_text = text.replace("[[UNSUBSCRIBE]]", """<a href="%s">%s.</a>""" % (unsubscribe_link, unsubscribe_text)) personal_text_plain = text_plain.replace("[[UNSUBSCRIBE]]", """\n%s: %s""" % (unsubscribe_text, unsubscribe_link)) else: personal_text = text.replace("[[UNSUBSCRIBE]]", "") personal_text_plain = text_plain.replace("[[UNSUBSCRIBE]]", "") if 'salutation' in receiver: salutation = receiver["salutation"] else: salutation = '' fullname = receiver['fullname'] if not fullname: try: fullname = enl.getFullname_fallback() except AttributeError: fullname = "Sir or Madam" subscriber_salutation = safe_portal_encoding(salutation) + ' ' + safe_portal_encoding(fullname) personal_text = personal_text.replace("[[SUBSCRIBER_SALUTATION]]", str(subscriber_salutation)) personal_text_plain = personal_text_plain.replace("[[SUBSCRIBER_SALUTATION]]", str(subscriber_salutation)) msg = create_html_mail(subject, personal_text.decode("utf-8"), text=personal_text_plain.decode("utf-8"), from_addr=sender_email, to_addr=receiver['email'], headers=None, encoding='UTF-8') try: MailHost.send(msg) log.info("Send newsletter to \"%s\"" % receiver['email']) send_counter += 1 except Exception, e: log.info("Sending newsletter to \"%s\" failed, with error \"%s\"!" % (receiver['email'], e)) send_error_counter += 1