2

添付ファイル付きのメールを送信しようとしていますが、何らかの理由で添付ファイルが Outlook を使用しているユーザーに表示されません。

gmail を使用しているユーザーにメールを転送すると、gmail で問題なく表示されます。
Gmail ユーザーが電子メールを Outlook ユーザーに転送すると、Outlook に表示されます (おそらく gmail がメッセージを再構築するため)。

これは、電子メールを送信するために使用しているコードです。

def send_email(headers={}, attachments=[], body={}):
    ADDRESS_HEADERS = set(['from', 'to', 'cc', 'bcc', 'reply-to'])
    msg = MIMEMultipart('alternative')
    msg.preamble = "You need a MIME-aware email client to read this email.\n"

    def add_headers():
        def encode_address(v):
            (name, address) = parseaddr(v)
            name = str(Header(unicode(name), 'utf-8'))
            address = address.encode('ascii')
            return formataddr((name, address))

        for key, value in headers.iteritems():
            if not isinstance(value, list):
                value = [value]
            if key.lower() in ADDRESS_HEADERS:
                value = map(encode_address, value)
            msg[key.title()] = u';'.join(value)

    def set_body():
        msg.attach(MIMEText(body.get('text', ''), 'plain', _charset='utf-8'))
        if 'html' in body:
            msg.attach(MIMEText(body['html'], 'html', _charset='utf-8'))

    def attach_file(attachment):
        maintype, subtype = attachment['mimetype'].split("/", 1)
        part = MIMEBase(maintype, subtype)
        filename = attachment['filename']
        name = attachment.get('name', os.path.basename(filename))
        with open(filename, 'rb') as f:
            part.set_payload(f.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', 'attachment', filename=name)
        msg.attach(part)

    add_headers()
    map(attach_file, attachments)
    set_body()
    composed = msg.as_string()

    p = subprocess.Popen("sendmail -t", shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    (stdout, stderr) = p.communicate(composed)
    if p.returncode != 0:
        raise IOError(u'{}\n\n{}'.format(stdout, stderr).strip())

電子メールの実装が断片化されているため、関連情報を見つけるのは非常に困難です。

添付するファイルは、MIME タイプの Excel ファイルですapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet

使用されている Outlook のバージョンに関する詳細情報を探しています。

4

3 に答える 3