zope.sendmail

Author:unknown
Version:unknown

Example config

<configure xmlns="http://namespaces.zope.org/zope"
           xmlns:grok="http://namespaces.zope.org/grok"
           xmlns:mail="http://namespaces.zope.org/mail">

  <include package="zope.sendmail" file="meta.zcml" />
  <include package="zope.sendmail" />

  <grok:grok package="." />

  <mail:smtpMailer
      name="myapp.smtp"
      hostname="smtp.myhost.com"
      port="25"
      username="user@myhost.com"
      password="topsecret"
      />

  <mail:queuedDelivery
      name="myMailer"
      permission="zope.Public"
      mailer="myapp.smtp"
      queuePath="./mailqueue"
      />

</configure>

Example integration with grok

import grok
from zope.component import getUtility, getMultiAdapter
from interfaces import IMyMailer
from zope.sendmail.interfaces import IMailDelivery

import email.MIMEText
import email.Header
import email.utils

defaultSender = ( 'My app', 'user@myhost.org' )

class MyMail(grok.GlobalUtility):
    grok.implements( IMyMailer )

    def __init__(self, defaultSender = defaultSender):
        self.sender = defaultSender

    def send_mail(self, recipient, subject, body, sender = None, format = 'html'):
        ''' format can be 'html' or 'plain' for example '''
        if sender is None:
            sender = self.sender
        mailer = getUtility( IMailDelivery, 'myMailer' )
        msg = email.MIMEText.MIMEText( body.encode('UTF-8'), format, 'UTF-8' )
        msg["From"] = email.utils.formataddr( sender )
        msg["To"] = recipient
        msg["Subject"] = email.Header.Header(subject, 'UTF-8')
        mailer.send( sender[1], [recipient], msg.as_string() )

    def send_mail_with_view(self, context, request, viewname, recipient, defaultSubject, sender = None):
        view = getMultiAdapter( (context, request), name = viewname )
        if getattr( view, 'mailSubject', None ) is None:
            view.mailSubject = grok.title.bind().get(view, default = defaultSubject)
        mailBody = view()
        return self.send_mail( recipient, view.mailSubject, mailBody, sender, 'html' )

# somewhere in your app...
user = getUserHere()
mailer = getUtility( IMyMailer )
mailer.send_mail_with_view( PasswordReset(user, newPassword), self.request, 'passwordresetemail', user.email, 'MyApp - Password reset' )