def register_subscriber(self): """ """ charset = get_email_charset() subscriber = self.request.get("subscriber") lastname = self.request.get("name", "") firstname = self.request.get("firstname", "") name_prefix = self.request.get("name_prefix", "") portal_state = getMultiAdapter((self.context.aq_inner, self.request), name=u'plone_portal_state') current_language = portal_state.language() nl_language = self.request.get("nl_language", current_language) salutation = self.request.get("salutation", "") organization = self.request.get("organization", "") path_to_easynewsletter = self.request.get("newsletter") # remove leading slash from paths like: /mynewsletter path_to_easynewsletter = path_to_easynewsletter.strip('/') newsletter_container = self.portal.unrestrictedTraverse( path_to_easynewsletter) messages = IStatusMessage(self.request) if not subscriber: messages.addStatusMessage(_("Please enter a valid email address."), "error") return self._msg_redirect(newsletter_container) mo = re.search(EMAIL_RE, subscriber) if not mo: messages.addStatusMessage(_("Please enter a valid email address."), "error") return self._msg_redirect(newsletter_container) norm = queryUtility(IIDNormalizer) normalized_subscriber = norm.normalize(subscriber) if normalized_subscriber in newsletter_container.objectIds(): messages.addStatusMessage( _("Your email address is already registered."), "error") return self._msg_redirect(newsletter_container) subscriber_data = {} subscriber_data["subscriber"] = subscriber subscriber_data["lastname"] = lastname subscriber_data["firstname"] = firstname subscriber_data["name_prefix"] = name_prefix subscriber_data["nl_language"] = nl_language subscriber_data["salutation"] = salutation subscriber_data["organization"] = organization subscriber_data["path_to_easynewsletter"] = path_to_easynewsletter # use password reset tool to create a hash pwr_data = self._requestReset(subscriber) hashkey = pwr_data['randomstring'] enl_registration_tool = queryUtility(IENLRegistrationTool, 'enl_registration_tool') if hashkey not in enl_registration_tool.objectIds(): enl_registration_tool[hashkey] = RegistrationData( hashkey, **subscriber_data) msg_subject = newsletter_container\ .getRawSubscriber_confirmation_mail_subject().replace( "${portal_url}", self.portal_url.strip('http://')) confirmation_url = self.portal_url + '/confirm-subscriber?hkey=' +\ str(hashkey) msg_text = newsletter_container\ .getRawSubscriber_confirmation_mail_text().replace( "${newsletter_title}", newsletter_container.Title()) msg_text = msg_text.replace("${subscriber_email}", subscriber) msg_text = msg_text.replace("${confirmation_url}", confirmation_url) settings = get_portal_mail_settings() msg_sender = settings.email_from_address msg_receiver = subscriber msg = MIMEText(msg_text, "plain", charset) msg['To'] = msg_receiver msg['From'] = msg_sender msg['Subject'] = msg_subject # msg.epilogue = '' self.portal.MailHost.send(msg.as_string()) messages.addStatusMessage( _("Your email has been registered. \ A confirmation email was sent to your address. Please check \ your inbox and click on the link in the email in order to \ confirm your subscription."), "info") return self._msg_redirect(newsletter_container)
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 test = hasattr(request, 'test') current_state = api.content.get_state(obj=self) # check for workflow if not (test or recipients) and current_state != 'sending': raise ValueError('Executed send in wrong review state!') # get hold of the parent Newsletter object# enl = self.getNewsletter() # get sender name sender_name = request.get('sender_name') if not 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 not sender_email: sender_email = enl.getSenderEmail() from_header.append(u'<%s>' % safe_unicode(sender_email)) # determine MailHost first (build-in vs. external) deliveryServiceName = enl.getDeliveryService() if deliveryServiceName == 'mailhost': mail_host = getToolByName(enl, 'MailHost') else: mail_host = getUtility(IMailHost, name=deliveryServiceName) log.info('Using mail delivery service "%r"' % mail_host) send_counter = 0 send_error_counter = 0 charset = get_email_charset() if not recipients: receivers = self._send_recipients() issue_data_fetcher = IIssueDataFetcher(self) for receiver in receivers: # get complete issue data issue_data = issue_data_fetcher(receiver) # create multipart mail outer = MIMEMultipart('alternative') outer['To'] = Header(u'<%s>' % safe_unicode(receiver['email'])) outer['From'] = from_header outer['Subject'] = issue_data['subject_header'] outer.epilogue = '' # Attach text part text_part = MIMEText(issue_data['body_plain'], 'plain', charset) # Attach html part with images html_part = MIMEMultipart('related') html_text = MIMEText(issue_data['body_html'], 'html', charset) html_part.attach(html_text) # Add images to the message for image in issue_data['images_to_attach']: html_part.attach(image) outer.attach(text_part) outer.attach(html_part) try: mail_host.send(outer.as_string()) log.info('Send newsletter to "%s"' % receiver['email']) send_counter += 1 except Exception, e: # noqa log.exception( 'Sending newsletter to "%s" failed, with error "%s"!' % (receiver['email'], e)) send_error_counter += 1
def register_subscriber(self): """ """ charset = get_email_charset() subscriber = self.request.get("subscriber") lastname = self.request.get("name", "") firstname = self.request.get("firstname", "") name_prefix = self.request.get("name_prefix", "") portal_state = getMultiAdapter( (self.context.aq_inner, self.request), name=u'plone_portal_state' ) current_language = portal_state.language() nl_language = self.request.get("nl_language", current_language) salutation = self.request.get("salutation", "") organization = self.request.get("organization", "") path_to_easynewsletter = self.request.get("newsletter") # remove leading slash from paths like: /mynewsletter path_to_easynewsletter = path_to_easynewsletter.strip('/') newsletter_container = self.portal.unrestrictedTraverse( path_to_easynewsletter) messages = IStatusMessage(self.request) if not subscriber: messages.addStatusMessage( _("Please enter a valid email address."), "error") return self._msg_redirect(newsletter_container) mo = re.search(EMAIL_RE, subscriber) if not mo: messages.addStatusMessage( _("Please enter a valid email address."), "error") return self._msg_redirect(newsletter_container) norm = queryUtility(IIDNormalizer) normalized_subscriber = norm.normalize(subscriber) if normalized_subscriber in newsletter_container.objectIds(): messages.addStatusMessage( _("Your email address is already registered."), "error") return self._msg_redirect(newsletter_container) subscriber_data = {} subscriber_data["subscriber"] = subscriber subscriber_data["lastname"] = lastname subscriber_data["firstname"] = firstname subscriber_data["name_prefix"] = name_prefix subscriber_data["nl_language"] = nl_language subscriber_data["salutation"] = salutation subscriber_data["organization"] = organization subscriber_data["path_to_easynewsletter"] = path_to_easynewsletter # use password reset tool to create a hash pwr_data = self._requestReset(subscriber) hashkey = pwr_data['randomstring'] enl_registration_tool = queryUtility( IENLRegistrationTool, 'enl_registration_tool') if hashkey not in enl_registration_tool.objectIds(): enl_registration_tool[hashkey] = RegistrationData( hashkey, **subscriber_data) msg_subject = newsletter_container\ .getRawSubscriber_confirmation_mail_subject().replace( "${portal_url}", self.portal_url.strip('http://')) confirmation_url = self.portal_url + '/confirm-subscriber?hkey=' +\ str(hashkey) msg_text = newsletter_container\ .getRawSubscriber_confirmation_mail_text().replace( "${newsletter_title}", newsletter_container.Title()) msg_text = msg_text.replace("${subscriber_email}", subscriber) msg_text = msg_text.replace( "${confirmation_url}", confirmation_url) settings = get_portal_mail_settings() msg_sender = settings.email_from_address msg_receiver = subscriber msg = MIMEText(msg_text, "plain", charset) msg['To'] = msg_receiver msg['From'] = msg_sender msg['Subject'] = msg_subject # msg.epilogue = '' self.portal.MailHost.send(msg.as_string()) messages.addStatusMessage(_("Your email has been registered. \ A confirmation email was sent to your address. Please check \ your inbox and click on the link in the email in order to \ confirm your subscription."), "info") return self._msg_redirect(newsletter_container)
def safe_portal_encoding(string): charset = get_email_charset() return safe_unicode(string).encode(charset)