Does the documentation mean what it says? The 3.1 library reference says quopri.encodestring takes a string, but feeding it a string results in an error.

quopri.encodestring(s[, quotetabs])
Like encode(), except that it accepts a source string and returns the corresponding encoded string.

However, feeding this a str results in an error

import quopri

enctext = quopri.encodestring('hello')

results in

TypeError: argument 1 must be bytes or buffer, not str.


Recommended Answers

All 5 Replies

The source string has to be a string of bytes, just like you would get from a binary read of a file.
So try:

import quopri

enctext = quopri.encodestring(b'hello')

Here is a mildly better example:

# using Python module quopri for MIME strings used in emails
# Python 3.1

import quopri

mystring = '\u00bfC\u00f3mo es usted?'
bytestring = mystring.encode("utf8")

# the MIME string you send
enctext = quopri.encodestring(bytestring)

# the MIME string you receive
dectext = quopri.decodestring(enctext)

# convert to printable regular string

"""my result -->
b'=C2=BFC=C3=B3mo es usted?'
<class 'bytes'>
b'\xc2\xbfC\xc3\xb3mo es usted?'
<class 'bytes'>
¿Cómo es usted?

Just imagine that the escaped bytes could be from an image source.

If you send unicode strings out, please notice that:

# a string with \u unicode characters
mystring = '\u00bfC\u00f3mo es usted?'
# or ...
mystring = "¿Cómo es usted?"
bytestring = mystring.encode("utf8")

This gives the same bytestring that can be used with quopri.encodestring(bytestring) in the code I mentioned. Bytestrings (bytearrays) are probably the reason why the unicode() function has been dropped from Python3.

# -*- coding: iso-8859-15 -*-

from email.mime.text import MIMEText
import quopri

mystring = "¿Cómo es usted?"
bytestring = mystring.encode("utf8")
enctext = quopri.encodestring(bytestring)

msg = MIMEText(enctext)

Fails with

Traceback (most recent call last):
File "", line 10, in <module>
msg = MIMEText(enctext)
File "C:\Program Files\python31\lib\email\mime\", line 30, in __init__
self.set_payload(_text, _charset)
File "C:\Program Files\python31\lib\email\", line 234, in set_payloa
File "C:\Program Files\python31\lib\email\", line 269, in set_charse
File "C:\Program Files\python31\lib\email\", line 60, in encode_7or
AttributeError: 'bytes' object has no attribute 'encode'

Same fate without the quopri line

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, learning, and sharing knowledge.