def decode_param(param):
name, v = param.split('=', 1)
values = v.split('\n')
value_results = []
for value in values:
match = re.search(r'=\?((?:\w|-)+)\?(Q|B)\?(.+)\?=', value)
if match:
encoding, type_, code = match.groups()
if type_ == 'Q':
value = quopri.decodestring(code)
elif type_ == 'B':
value = base64.decodestring(code)
value = str_encode(value, encoding)
value_results.append(value)
if value_results:
v = ''.join(value_results)
logger.debug("Decoded parameter {} - {}".format(name, v))
return name, v
python类decodestring()的实例源码
def decode(message_part):
content_transfer_encoding = message_part.part["Content-Transfer-Encoding"]
content_type = message_part.part["Content-Type"]
payload = message_part.part.get_payload()
if content_transfer_encoding == "base64":
payload = base64.b64decode(payload)
elif content_transfer_encoding == "quoted-printable":
payload = quopri.decodestring(payload)
# payload is already properly decoded, usually happens in plain text emails
if isinstance(payload, str):
return payload
# payload is text, decode with proper charset
if is_text(content_type):
return payload.decode(get_charset(content_type))
# payload is probably binary, don't do anything else
return payload
def decodeFileName(self, name):
# http://code.google.com/p/googleappengine/issues/detail?id=2749
# Open since Sept. 2010, claimed to be fixed in Version 1.7.2 (September 18, 2012)
# and still totally broken
try:
if name.startswith("=?"): #RFC 2047
return unicode( email.Header.make_header(email.Header.decode_header(name + "\n")))
elif "=" in name and not name.endswith("="): #Quoted Printable
return decodestring(name.encode("ascii")).decode("UTF-8")
else: #Maybe base64 encoded
return b64decode(name.encode("ascii")).decode("UTF-8")
except: #Sorry - I cant guess whats happend here
if isinstance(name, str) and not isinstance(name, unicode):
try:
return name.decode("UTF-8", "ignore")
except:
pass
return name
def decode(input_str):
result = ''
search_result = re.search('=\?([^\?]*)\?([^\?]*)\?([^\?]*)\?=', input_str)
while search_result is not None:
charset, tp, text = search_result.groups()
s = search_result.start(0)
e = search_result.end(0)
text = text.encode('cp866', 'ignore').decode('cp866', 'ignore')
result += input_str[:s]
input_str = input_str[e:].lstrip()
if tp.lower() != 'q':
result += base64.b64decode(text.encode('cp866')).decode(charset, 'ignore')
else:
result += quopri.decodestring(text).decode(charset, 'ignore')
search_result = re.search('=\?([^\?]*)\?([^\?]*)\?([^\?]*)\?=', input_str)
else:
result += input_str
return result
def decode_transfer_encoding(encoding, body):
if encoding == 'base64':
return _base64_decode(body)
elif encoding == 'quoted-printable':
return quopri.decodestring(body)
else:
return body
def format_mail(loop, msg, to_text=True, ignore_tables=True):
"""Format the mail to markdown
Parameter
---------
msg: email.message
to_text: bool, optional
Convert text/html mails to text/plain with markdown formatting
Returns
-------
text: str
"""
h = html2text.HTML2Text()
h.ignore_tables = ignore_tables
body = None
for part in msg.walk():
if to_text and part.get_content_type() == "text/html":
body = h.handle(quopri.decodestring(part.get_payload()).decode())
break
elif part.get_content_type() == "text/plain":
body = quopri.decodestring(part.get_payload())
break
if not body:
log.error("Could not find text body mail")
body = quopri.decodestring(msg.as_string())
text = f"### {msg['Subject']} \n {body}"
return text
def test_decodestring(self):
for p, e in self.STRINGS:
self.assertEqual(quopri.decodestring(e), p)
def test_idempotent_string(self):
for p, e in self.STRINGS:
self.assertEqual(quopri.decodestring(quopri.encodestring(e)), e)
def test_embedded_ws(self):
for p, e in self.ESTRINGS:
self.assertEqual(quopri.encodestring(p, quotetabs=True), e)
self.assertEqual(quopri.decodestring(e), p)
def test_decode_header(self):
for p, e in self.HSTRINGS:
self.assertEqual(quopri.decodestring(e, header=True), p)
def test_decodestring(self):
for p, e in self.STRINGS:
self.assertTrue(quopri.decodestring(e) == p)
def test_idempotent_string(self):
for p, e in self.STRINGS:
self.assertTrue(quopri.decodestring(quopri.encodestring(e)) == e)
def test_embedded_ws(self):
for p, e in self.ESTRINGS:
self.assertTrue(quopri.encodestring(p, quotetabs=True) == e)
self.assertTrue(quopri.decodestring(e) == p)
def test_decode_header(self):
for p, e in self.HSTRINGS:
self.assertTrue(quopri.decodestring(e, header=True) == p)
def test_decodestring(self):
for p, e in self.STRINGS:
self.assertTrue(quopri.decodestring(e) == p)
def test_idempotent_string(self):
for p, e in self.STRINGS:
self.assertTrue(quopri.decodestring(quopri.encodestring(e)) == e)
def test_embedded_ws(self):
for p, e in self.ESTRINGS:
self.assertTrue(quopri.encodestring(p, quotetabs=True) == e)
self.assertTrue(quopri.decodestring(e) == p)
def test_decode_header(self):
for p, e in self.HSTRINGS:
self.assertTrue(quopri.decodestring(e, header=True) == p)
def test_decodestring(self):
for p, e in self.STRINGS:
self.assertEqual(quopri.decodestring(e), p)
def test_idempotent_string(self):
for p, e in self.STRINGS:
self.assertEqual(quopri.decodestring(quopri.encodestring(e)), e)
def test_embedded_ws(self):
for p, e in self.ESTRINGS:
self.assertEqual(quopri.encodestring(p, quotetabs=True), e)
self.assertEqual(quopri.decodestring(e), p)
def test_decode_header(self):
for p, e in self.HSTRINGS:
self.assertEqual(quopri.decodestring(e, header=True), p)
def test_decodestring(self):
for p, e in self.STRINGS:
self.assertTrue(quopri.decodestring(e) == p)
def test_idempotent_string(self):
for p, e in self.STRINGS:
self.assertTrue(quopri.decodestring(quopri.encodestring(e)) == e)
def test_embedded_ws(self):
for p, e in self.ESTRINGS:
self.assertTrue(quopri.encodestring(p, quotetabs=True) == e)
self.assertTrue(quopri.decodestring(e) == p)
def test_decode_header(self):
for p, e in self.HSTRINGS:
self.assertTrue(quopri.decodestring(e, header=True) == p)
def test_decodestring(self):
for p, e in self.STRINGS:
self.assertEqual(quopri.decodestring(e), p)
def test_decodestring_double_equals(self):
# Issue 21511 - Ensure that byte string is compared to byte string
# instead of int byte value
decoded_value, encoded_value = (b"123=four", b"123==four")
self.assertEqual(quopri.decodestring(encoded_value), decoded_value)
def test_idempotent_string(self):
for p, e in self.STRINGS:
self.assertEqual(quopri.decodestring(quopri.encodestring(e)), e)
def test_embedded_ws(self):
for p, e in self.ESTRINGS:
self.assertEqual(quopri.encodestring(p, quotetabs=True), e)
self.assertEqual(quopri.decodestring(e), p)