Skip to content

Commit 72be606

Browse files
authored
Merge pull request #152 from lavr/unicode_error
Encode message to bytes in smtp backend
2 parents 32a5a3c + 0dba9d6 commit 72be606

3 files changed

Lines changed: 29 additions & 9 deletions

File tree

emails/backend/smtp/backend.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,14 @@ def _send(self, **kwargs):
9191
response = None
9292
try:
9393
client = self.get_client()
94-
except IOError as exc:
95-
response = self.make_response(exception=SMTPConnectNetworkError.from_ioerror(exc))
96-
if not self.fail_silently:
97-
raise
9894
except smtplib.SMTPException as exc:
9995
response = self.make_response(exception=exc)
10096
if not self.fail_silently:
10197
raise
98+
except IOError as exc:
99+
response = self.make_response(exception=SMTPConnectNetworkError.from_ioerror(exc))
100+
if not self.fail_silently:
101+
raise
102102

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

120120
response = send(from_addr=from_addr,
121121
to_addrs=to_addrs,
122-
msg=msg.as_string(),
122+
msg=msg.as_bytes(),
123123
mail_options=mail_options or self.mail_options,
124124
rcpt_options=rcpt_options)
125125

emails/message.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,15 +332,21 @@ def as_string(self, message_cls=None):
332332
333333
Note: this method costs one less message-to-string conversions
334334
for dkim in compare to self.as_message().as_string()
335-
336-
Changes:
337-
v0.4.2: now returns bytes, not native string
338335
"""
339336
r = to_native(self.build_message(message_cls=message_cls).as_string())
340337
if self._signer:
341338
r = self.sign_string(r)
342339
return r
343340

341+
def as_bytes(self, message_cls=None):
342+
"""
343+
Returns message as bytes.
344+
"""
345+
r = self.build_message(message_cls=message_cls).as_bytes()
346+
if self._signer:
347+
r = self.sign_string(r)
348+
return r
349+
344350

345351
class MessageSendMixin(object):
346352

@@ -461,6 +467,12 @@ def sign_string(self, message_string):
461467
"""
462468
return self._signer.sign_message_string(message_string)
463469

470+
def sign_bytes(self, message_bytes):
471+
"""
472+
Add sign header to message-as-a-string
473+
"""
474+
return self._signer.sign_message_bytes(message_bytes)
475+
464476

465477
class Message(MessageSendMixin, MessageTransformerMixin, MessageSignMixin, MessageBuildMixin, BaseMessage):
466478
"""

emails/signers.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ def __init__(self, selector, domain, key=None, ignore_sign_errors=False, **kwarg
4040
'selector': to_bytes(selector)})
4141

4242
def get_sign_string(self, message):
43-
4443
try:
4544
# pydkim module parses message and privkey on each signing
4645
# this is not optimal for mass operations
@@ -52,6 +51,9 @@ def get_sign_string(self, message):
5251
else:
5352
raise
5453

54+
def get_sign_bytes(self, message):
55+
return self.get_sign_string(message)
56+
5557
def get_sign_header(self, message):
5658
# pydkim returns string, so we should split
5759
s = self.get_sign_string(message)
@@ -87,3 +89,9 @@ def sign_message_string(self, message_string):
8789
s = self.get_sign_string(to_bytes(message_string))
8890
return s and to_native(s) + message_string or message_string
8991

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

0 commit comments

Comments
 (0)