def test_payload(): body = 'body\nmessage' ubody = u'bödy\nmessäge' enc8 = ('base64','quoted-printable','8bit') for uni in range(2): encodings = enc8 if uni else ['7bit'] for enc in encodings: msg = create_mail(sender,receiver,'subject', ubody if uni else body,charset='UTF-8' if uni else 'us-ascii', encoding=enc) txt = mail_payload(msg) if uni: assert txt == ubody else: assert txt == body txt = mail_payload(msg.as_string()) if uni: assert txt == ubody else: assert txt == body txt = mail_payload(mail_binary(msg)) if uni: assert txt == ubody else: assert txt == body binary = b'\xc3\n\xf1' for encoding in enc8: att = create_mime(binary,'application','octet-stream',encoding=encoding) msg = create_mail(sender,receiver,'subject',body,attach=[att]) cont = mail_payload(msg) assert len(cont)==2 and cont[0]==body and cont[1]==binary msg = mail_binary(msg) cont = mail_payload(msg) assert len(cont)==2 and cont[0]==body and cont[1]==binary with raises(UnicodeError): create_mime(binary,'application','octet-stream',encoding='7bit') body = b'body\nmessage' att = create_mime(body,'application','octet-stream',encoding='7bit') assert mail_payload(att)==body
def test_unicode(): from email.header import decode_header def get_header(msg,key): v = msg[key] v = decode_header(v)[0] v = v[0].decode(v[1]) return v usender = sender.replace('Foo',u'Föo') ureceiver = receiver.replace('Bar',u'Bär') usubject = u'sübject' body = 'body\nmessage' ubody = u'bödy\nmessage' msg = create_mail(usender,ureceiver,usubject,body,headers={'X-Spam':'No'}) assert get_header(msg,'From') == usender assert get_header(msg,'To') == ureceiver assert get_header(msg,'Subject') == usubject assert msg['X-Spam'] == 'No' assert msg.get_charset() == 'us-ascii' assert msg.get_payload(decode=False) == body msg = create_mail(sender,receiver,'subject',ubody) assert not msg['X-Spam'] _mail_addreplace_header(msg,'X-Spam','No') assert msg['X-Spam'] == 'No' _mail_addreplace_header(msg,'X-Spam','Yes') assert msg['X-Spam'] == 'Yes' assert msg.get_charset() == 'UTF-8' assert mail_payload(msg) == ubody attachment = 'some\nattachment' uattachment = u'söme\nattachment' attach=create_mime(attachment) uattach=create_mime(uattachment,charset='utf-8') for variant in range(1,4): unibody,uniatt = variant&1,variant&2 msg = create_mail(sender,receiver,'subject',ubody if unibody else body, attach=[uattach if uniatt else attach]) assert not msg.get_charset() submsg = msg.get_payload(0) if unibody: assert submsg.get_charset() == 'UTF-8' assert submsg.get_payload(decode=True).decode('UTF-8') == ubody else: assert submsg.get_charset() == 'us-ascii' assert submsg.get_payload(decode=False) == body submsg = msg.get_payload(1) if uniatt: assert submsg.get_charset() == 'UTF-8' assert submsg.get_payload(decode=True).decode('UTF-8') == uattachment else: assert submsg.get_charset() == 'us-ascii' assert submsg.get_payload(decode=False) == attachment
def attachments(): s = u'über\n1\n2' a0 = create_mime('uber') a1 = create_mime(s) a2 = create_mime(s,encoding='base64') a3 = create_mime(s,encoding='quoted-printable') a4 = create_mime(s,encoding='8bit') a5 = create_mime(s.encode('iso8859-1'),charset='iso8859-1') a6 = create_mime(s.encode('iso8859-1'),charset='iso8859-1',encoding='base64') a7 = create_mime(s.encode('iso8859-1'),charset='iso8859-1',encoding='quoted-printable') a8 = create_mime(s.encode('iso8859-1'),charset='iso8859-1',encoding='8bit') return [a0,a1,a2,a3,a4,a5,a6,a7,a8]
def test_uni_sign_attach(self,bilateral): usender = sender.replace('Foo','Föo') ureceiver = receiver.replace('Bar','Bär') attachment = create_mime(u'söme\nattachment',charset='utf-8') msgatt = create_mail(usender,ureceiver,u'sübject',u'bödy\nmessage', attach=[attachment],charset='utf-8') self.sign(bilateral, msgatt, inline=False)
def test_attach(): attachment = create_mime('some\nattachment') msg = create_mail(sender,receiver,'subject','body\nmessage',attach=[attachment]) # boundary is generated randomly by as_string - hardcode here msg.set_boundary('===============1808028167789866750==') prot = _protected(msg) assert prot.as_string() == msg.as_string() prot = protect_mail(msg,linesep='\n',sevenbit=True) assert prot.as_string() == msg.as_string()
def test_uni_sign_attach(self, bilateral): usender = sender.replace('Foo', 'Föo') ureceiver = receiver.replace('Bar', 'Bär') attachment = create_mime(u'söme\nattachment', charset='utf-8') msgatt = create_mail(usender, ureceiver, u'sübject', u'bödy\nmessage', attach=[attachment], charset='utf-8') self.sign(bilateral, msgatt, inline=False)
def encode_mail(sender, receiver, data): "data must be validated by check_mail" from kryptomime.mail import create_mail, create_mime, check_charset, protect_mail from time import time as epochtime import email.utils from email.mime.text import MIMEText from six import iteritems from idapi.models import Message subject = data['subject'] time = data.get('date') if not time: time = epochtime() parts = data.get('parts',None) if parts: # multi-part mail = None for i,part in enumerate(parts): ctype = part.get('content-type','text/plain').lower().split('/') encoding = part.get('content-encoding') content = part['content'] content, charset = check_charset(content,part.get('content-charset')) if not i: msg = create_mail(sender,receiver,subject,content,time=time,subtype=ctype[1], charset=charset,encoding=encoding,attach=[]) else: msg = create_mime(content,*ctype,charset=charset,encoding=encoding) filename= part.get('filename') filename = dict(filename=filename) if filename else {} msg.add_header('Content-Disposition', 'attachment', **filename) params = part.get('content-params',{}) if params: for k,v in iteritems(params): msg.set_param(k,v) if i: mail.attach(msg) else: mail = msg else: # single part ctype = data.get('content-type','text/plain').lower().split('/') encoding = data.get('content-encoding') body, charset = check_charset(data['content'],data.get('content-charset')) mail = create_mail(sender,receiver,subject,body,time=time,subtype=ctype[1], charset=charset,encoding=encoding) params = data.get('content-params',{}) if params: for k,v in iteritems(params): mail.set_param(k,v) return protect_mail(mail)
def encode_mail(msg, sender): from kryptomime.mail import create_mail, create_mime, check_charset from time import time as epochtime import email.utils from email.mime.text import MIMEText from six import iteritems from idapi.models import Message user, data = msg.user, msg.data receiver = user.email subject = data['subject'] time = data.get('date', epochtime()) parts = data.get('parts', None) if parts: # multi-part mail = None for i, part in enumerate(parts): ctype = part.get('content-type', 'text/plain').lower().split('/') encoding = part.get('content-encoding') content = part['content'] content, charset = check_charset(content, part.get('content-charset')) if i: msg = create_mime(content, *ctype, charset=charset, encoding=encoding) filename = part.get('filename') filename = dict(filename=filename) if filename else {} msg.add_header('Content-Disposition', 'attachment', **filename) else: assert ctype[0] == 'text' msg = create_mail(sender, receiver, subject, content, time=time, subtype=ctype[1], charset=charset, encoding=encoding) params = part.get('content-params', {}) if params: assert type(params) == dict for k, v in iteritems(params): msg.set_param(k, v) if i: mail.attach(msg) else: mail = msg else: # single part ctype = data.get('content-type', 'text/plain').lower().split('/') assert ctype[0] == 'text' encoding = data.get('content-encoding') body, charset = check_charset(data['content'], data.get('content-charset')) mail = create_mail(sender, receiver, subject, body, time=time, subtype=ctype[1], charset=charset, encoding=encoding) params = data.get('content-params', {}) if params: assert type(params) == dict for k, v in iteritems(params): mail.set_param(k, v) #print mail return mail