我想写一个函数,用HTML文本将csv文件附加到电子邮件中。一切都很好。我发送带有文本的电子邮件和带有正确信息的附件。只有数据格式错误。我在MIMEBASE('application', 'octet-stream')
中尝试了不同的品种。这个给了我一个'.bin'数据,我无法在macOS上打开。其他人给了我一个包含正确数据的纯文本数据,但我不想手动将其复制到csv中。有人能解决我如何以'.csv'的形式获取数据的问题吗?我在这里找到的大多数解决方案看起来就像下面的代码。
代码:
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')
电子邮件客户端可以使用附件部分的内容类型来确定使用哪个程序打开附件,因此指定合适的内容类型可能会有所帮助。
这段代码使用标准库的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'
b'Content_Disposition: attachment; filename="test.csv"'
mac是否会用电子表格应用程序打开csv(我想这就是你想要的(取决于机器的配置(参见本博客中的示例(。如果你想确保在电子表格中打开文件,那么将其转换为电子表格格式并发送电子表格可能会更有效。