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' )