##// END OF EJS Templates
merge 1.3 into stable
merge 1.3 into stable

File last commit:

r1904:69e95ad5 beta
r2031:82a88013 merge default
Show More
message.py
182 lines | 4.9 KiB | text/x-python | PythonLexer
Notification fixes...
r1717 from rhodecode.lib.rcmail.response import MailResponse
from rhodecode.lib.rcmail.exceptions import BadHeaders
from rhodecode.lib.rcmail.exceptions import InvalidMessage
class Attachment(object):
"""
Encapsulates file attachment information.
:param filename: filename of attachment
:param content_type: file mimetype
:param data: the raw file data, either as string or file obj
:param disposition: content-disposition (if any)
"""
auto white-space removal
r1818 def __init__(self,
filename=None,
content_type=None,
Notification fixes...
r1717 data=None,
auto white-space removal
r1818 disposition=None):
Notification fixes...
r1717
self.filename = filename
self.content_type = content_type
self.disposition = disposition or 'attachment'
self._data = data
@property
def data(self):
if isinstance(self._data, basestring):
return self._data
self._data = self._data.read()
return self._data
class Message(object):
"""
Encapsulates an email message.
:param subject: email subject header
:param recipients: list of email addresses
:param body: plain text message
:param html: HTML message
:param sender: email sender address
:param cc: CC list
:param bcc: BCC list
:param extra_headers: dict of extra email headers
:param attachments: list of Attachment instances
Changed default recipients separator for mails to ', '
r1846 :param recipients_separator: alternative separator for any of
'From', 'To', 'Delivered-To', 'Cc', 'Bcc' fields
Notification fixes...
r1717 """
auto white-space removal
r1818 def __init__(self,
subject=None,
recipients=None,
body=None,
html=None,
Notification fixes...
r1717 sender=None,
cc=None,
bcc=None,
extra_headers=None,
Changed default recipients separator for mails to ', '
r1846 attachments=None,
recipients_separator="; "):
Notification fixes...
r1717
self.subject = subject or ''
self.sender = sender
self.body = body
self.html = html
self.recipients = recipients or []
self.attachments = attachments or []
self.cc = cc or []
self.bcc = bcc or []
self.extra_headers = extra_headers or {}
Changed default recipients separator for mails to ', '
r1846 self.recipients_separator = recipients_separator
Notification fixes...
r1717 @property
def send_to(self):
return set(self.recipients) | set(self.bcc or ()) | set(self.cc or ())
def to_message(self):
"""
Returns raw email.Message instance.Validates message first.
"""
auto white-space removal
r1818
Notification fixes...
r1717 self.validate()
return self.get_response().to_message()
def get_response(self):
"""
Creates a Lamson MailResponse instance
"""
auto white-space removal
r1818 response = MailResponse(Subject=self.subject,
Notification fixes...
r1717 To=self.recipients,
From=self.sender,
Body=self.body,
Changed default recipients separator for mails to ', '
r1846 Html=self.html,
separator=self.recipients_separator)
Notification fixes...
r1717
if self.cc:
response.base['Cc'] = self.cc
for attachment in self.attachments:
auto white-space removal
r1818 response.attach(attachment.filename,
attachment.content_type,
attachment.data,
Notification fixes...
r1717 attachment.disposition)
response.update(self.extra_headers)
return response
auto white-space removal
r1818
Notification fixes...
r1717 def is_bad_headers(self):
"""
Checks for bad headers i.e. newlines in subject, sender or recipients.
"""
auto white-space removal
r1818
Notification fixes...
r1717 headers = [self.subject, self.sender]
headers += list(self.send_to)
headers += self.extra_headers.values()
for val in headers:
for c in '\r\n':
if c in val:
return True
return False
auto white-space removal
r1818
Notification fixes...
r1717 def validate(self):
"""
Checks if message is valid and raises appropriate exception.
"""
if not self.recipients:
raise InvalidMessage, "No recipients have been added"
if not self.body and not self.html:
raise InvalidMessage, "No body has been set"
if not self.sender:
raise InvalidMessage, "No sender address has been set"
if self.is_bad_headers():
raise BadHeaders
def add_recipient(self, recipient):
"""
Adds another recipient to the message.
auto white-space removal
r1818
Notification fixes...
r1717 :param recipient: email address of recipient.
"""
auto white-space removal
r1818
Notification fixes...
r1717 self.recipients.append(recipient)
def add_cc(self, recipient):
"""
auto white-space removal
r1818 Adds an email address to the CC list.
Notification fixes...
r1717
:param recipient: email address of recipient.
"""
self.cc.append(recipient)
def add_bcc(self, recipient):
"""
auto white-space removal
r1818 Adds an email address to the BCC list.
Notification fixes...
r1717
:param recipient: email address of recipient.
"""
self.bcc.append(recipient)
def attach(self, attachment):
"""
Adds an attachment to the message.
:param attachment: an **Attachment** instance.
"""
self.attachments.append(attachment)