blob: 2e77e619e1d6281daa475b95025e17630d489ce5 [file] [log] [blame]
Guido van Rossum8b3febe2007-08-30 01:15:14 +00001# Copyright (C) 2001-2006 Python Software Foundation
2# Author: Barry Warsaw
3# Contact: email-sig@python.org
4
5"""Encodings and related functions."""
6
7__all__ = [
8 'encode_7or8bit',
9 'encode_base64',
10 'encode_noop',
11 'encode_quopri',
12 ]
13
Guido van Rossum8b3febe2007-08-30 01:15:14 +000014
Barry Warsaw8b2af272007-08-31 03:04:26 +000015from base64 import b64encode as _bencode
Guido van Rossum8b3febe2007-08-30 01:15:14 +000016from quopri import encodestring as _encodestring
17
18
19
20def _qencode(s):
21 enc = _encodestring(s, quotetabs=True)
22 # Must encode spaces, which quopri.encodestring() doesn't do
23 return enc.replace(' ', '=20')
24
25
Guido van Rossum8b3febe2007-08-30 01:15:14 +000026def encode_base64(msg):
27 """Encode the message's payload in Base64.
28
29 Also, add an appropriate Content-Transfer-Encoding header.
30 """
31 orig = msg.get_payload()
32 encdata = _bencode(orig)
33 msg.set_payload(encdata)
34 msg['Content-Transfer-Encoding'] = 'base64'
35
36
37
38def encode_quopri(msg):
39 """Encode the message's payload in quoted-printable.
40
41 Also, add an appropriate Content-Transfer-Encoding header.
42 """
43 orig = msg.get_payload()
44 encdata = _qencode(orig)
45 msg.set_payload(encdata)
46 msg['Content-Transfer-Encoding'] = 'quoted-printable'
47
48
49
50def encode_7or8bit(msg):
51 """Set the Content-Transfer-Encoding header to 7bit or 8bit."""
52 orig = msg.get_payload()
53 if orig is None:
54 # There's no payload. For backwards compatibility we use 7bit
55 msg['Content-Transfer-Encoding'] = '7bit'
56 return
57 # We play a trick to make this go fast. If encoding to ASCII succeeds, we
58 # know the data must be 7bit, otherwise treat it as 8bit.
59 try:
60 orig.encode('ascii')
61 except UnicodeError:
62 # iso-2022-* is non-ASCII but still 7-bit
63 charset = msg.get_charset()
64 output_cset = charset and charset.output_charset
65 if output_cset and output_cset.lower().startswith('iso-2202-'):
66 msg['Content-Transfer-Encoding'] = '7bit'
67 else:
68 msg['Content-Transfer-Encoding'] = '8bit'
69 else:
70 msg['Content-Transfer-Encoding'] = '7bit'
71
72
73
74def encode_noop(msg):
75 """Do nothing."""