Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用MIMEBase将CSV附加到电子邮件,仅附加';bin';文件_Python_Csv_Email_Mime Mail - Fatal编程技术网

Python 使用MIMEBase将CSV附加到电子邮件,仅附加';bin';文件

Python 使用MIMEBase将CSV附加到电子邮件,仅附加';bin';文件,python,csv,email,mime-mail,Python,Csv,Email,Mime Mail,我想写一个函数,将csv文件附加到带有HTML文本的电子邮件中。一切正常。我发送了包含文本的电子邮件和包含正确信息的附件。只有数据格式是错误的。我在MIMEBASE('application','octetstream')中尝试了不同的变体。这个给了我一个'.bin'数据,我无法在macOS上打开它。其他人给了我一个包含正确数据的纯文本数据,但我不想手动将其复制到csv中。是否有人能解决我如何将数据导出为'.csv'?我在这里找到的大多数解决方案都与下面的代码类似 代码: def send_ma

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

代码:

def send_mail(收件人、主题、文件路径、附件名):
#登录信息
端口=123
smtp_server=“test.server.com”
login=“testlogin”#您的登录
password=“12345678910”#您的密码
#以HTML格式指定发件人和收件人的电子邮件地址和文本
发送方=”testmail@test.com"
接收器=接收器
message=MIMEMultipart()
消息[“主题”]=主题
邮件[“发件人”]=发件人
message[“To”]=COMMASPACE.join([receiver])
html_text=“”\
嗨,
问候

这是一封自动邮件

""" #将这两个部分转换为MIMEText对象,并将它们添加到MIMEMultipart消息中 text=MIMEText(html_text,“html”) 信息。附加(文本) #将文件添加为附件 文件=打开(文件路径,“rb”) att=MIMEBase('application','octet stream') att.set_有效负载(file.read()) 编码器。编码_base64(att) 附件添加标题(“内容处置”, “附件”,文件名=附件名) 留言。附件(att) 尝试: #使用上面指定的凭据发送您的邮件 使用smtplib.SMTP(SMTP_服务器,端口)作为服务器: 连接(smtp_服务器,端口) server.ehlo() server.starttls() server.ehlo() server.login(登录名,密码) server.sendmail(发送方、接收方、message.as_string()) #告诉脚本报告您的消息是否已发送,或者需要修复哪些错误 打印('已发送') 除了(gaierror,ConnectionRefusedError): 打印('连接到服务器失败。连接设置不正确?') 除了smtplib.SMTPServerDisconnected之外: 打印('连接到服务器失败。用户/密码错误?') 除了smtplib.SMTPException作为e: 打印('发生SMTP错误:'+str(e)) 寄信testmail@test.com“,”测试“,”/Users/Changer/Desktop/TEST.csv”,“TEST.csv”)
电子邮件客户端可能会使用附件部分的内容类型来确定用于打开附件的程序,因此指定合适的内容类型可能会有所帮助

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

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)
    ...
上述代码将为附件生成以下标题:

b'Content-Type:text/x-comma-separated-values'
b'MIME-Version:1.0'
b'Content-Transfer-Encoding:base64'
内容与处置:附件;filename=“test.csv”'
mac是否会使用电子表格应用程序打开csv(我假设这是您想要的)取决于机器的配置(参见示例)。如果希望确保在电子表格中打开文件,则将其转换为电子表格格式并发送电子表格可能会更有效

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)
    ...