17db96d56Sopenharmony_ci# Copyright (C) 2001-2006 Python Software Foundation 27db96d56Sopenharmony_ci# Author: Barry Warsaw 37db96d56Sopenharmony_ci# Contact: email-sig@python.org 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci"""Encodings and related functions.""" 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci__all__ = [ 87db96d56Sopenharmony_ci 'encode_7or8bit', 97db96d56Sopenharmony_ci 'encode_base64', 107db96d56Sopenharmony_ci 'encode_noop', 117db96d56Sopenharmony_ci 'encode_quopri', 127db96d56Sopenharmony_ci ] 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_cifrom base64 import encodebytes as _bencode 167db96d56Sopenharmony_cifrom quopri import encodestring as _encodestring 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_cidef _qencode(s): 217db96d56Sopenharmony_ci enc = _encodestring(s, quotetabs=True) 227db96d56Sopenharmony_ci # Must encode spaces, which quopri.encodestring() doesn't do 237db96d56Sopenharmony_ci return enc.replace(b' ', b'=20') 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_cidef encode_base64(msg): 277db96d56Sopenharmony_ci """Encode the message's payload in Base64. 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci Also, add an appropriate Content-Transfer-Encoding header. 307db96d56Sopenharmony_ci """ 317db96d56Sopenharmony_ci orig = msg.get_payload(decode=True) 327db96d56Sopenharmony_ci encdata = str(_bencode(orig), 'ascii') 337db96d56Sopenharmony_ci msg.set_payload(encdata) 347db96d56Sopenharmony_ci msg['Content-Transfer-Encoding'] = 'base64' 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_cidef encode_quopri(msg): 397db96d56Sopenharmony_ci """Encode the message's payload in quoted-printable. 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci Also, add an appropriate Content-Transfer-Encoding header. 427db96d56Sopenharmony_ci """ 437db96d56Sopenharmony_ci orig = msg.get_payload(decode=True) 447db96d56Sopenharmony_ci encdata = _qencode(orig) 457db96d56Sopenharmony_ci msg.set_payload(encdata) 467db96d56Sopenharmony_ci msg['Content-Transfer-Encoding'] = 'quoted-printable' 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ci 507db96d56Sopenharmony_cidef encode_7or8bit(msg): 517db96d56Sopenharmony_ci """Set the Content-Transfer-Encoding header to 7bit or 8bit.""" 527db96d56Sopenharmony_ci orig = msg.get_payload(decode=True) 537db96d56Sopenharmony_ci if orig is None: 547db96d56Sopenharmony_ci # There's no payload. For backwards compatibility we use 7bit 557db96d56Sopenharmony_ci msg['Content-Transfer-Encoding'] = '7bit' 567db96d56Sopenharmony_ci return 577db96d56Sopenharmony_ci # We play a trick to make this go fast. If decoding from ASCII succeeds, 587db96d56Sopenharmony_ci # we know the data must be 7bit, otherwise treat it as 8bit. 597db96d56Sopenharmony_ci try: 607db96d56Sopenharmony_ci orig.decode('ascii') 617db96d56Sopenharmony_ci except UnicodeError: 627db96d56Sopenharmony_ci msg['Content-Transfer-Encoding'] = '8bit' 637db96d56Sopenharmony_ci else: 647db96d56Sopenharmony_ci msg['Content-Transfer-Encoding'] = '7bit' 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_cidef encode_noop(msg): 697db96d56Sopenharmony_ci """Do nothing.""" 70