def insert_header(self, _pos, _name, _value, **_params): parts = [] for k, v in _params.items(): if v is None: parts.append(k.replace("_", "-")) else: parts.append(_formatparam(k.replace("_", "-"), v)) if _value is not None: parts.insert(0, _value) self._headers.insert(_pos, (_name, SEMISPACE.join(parts)))
def get_mime_object(self): # encode the filename; if this isn't done manually ahead of time, # email.Header.encode encodes the entire header as UTF-8 if the # filename portion can't be ASCII, which isn't the preferred approach filename, charset = _encode_text(self.name) if charset: filename = Charset(charset).header_encode(self.name) # guess the content type based on the file's extension ctype, encoding = mimetypes.guess_type(self.name) if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) # create the appropriate object; not including the "name" portion # here because the Content-Type header must remain as a string for # the message flattening process and that prevents fixing the header if maintype == 'text': text, charset = _encode_text(self.get_data(binary=False)) obj = MIMEText(text, _subtype=subtype, _charset=charset) elif maintype == 'image': obj = MIMEImage(self.get_data(), _subtype=subtype) elif maintype == 'audio': obj = MIMEAudio(self.get_data(), _subtype=subtype) else: obj = MIMEBase(maintype, subtype) obj.set_payload(self.get_data()) encoders.encode_base64(obj) # add the filename; using Header directly for potentially long # headers since MIMEMultipart overrides its default space folding # character with a hard tab, which Outlook 2003 and earlier (and # possibly other email clients) doesn't unfold back into a space obj['Content-Disposition'] = Header(SEMISPACE.join(['attachment', _formatparam('filename', filename)]), header_name='Content-Disposition') # remove the MIME-Version (not needed for every attachment) if 'MIME-Version' in obj: del obj['MIME-Version'] # return the object return obj
def prepend_header(self, _name: str, _value: str, **_params: Union[str, Sequence[str]]) -> None: """Extended header setting. Like add_header, but prepends the header. This is useful for Received:. Examples: msg.add_header('content-disposition', 'attachment', filename='bud.gif') msg.add_header('content-disposition', 'attachment', filename=('utf-8', '', Fußballer.ppt')) msg.add_header('content-disposition', 'attachment', filename='Fußballer.ppt')) """ parts = [] for k, v in _params.items(): if v is None: parts.append(k.replace('_', '-')) else: parts.append(_formatparam(k.replace('_', '-'), v)) if _value is not None: parts.insert(0, _value) self.prepend(_name, SEMISPACE.join(parts))