'Set the charset of the payload to a given character set.
charset can be a Charset instance, a string naming a character set, or
None.  If it is a string it will be converted to a Charset instance.
If charset is None, the charset parameter will be removed from the
Content-Type field.  Anything else will generate a TypeError.
The message will be assumed to be of type text/* encoded with
charset.input_charset.  It will be converted to charset.output_charset
and encoded properly, if needed, when generating the plain text
representation of the message.  MIME headers (MIME-Version,
Content-Type, Content-Transfer-Encoding) will be added as needed.'

def set_charset(self, charset):

    if (charset is None):
        self.del_param('charset')
        self._charset = None
        return
    if isinstance(charset, basestring):
        charset = email.charset.Charset(charset)
    if (not isinstance(charset, email.charset.Charset)):
        raise TypeError(charset)
    self._charset = charset
    if ('MIME-Version' not in self):
        self.add_header('MIME-Version', '1.0')
    if ('Content-Type' not in self):
        self.add_header('Content-Type', 'text/plain', charset=charset.get_output_charset())
    else:
        self.set_param('charset', charset.get_output_charset())
    if isinstance(self._payload, unicode):
        self._payload = self._payload.encode(charset.output_charset)
    if (str(charset) != charset.get_output_charset()):
        self._payload = charset.body_encode(self._payload)
    if ('Content-Transfer-Encoding' not in self):
        cte = charset.get_body_encoding()
        try:
            cte(self)
        except TypeError:
            self._payload = charset.body_encode(self._payload)
            self.add_header('Content-Transfer-Encoding', cte)
