Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions emails/backend/smtp/backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,14 +91,14 @@ def _send(self, **kwargs):
response = None
try:
client = self.get_client()
except IOError as exc:
response = self.make_response(exception=SMTPConnectNetworkError.from_ioerror(exc))
if not self.fail_silently:
raise
except smtplib.SMTPException as exc:
response = self.make_response(exception=exc)
if not self.fail_silently:
raise
except IOError as exc:
response = self.make_response(exception=SMTPConnectNetworkError.from_ioerror(exc))
if not self.fail_silently:
raise

if response:
if not self.fail_silently:
Expand All @@ -119,7 +119,7 @@ def sendmail(self, from_addr, to_addrs, msg, mail_options=None, rcpt_options=Non

response = send(from_addr=from_addr,
to_addrs=to_addrs,
msg=msg.as_string(),
msg=msg.as_bytes(),
mail_options=mail_options or self.mail_options,
rcpt_options=rcpt_options)

Expand Down
18 changes: 15 additions & 3 deletions emails/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,15 +332,21 @@ def as_string(self, message_cls=None):

Note: this method costs one less message-to-string conversions
for dkim in compare to self.as_message().as_string()

Changes:
v0.4.2: now returns bytes, not native string
"""
r = to_native(self.build_message(message_cls=message_cls).as_string())
if self._signer:
r = self.sign_string(r)
return r

def as_bytes(self, message_cls=None):
"""
Returns message as bytes.
"""
r = self.build_message(message_cls=message_cls).as_bytes()
if self._signer:
r = self.sign_string(r)
return r


class MessageSendMixin(object):

Expand Down Expand Up @@ -461,6 +467,12 @@ def sign_string(self, message_string):
"""
return self._signer.sign_message_string(message_string)

def sign_bytes(self, message_bytes):
"""
Add sign header to message-as-a-string
"""
return self._signer.sign_message_bytes(message_bytes)


class Message(MessageSendMixin, MessageTransformerMixin, MessageSignMixin, MessageBuildMixin, BaseMessage):
"""
Expand Down
10 changes: 9 additions & 1 deletion emails/signers.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ def __init__(self, selector, domain, key=None, ignore_sign_errors=False, **kwarg
'selector': to_bytes(selector)})

def get_sign_string(self, message):

try:
# pydkim module parses message and privkey on each signing
# this is not optimal for mass operations
Expand All @@ -52,6 +51,9 @@ def get_sign_string(self, message):
else:
raise

def get_sign_bytes(self, message):
return self.get_sign_string(message)

def get_sign_header(self, message):
# pydkim returns string, so we should split
s = self.get_sign_string(message)
Expand Down Expand Up @@ -87,3 +89,9 @@ def sign_message_string(self, message_string):
s = self.get_sign_string(to_bytes(message_string))
return s and to_native(s) + message_string or message_string

def sign_message_bytes(self, message_bytes):
"""
Insert DKIM header to message bytes
"""
s = self.get_sign_bytes(message_bytes)
return s and to_bytes(s) + message_bytes or message_bytes