def test_to_message_multipart_with_b64encoding(self): from pyramid_mailer.message import Message, Attachment response = Message( recipients=['To'], sender='From', subject='Subject', body='Body', html='Html' ) this = os.path.abspath(__file__) with open(this, 'rb') as data: attachment = Attachment( filename=this, content_type='application/octet-stream', disposition='disposition', transfer_encoding='base64', data=data, ) response.attach(attachment) message = response.to_message() payload = message.get_payload()[1] self.assertEqual(payload.get('Content-Transfer-Encoding'), 'base64') self.assertEqual( payload.get_payload(), _bencode(self._read_filedata(this, 'rb')).decode('ascii') )
def get_payload(self, i=None): # taken from http://hg.python.org/cpython/file/0926adcc335c/Lib/email/message.py # Copyright (C) 2001-2006 Python Software Foundation # See PY-LIC for licence if i is None: payload = self._payload elif not isinstance(self._payload, list): raise TypeError('Expected list, got %s' % type(self._payload)) else: payload = self._payload[i] if self.is_multipart(): return payload cte = self.get('content-transfer-encoding', '').lower() if cte == 'quoted-printable': return encoders._qencode(payload) elif cte == 'base64': try: return encoders._bencode(payload) except binascii.Error: # Incorrect padding return payload elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): sfp = StringIO() try: uu.encode(StringIO(payload + '\n'), sfp, quiet=True) payload = sfp.getvalue() except uu.Error: # Some decoding problem return payload # Everything else, including encodings with 8bit or 7bit are returned # unchanged. return payload
def test_to_message_multipart_with_b64encoding(self): from tgext.mailer.message import Message, Attachment response = Message( recipients=['To'], sender='From', subject='Subject', body='Body', html='Html' ) this = os.path.abspath(__file__) with open(this, 'rb') as data: attachment = Attachment( filename=this, content_type='application/octet-stream', disposition='disposition', transfer_encoding='base64', data=data, ) response.attach(attachment) message = response.to_message() payload = message.get_payload()[1] self.assertEqual(payload.get('Content-Transfer-Encoding'), 'base64') self.assertEqual( payload.get_payload(), _bencode(self._read_filedata(this, 'rb')).decode('ascii') )
def get_payload(self, i=None): # taken from http://hg.python.org/cpython/file/0926adcc335c/Lib/email/message.py # Copyright (C) 2001-2006 Python Software Foundation # See PY-LIC for licence if i is None: payload = self._payload elif not isinstance(self._payload, list): raise TypeError('Expected list, got %s' % type(self._payload)) else: payload = self._payload[i] if self.is_multipart(): return payload cte = self.get('content-transfer-encoding', '').lower() if cte == 'quoted-printable': return encoders._qencode(payload) elif cte == 'base64': try: return encoders._bencode(payload) except binascii.Error: # Incorrect padding return payload elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): sfp = StringIO() try: uu.encode(StringIO(payload+'\n'), sfp, quiet=True) payload = sfp.getvalue() except uu.Error: # Some decoding problem return payload # Everything else, including encodings with 8bit or 7bit are returned # unchanged. return payload
def test_body_is_text_base64(self): from email.encoders import _bencode text_encoded = b'LaPe\xf1a' result = self._callFUT('base64', text_encoded) self.assertEqual( result, _bencode(text_encoded) )
def transfer_encode(encoding, payload): # payload must be bytes encoding = encoding.lower() if encoding == 'base64': return _bencode(payload) elif encoding == 'quoted-printable': return _qencode(payload) else: raise RuntimeError('Unknown transfer encoding %s' % encoding)
def test_to_message_with_html_attachment(self): from pyramid_mailer.message import Message, Attachment response = Message(recipients=["To"], sender="From", subject="Subject", body="Body") attachment = Attachment(data=b"data", content_type="text/html") response.attach(attachment) message = response.to_message() att_payload = message.get_payload()[1] self.assertEqual(att_payload["Content-Type"], 'text/html; charset="us-ascii"') self.assertEqual(att_payload.get_payload(), _bencode(b"data").decode("ascii"))
def addAttachFile(self, src): with open(src, 'rb') as fp: try: attach = MIMEText(_bencode(fp.read()), 'base64', 'utf-8') except Exception as e: print(e) filename = src.split('/')[-1] attach["Context-Type"] = "application/octet-stream" attach["Content-Disposition"] = "attachment; filename=" + filename attach.replace_header('Content-Transfer-Encoding', 'base64') return attach
def test_to_message_with_binary_attachment(self): from pyramid_mailer.message import Message, Attachment response = Message(recipients=["To"], sender="From", subject="Subject", body="Body") data = os.urandom(100) attachment = Attachment(data=data, content_type="application/octet-stream") response.attach(attachment) message = response.to_message() att_payload = message.get_payload()[1] self.assertEqual(att_payload["Content-Type"], "application/octet-stream") self.assertEqual(att_payload.get_payload(), _bencode(data).decode("ascii"))
def encode_base64(msg): """Encode the message's payload in Base64. Also, add an appropriate Content-Transfer-Encoding header. """ orig = msg.get_payload(decode=True) # it is likely decode=True did nothing and orig is still unicode data # (we expect bytes) acording to py2 implementation if isinstance(orig, unicode): orig = fix_payload_decode(orig) encdata = unicode(_bencode(orig), 'ascii') msg.set_payload(encdata) msg['Content-Transfer-Encoding'] = 'base64'
def test_body_is_text_ct_is_nontext_no_charset(self): mail = self._makeBase() mail.set_content_type("application/octet-stream") mail.set_body(b"foo".decode("ascii")) # XXX note that if we dont set the transfer encoding, it will still # be encoded using bas64 but using a codec that doesnt strip the last # character on py27 (but not on py33). mail.set_transfer_encoding("base64") result = self._callFUT(mail) self.assertEqual(result["Content-Type"], 'application/octet-stream; charset="utf-8"') self.assertEqual(result["Content-Transfer-Encoding"], "base64") payload = result.get_payload() self.assertEqual(payload, _bencode(b"foo").decode("ascii"))
def test_body_is_text_ct_is_nontext_no_charset(self): mail = self._makeBase() mail.set_content_type('application/octet-stream') mail.set_body(b'foo'.decode('ascii')) # XXX note that if we dont set the transfer encoding, it will still # be encoded using bas64 but using a codec that doesnt strip the last # character on py27 (but not on py33). mail.set_transfer_encoding('base64') result = self._callFUT(mail) self.assertEqual(result['Content-Type'], 'application/octet-stream; charset="utf-8"') self.assertEqual(result['Content-Transfer-Encoding'], 'base64') payload = result.get_payload() self.assertEqual(payload, _bencode(b'foo').decode('ascii'))
def test_to_message_with_html_attachment(self): from pyramid_mailer.message import Message, Attachment response = Message( recipients=['To'], sender='From', subject='Subject', body='Body', ) attachment = Attachment(data=b'data', content_type='text/html') response.attach(attachment) message = response.to_message() att_payload = message.get_payload()[1] self.assertEqual(att_payload['Content-Type'], 'text/html; charset="us-ascii"') self.assertEqual(att_payload.get_payload(), _bencode(b'data').decode('ascii'))
def transfer_encode(encoding, payload): # payload must be bytes encoding = encoding.lower() if encoding == 'base64': return _bencode(payload) elif encoding == 'quoted-printable': return _qencode(payload) elif encoding == '7bit': try: text_type(payload, 'ascii') except UnicodeDecodeError: raise RuntimeError('Payload contains an octet that is not 7bit safe') return payload elif encoding == '8bit': return payload else: raise RuntimeError('Unknown transfer encoding %s' % encoding)
def test_to_message_multipart_with_b64encoding(self): from pyramid_mailer.message import Message, Attachment response = Message(recipients=["To"], sender="From", subject="Subject", body="Body", html="Html") this = os.path.abspath(__file__) data = open(this, "rb") attachment = Attachment( filename=this, content_type="application/octet-stream", disposition="disposition", transfer_encoding="base64", data=data, ) response.attach(attachment) message = response.to_message() payload = message.get_payload()[1] self.assertEqual(payload.get("Content-Transfer-Encoding"), "base64") self.assertEqual(payload.get_payload(), _bencode(self._read_filedata(this, "rb")).decode("ascii"))
def test_to_message_with_binary_attachment(self): from pyramid_mailer.message import Message, Attachment response = Message( recipients=['To'], sender='From', subject='Subject', body='Body', ) data = os.urandom(100) attachment = Attachment( data=data, content_type='application/octet-stream', ) response.attach(attachment) message = response.to_message() att_payload = message.get_payload()[1] self.assertEqual(att_payload['Content-Type'], 'application/octet-stream') self.assertEqual(att_payload.get_payload(), _bencode(data).decode('ascii'))
def test_to_message_with_html_attachment(self): from pyramid_mailer.message import Message, Attachment response = Message( recipients=['To'], sender='From', subject='Subject', body='Body', ) attachment = Attachment( data=b'data', content_type='text/html' ) response.attach(attachment) message = response.to_message() att_payload = message.get_payload()[1] self.assertEqual( att_payload['Content-Type'], 'text/html; charset="us-ascii"' ) self.assertEqual( att_payload.get_payload(), _bencode(b'data').decode('ascii') )
def test_to_message_with_binary_attachment(self): from pyramid_mailer.message import Message, Attachment response = Message( recipients=['To'], sender='From', subject='Subject', body='Body', ) data = os.urandom(100) attachment = Attachment( data=data, content_type='application/octet-stream', ) response.attach(attachment) message = response.to_message() att_payload = message.get_payload()[1] self.assertEqual( att_payload['Content-Type'], 'application/octet-stream' ) self.assertEqual( att_payload.get_payload(), _bencode(data).decode('ascii') )