使用 MIMEBase 将 CSV 附加到电子邮件,仅附加“bin"文档 [英] Attach CSV to E-Mail with MIMEBase, only attaches 'bin' document

查看:24
本文介绍了使用 MIMEBase 将 CSV 附加到电子邮件,仅附加“bin"文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想编写一个函数,将一个 csv 文件附加到带有 HTML 文本的电子邮件中.一切正常.我发送带有文本和附件的电子邮件,其中包含正确的信息.只是数据格式不对.我在 MIMEBASE('application', 'octet-stream') 中尝试了不同的变体.这给了我一个 '.bin' 数据,我无法在 macOS 上打开它.其他人给了我一个包含正确数据的纯文本数据,但我不想手动将其复制到 csv 中.有人有解决方案如何将数据导出为 '.csv' 吗?我在这里找到的大多数解决方案看起来都像我下面的代码.

I want to write a function to attach a csv file to an E-Mail with HTML text. Everything works fine. I sends the E-Mail with the text and the attachment with the right information. Only the data format is wrong. I tried different varieties in MIMEBASE('application', 'octet-stream'). This one gives me a '.bin' data which I cannot open on macOS. Others gave me a plain text data which included the right data, but I don't wanna copy it manually into a csv. Does someone have a solution how I get out the data as '.csv'? Most of the solutions I found here just looked like my code below.

代码:

def send_mail(receiver, subject, filepath, attachname):
    
    #login information
    port = 123
    smtp_server = "test.server.com"
    login = "testlogin" # your login 
    password = "12345678910" # your password 

    # specify the sender’s and receiver’s email addresses and text in HTML
    sender = "testmail@test.com"
    receiver = receiver
    message = MIMEMultipart()
    message["Subject"] = subject
    message["From"] = sender
    message["To"] = COMMASPACE.join([receiver])
    html_text = """
    <html>
      <body>
        <p>Hi ,<br>
        <p>kind regards</p>
        <p> This is an automatized Mail </p>
      </body>
    </html>
    """
    # convert both parts to MIMEText objects and add them to the MIMEMultipart message
    text = MIMEText(html_text, "html")
    message.attach(text)
    
    #add a file as attachment
    file = open(filepath, "rb")
    att = MIMEBase('application', 'octet-stream')
    att.set_payload(file.read())
    encoders.encode_base64(att)
    att.add_header("Content_Disposition",
                    'attachment', filename = attachname)
    message.attach(att)
    try:
        #send your message with credentials specified above
        with smtplib.SMTP(smtp_server, port) as server:
            server.connect(smtp_server, port)
            server.ehlo()
            server.starttls()
            server.ehlo()
            server.login(login, password)
            server.sendmail(sender, receiver, message.as_string())

        # tell the script to report if your message was sent or which errors need to be fixed 
        print('Sent')
    except (gaierror, ConnectionRefusedError):
        print('Failed to connect to the server. Bad connection settings?')
    except smtplib.SMTPServerDisconnected:
        print('Failed to connect to the server. Wrong user/password?')
    except smtplib.SMTPException as e:
        print('SMTP error occurred: ' + str(e))

send_mail('testmail@test.com', 'TEST', '/Users/Changer/Desktop/test.csv', 'test.csv')

推荐答案

电子邮件客户端可能会使用附件部分的内容类型来确定使用哪个程序打开附件,因此指定合适的内容类型可能会有所帮助.

Email clients may use the content type of the attachment part to determine which program is used to open the attachment, so specifying a suitable content type may help.

此代码使用标准库的 mimetypes 模块尝试根据其名称猜测附件的正确内容类型:

This code uses the standard library's mimetypes module to try to guess the correct content type of the attachment, based on its name:

import mimetypes

mimetypes.init()

def send_mail(receiver, subject, filepath, attachname):
    ...

    mimetype, _ = mimetypes.guess_type(attachname)
    if mimetype is None:
        mimetype = 'application/octet-stream'
    type_, _, subtype = mimetype.partition('/')
    att = MIMEBase(type_, subtype)
    ...

上面的代码将为附件生成这些标题:

The above code will generate these headers for the attachment:

b'Content-Type: text/x-comma-separated-values'
b'MIME-Version: 1.0'
b'Content-Transfer-Encoding: base64'
b'Content_Disposition: attachment; filename="test.csv"'

mac 是否会用电子表格应用程序打开 csv(我假设这就是你想要的)取决于机器的配置(见 此博客 为例).如果您想确保在电子表格中打开文件,将其转换为电子表格格式并发送电子表格可能更有效.

Whether a mac will open a csv with a spreadsheet application (I assume this is what you want) depends on the configuration of the machine (See this blog for an example). If you want to be sure open the file in a spreadsheet it might be more effective to convert it to a spreadsheet format and send the spreadsheet.

这篇关于使用 MIMEBase 将 CSV 附加到电子邮件,仅附加“bin"文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆