Python email.parser 开发中
Python email.parser in development
在 Python 中使用 email.parser 包的最佳方式是什么?我有一个外部托管的网络服务器,我也可以发送电子邮件,但是这个开发过程非常乏味,我觉得我应该在本地做一些事情。
有人有什么建议吗?
编辑
我希望能够从电子邮件中提取图像附件,看来我可以测试它的唯一方法是编写一些代码,将其放在我的网络服务器上,给自己发送一些电子邮件,然后检查发生了什么.我希望在本地模仿这个过程。
你到底想做什么?您目前使用服务器做什么?
您可以使用 email.parser.FeedParser.feed(...)
从字符串传递电子邮件。所以你可以只在本地存储一些电子邮件并以这种方式提供它们:
import email.parser
parser = email.parser.FeedParser()
email = '''\
From: Steve <steve@steve.steve>
To: Someone <someone@foo.com>
Subject: Hey what's up
This is a dummy email, no server involved.
'''
parser.feed(email)
msg = parser.close()
print "To:", msg['to']
print "From:", msg['from']
print "Subject:", msg['subject']
print "Body:", repr(msg.get_payload())
输出:
$ python x.py
To: Someone <someone@foo.com>
From: Steve <steve@steve.steve>
Subject: Hey what's up
Body: 'This is a dummy email, no server involved.\n'
编辑:为回应您关于提取附件(例如图像)的评论,电子邮件附件在 MIME standard 之后。您可以复制原始电子邮件(取决于您使用的客户端和服务器),也可以按照标准手动构建自己的电子邮件。
以下是附有 PNG 文件的电子邮件示例:
import email.parser
parser = email.parser.FeedParser()
email = '''\
From: Steve <steve@steve.steve>
To: Someone <someone@foo.com>
Subject: Hey what's up
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=_boundary
This is a message with multiple parts in MIME format.
--_boundary
Content-Type: text/plain
This is the body of the message. No mail server involved.
--_boundary
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=test.png;
Content-Transfer-Encoding: base64
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
bWFnZVJlYWR5ccllPAAAA29JREFUeNosU21oW1UYfs459yPJTZY0SZfFtWnXDzs7BMXBRLY/Ey1M
GIp/KlP3cwgOEcThfoj4Z4whMkGnv1ScFoQVRSmr1hWtOh0rY8zRtdOsTZNtTVqTtLlJ7r059/g2
9cLh3nt43+d9Ps5h9vRZgHMwKDCfQ63+1cec+SNcrYxAlocAxZXouK2Q+FEFhr9k2x+9BeXCZwLw
fTB7+n1AmGBSauz+9yeF+PuEtuvJEEs9AQTTIGSgUYQq/QmZnXRabtcHKnX4baUHmpAOWH3mHJQS
guc+OW+m2Ch7+C1gWy/QagCei/aj6YARAjYKUDfPwM2vTcju488zwZtc6TGw0sS7ZrI6yvYcJzYt
3Lr8DYrZKwSQB1WjnL+GmzPjhGSD7X4FRpof4sXx95QeAfftu8O6M/UayxykhiJkdQE/ffURZqcu
kMYVsmAF13/5DpOfnUVzbY5qCmDdB6Gr34/569l9Giq/vaAlQxY5SNP+QbVkI+iX4dcLQD1LHjC4
1RzCvIby/Xmku+MEKiE6Y4KtzRzVhLfwFCzS5y4ROklFHaQNGquRebNtE3Veab9Ntkh7/xIzUhMK
QhSz+wkgPwCRIoB7FKdCOMDQs6cT6XQAkDZNAzIDEbjEJB6hf4eAFaExHULde4A1v4iWzH4r6Ukd
rtuAFaOOsLEVX8vfSoEYtTdqDuwKg2EEoGs+vDvVVc3TM3Mmu3FgcUlg/NsedA1oiFoFWGGHClub
BChNDfWaiYq9E4XbHp57NofBQQmX9y9rdf7QxXDjxoH4Dgm1ox+Rx0+gI7YNVsCAqbM2AcfzoTc8
tKrr8DdOI566Q14ATey+pJXjh8Zi5R/eSAxXOvYOTmH2/FVEe4dgdT6IaLKrzWB9NQ+7uIDq0jz2
7q8g0UXq5kKNcnTkc3b110tIlC682Rv58LTcpVP+PspzcvN6QKr/LaDl03fHkMBjT3OIJQ/L5aOn
ittfPsn++PkiFZrYWTr3cU/y62N+hiOXM1DKSviNLRNFgCPZJ5Dp8cCXJfLFZ8aWO19/kXPps8vT
E2QwhyMNJCqTr/Zrn74TTBcTiBCDTRokQigav0Ga78bXs95Lp0qxw2cMzZOMDtQWwKbTdJWbyoJo
rqYTzpXRuLo2EmaLfWCK1fzMYoU9MrVm7BvzgqmcyeoweKvd958AAwAU0nrZgWbiHgAAAABJRU5E
rkJggg==
--_boundary--
'''
parser.feed(email)
msg = parser.close()
print "To:", msg['to']
print "From:", msg['from']
print "Subject:", msg['subject']
print "Body:", repr(msg.get_payload())
print ""
for payload in msg.get_payload():
filename = payload.get_filename()
if filename:
print "Got an attachment: %r" % filename,
print "that is %r bytes long." % len(payload.get_payload().decode('base64'))
else:
print "Got a message: %r" % payload.get_payload()
当我将该文件写入磁盘时,它是一个有效的 PNG 文件:
$ python -i x.py
>>> open('x.png', 'wb').write(payload.get_payload().decode('base64'))
$ file x.png
x.png: PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced
在 Python 中使用 email.parser 包的最佳方式是什么?我有一个外部托管的网络服务器,我也可以发送电子邮件,但是这个开发过程非常乏味,我觉得我应该在本地做一些事情。
有人有什么建议吗?
编辑
我希望能够从电子邮件中提取图像附件,看来我可以测试它的唯一方法是编写一些代码,将其放在我的网络服务器上,给自己发送一些电子邮件,然后检查发生了什么.我希望在本地模仿这个过程。
你到底想做什么?您目前使用服务器做什么?
您可以使用 email.parser.FeedParser.feed(...)
从字符串传递电子邮件。所以你可以只在本地存储一些电子邮件并以这种方式提供它们:
import email.parser
parser = email.parser.FeedParser()
email = '''\
From: Steve <steve@steve.steve>
To: Someone <someone@foo.com>
Subject: Hey what's up
This is a dummy email, no server involved.
'''
parser.feed(email)
msg = parser.close()
print "To:", msg['to']
print "From:", msg['from']
print "Subject:", msg['subject']
print "Body:", repr(msg.get_payload())
输出:
$ python x.py
To: Someone <someone@foo.com>
From: Steve <steve@steve.steve>
Subject: Hey what's up
Body: 'This is a dummy email, no server involved.\n'
编辑:为回应您关于提取附件(例如图像)的评论,电子邮件附件在 MIME standard 之后。您可以复制原始电子邮件(取决于您使用的客户端和服务器),也可以按照标准手动构建自己的电子邮件。
以下是附有 PNG 文件的电子邮件示例:
import email.parser
parser = email.parser.FeedParser()
email = '''\
From: Steve <steve@steve.steve>
To: Someone <someone@foo.com>
Subject: Hey what's up
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=_boundary
This is a message with multiple parts in MIME format.
--_boundary
Content-Type: text/plain
This is the body of the message. No mail server involved.
--_boundary
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=test.png;
Content-Transfer-Encoding: base64
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
bWFnZVJlYWR5ccllPAAAA29JREFUeNosU21oW1UYfs459yPJTZY0SZfFtWnXDzs7BMXBRLY/Ey1M
GIp/KlP3cwgOEcThfoj4Z4whMkGnv1ScFoQVRSmr1hWtOh0rY8zRtdOsTZNtTVqTtLlJ7r059/g2
9cLh3nt43+d9Ps5h9vRZgHMwKDCfQ63+1cec+SNcrYxAlocAxZXouK2Q+FEFhr9k2x+9BeXCZwLw
fTB7+n1AmGBSauz+9yeF+PuEtuvJEEs9AQTTIGSgUYQq/QmZnXRabtcHKnX4baUHmpAOWH3mHJQS
guc+OW+m2Ch7+C1gWy/QagCei/aj6YARAjYKUDfPwM2vTcju488zwZtc6TGw0sS7ZrI6yvYcJzYt
3Lr8DYrZKwSQB1WjnL+GmzPjhGSD7X4FRpof4sXx95QeAfftu8O6M/UayxykhiJkdQE/ffURZqcu
kMYVsmAF13/5DpOfnUVzbY5qCmDdB6Gr34/569l9Giq/vaAlQxY5SNP+QbVkI+iX4dcLQD1LHjC4
1RzCvIby/Xmku+MEKiE6Y4KtzRzVhLfwFCzS5y4ROklFHaQNGquRebNtE3Veab9Ntkh7/xIzUhMK
QhSz+wkgPwCRIoB7FKdCOMDQs6cT6XQAkDZNAzIDEbjEJB6hf4eAFaExHULde4A1v4iWzH4r6Ukd
rtuAFaOOsLEVX8vfSoEYtTdqDuwKg2EEoGs+vDvVVc3TM3Mmu3FgcUlg/NsedA1oiFoFWGGHClub
BChNDfWaiYq9E4XbHp57NofBQQmX9y9rdf7QxXDjxoH4Dgm1ox+Rx0+gI7YNVsCAqbM2AcfzoTc8
tKrr8DdOI566Q14ATey+pJXjh8Zi5R/eSAxXOvYOTmH2/FVEe4dgdT6IaLKrzWB9NQ+7uIDq0jz2
7q8g0UXq5kKNcnTkc3b110tIlC682Rv58LTcpVP+PspzcvN6QKr/LaDl03fHkMBjT3OIJQ/L5aOn
ittfPsn++PkiFZrYWTr3cU/y62N+hiOXM1DKSviNLRNFgCPZJ5Dp8cCXJfLFZ8aWO19/kXPps8vT
E2QwhyMNJCqTr/Zrn74TTBcTiBCDTRokQigav0Ga78bXs95Lp0qxw2cMzZOMDtQWwKbTdJWbyoJo
rqYTzpXRuLo2EmaLfWCK1fzMYoU9MrVm7BvzgqmcyeoweKvd958AAwAU0nrZgWbiHgAAAABJRU5E
rkJggg==
--_boundary--
'''
parser.feed(email)
msg = parser.close()
print "To:", msg['to']
print "From:", msg['from']
print "Subject:", msg['subject']
print "Body:", repr(msg.get_payload())
print ""
for payload in msg.get_payload():
filename = payload.get_filename()
if filename:
print "Got an attachment: %r" % filename,
print "that is %r bytes long." % len(payload.get_payload().decode('base64'))
else:
print "Got a message: %r" % payload.get_payload()
当我将该文件写入磁盘时,它是一个有效的 PNG 文件:
$ python -i x.py
>>> open('x.png', 'wb').write(payload.get_payload().decode('base64'))
$ file x.png
x.png: PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced