##// END OF EJS Templates
html: move "Submit a bug" to make it more clear that it is for RhodeCode, not the repo...
html: move "Submit a bug" to make it more clear that it is for RhodeCode, not the repo RhodeCode _could_ contain a bug tracker and this link _could_ be for filing bugs for the hosted projects. Moving the link to the RhodeCode info makes it more clear that it is for RhodeCode bugs. The server instance is however something local, not directly related to the upstream.

File last commit:

r2452:d95ef658 beta
r3779:e61a656b beta
Show More
message.py
183 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
fixes #481 rhodecode emails are sent without Date header...
r2452
Notification fixes...
r1717 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:
fixes #481 rhodecode emails are sent without Date header...
r2452 raise InvalidMessage("No recipients have been added")
Notification fixes...
r1717
if not self.body and not self.html:
fixes #481 rhodecode emails are sent without Date header...
r2452 raise InvalidMessage("No body has been set")
Notification fixes...
r1717
if not self.sender:
fixes #481 rhodecode emails are sent without Date header...
r2452 raise InvalidMessage("No sender address has been set")
Notification fixes...
r1717
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)