在python3中使用smtplib发送XML内容

2024-09-24 16:36:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用smtplib中的smtplib发送XML内容。在

以下是我的代码:

#!/usr/bin/python


import smtplib
import os

fromAddress = "adipratapsingh.aps@gmail.com"
toAddress = "adirameshwarsingh.ars@gmail.com"

msg = "From: Aditya Thakur<"+fromAddress+">\r\n"
msg = msg + "To: Aditya Singh<"+toAddress+">\r\n"
msg = msg + "Reply-To: Aditya Thakur<"+fromAddress+">\r\n"
msg = msg + "Content-Type: text/xml\r\n"
msg = msg + "Subject: Python mail\r\n"
msg = msg + "\r\n"
msg = msg + """
<xml version="1.0" encoding="utf-8">
<Name>
    <Firstname>Aditya</Firstname>
    <Middlename>Rameshwarpratap</Middlename>
    <Lastname>Singh</Lastname>
</Name>  
"""

server = smtplib.SMTP("smtp.gmail.com:587")
server.starttls()
server.login(fromAddress, os.getenv("GMAIL_APP_PASSWORD"))
server.sendmail(fromAddress, toAddress, msg)
server.quit()

这段代码可以很好地处理普通的文本邮件和HTML邮件。我还可以向客户机发送XML内容。在

但问题是,这个XMl内容是以文件(附件)的形式发送的,名为“noname”,我无法为其指定任何文件名。它的名字是“noname”,没有任何扩展名。因此,我的客户甚至无法在不将其重命名为“的情况下查看它。”非名称.xml". 有什么方法可以为我发送的XML文件指定一个名称吗?在

第二,当我的客户将文件重命名为“非名称.xml,浏览器中会弹出一个错误

^{pr2}$

为什么?在

注意:我只想使用smtplib而不使用其他任何东西。在


Tags: 文件代码import名称com内容servermsg
1条回答
网友
1楼 · 发布于 2024-09-24 16:36:07

这是个有趣的问题。您的邮件正是您想要发送的内容,以XML数据为主体,并且是完全正确的(只有在邮件头后面多出一行空行)。如果您使用了来自smtpd模块的DebuggingServer,那么您可以控制它被发送为:

From: Aditya Thakur<adipratapsingh.aps@gmail.com>
To: Aditya Singh<adirameshwarsingh.ars@gmail.com>
Reply-To: Aditya Thakur<adipratapsingh.aps@gmail.com>
Content-Type: text/xml
Subject: Python mail
X-Peer: 127.0.0.1


<xml version="1.0" encoding="utf-8">
<Name>
    <Firstname>Aditya</Firstname>
    <Middlename>Rameshwarpratap</Middlename>
    <Lastname>Singh</Lastname>
</Name>

但问题是邮件阅读器通常只处理纯文本(dynosaurs只使用这种格式)或HTML文本或附件的多部分。所以在这里,你的客户的邮件阅读器错误地将身体声明为一个附件,因为它找不到名字,所以说它是noname。在

你可以建议你的客户使用一个更好的阅读器,严格遵守标准(我绝不会这么做!)或者使用标准Python库中的email模块构建一条大多数读者都能理解的消息:一条纯文本介绍消息,以及作为附件连接的XML文件。在


关于客户机为什么不能打开XML文件的问题,这仅仅是因为第一行是错误的。正确的行应该有?

^{pr2}$

所以您需要手工构建一个包含附加XML文件的邮件。使用email模块会更简单,但是由于XML文件只是一个文本文件,所以可以避免使用base64编码。您必须:

  • 创建多部分消息
  • 为简介文本添加文本/纯文本部分
  • 为xml文件添加一个application/xml部分

正如我已经说过的,emailPython模块可以为您做到这一点,但是您也可以手动完成这项工作,前提是您将Content-Transfert-Encoding强制为8位以避免任何base64编码。代码变成:

import smtplib

fromAddress = "adipratapsingh.aps@gmail.com"
toAddress = "adirameshwarsingh.ars@gmail.com"
boundary = "===============nextPart=="
msg = 'Content-Type: multipart/mixed; boundary="' + boundary + '"\n'
msg += "MIME-Version: 1.0\r\n"
msg += "From: Aditya Thakur<"+fromAddress+">\n"
msg += "To: Aditya Singh<"+toAddress+">\n"
msg += "Reply-To: Aditya Thakur<"+fromAddress+">\n"
msg += "Subject:  Python mail\n"
msg += "\nThis is a multipart message\n"

# intro text
msg += ' ' + boundary + "\n"
msg += '''Content-Type: text/plain; charset="utf8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

Here is the expected XML file.
'''

# attached xml
msg += ' ' + boundary + "\n"
msg += '''MIME-Version: 1.0
Content-Transfer-Encoding: 8bits
Content-Disposition: attachement; filename="filename.xml"
Content-Type: application/xml; name="filename.xml"; charset="utf-8"

'''
msg += '''<?xml version="1.0" encoding="utf-8"?>
<Name>
    <Firstname>Aditya</Firstname>
    <Middlename>Rameshwarpratap</Middlename>
    <Lastname>Singh</Lastname>
</Name> 
'''
msg += ' ' + boundary + "\n"

# send the mail
server = smtplib.SMTP("smtp.gmail.com:587")
server.starttls()
server.login(fromAddress, os.getenv("GMAIL_APP_PASSWORD"))
server.sendmail(fromAddress, toAddress, msg)
server.quit()
server.close()

相关问题 更多 >