如果检测到的电子邮件是一个“传递状态通知”,并提取信息 - 的Python

我使用Python的email模块来解析电子邮件。

我需要能够告诉如果邮件是一个“传递状态通知”,摸清现状是什么,对提取失败的电子邮件,例如信息。 主题。

与.parsestr(电子邮件)解析后,我得到的对象是这样的:

{'Content-Transfer-Encoding': 'quoted-printable', 'Content-Type': 'text/plain; charset=ISO-8859-1', 'Date': 'Mon, 14 Mar 2011 11:26:24 +0000', 'Delivered-To': 'sender@gmail.com', 'From': 'Mail Delivery Subsystem <mailer-daemon@googlemail.com>', 'MIME-Version': '1.0', 'Message-ID': '<000e08jf90sd9f00e6f943f@google.com>', 'Received': 'by 10.142.13.8 with SMTP id 8cs63078wfm;\r\n Mon, 14 Mar 2011 04:26:24 -0700 (PDT)', 'Return-Path': '<>', 'Subject': 'Delivery Status Notification (Failure)', 'To': 'sender@gmail.com', 'X-Failed-Recipients': 'recipient@gmail.com'}

首先,我怎么知道,这是不使用该主题的正则表达式一个DSN?

其次 ,我怎么访问电子邮件的正文和信息,例如,是由邮件服务器返回的错误?

编辑:摸索出我需要使用.get_payload()得到消息的内容。

电子邮件文档说:

解析器类在其公共接口没有差别。 它确实有一些额外的智慧来识别消息/交货状态类型的消息 ,它代表了一个Message实例包含独立的子部分的消息在传递状态通知每头块


更新:

基本上,我需要能够可靠检测到的电子邮件是DSN,然后还要提取原始消息,所以我可以解析与email.Parser(),并得到有关它的信息。

--------------解决方案-------------

你所引用的文档表示该消息是多部分,如果它是DSN:

import email

msg = email.message_from_string(emailstr)

if (msg.is_multipart() and len(msg.get_payload()) > 1 and
msg.get_payload(1).get_content_type() == 'message/delivery-status'):
# email is DSN
print(msg.get_payload(0).get_payload()) # human-readable section

for dsn in msg.get_payload(1).get_payload():
print('action: %s' % dsn['action']) # eg, "failed", "delivered"

if len(msg.get_payload()) > 2:
print(msg.get_payload(2)) # original message

交货状态通知(自RFC 3464)的格式:

A DSN is a MIME message with a top-level content-type of
multipart/report (defined in [REPORT]). When a multipart/report
content is used to transmit a DSN:

(a) The report-type parameter of the multipart/report content is
"delivery-status".

(b) The first component of the multipart/report contains a human-
readable explanation of the DSN, as described in [REPORT].

(c) The second component of the multipart/report is of content-type
message/delivery-status, described in section 2.1 of this
document.

(d) If the original message or a portion of the message is to be
returned to the sender, it appears as the third component of the
multipart/report.

我不使用Python,但我认为Gmail的提高了其支持的DSN,因为我的测试是全成:

您可以在样品中看到下面这与“内容类型:多重/报告;报告类型=交货状态”一多部分消息。

我找出可靠的,这是一个DSN方式:

  • 第一行是“回归路径:<>”
  • 内容类型为“多部分/报告”和“报告类型=交货状态”

然后,我知道:

  • 该报告的内容是符合的Content-Type =“消息/交货状态”部分
  • 状态和行动领域总是出现在报告中的内容。
  • 注意状态字段可以比其它状态,最终出现在诊断代码字段(非强制)不太精确。 但是,下面的示例是好的(在各领域的地位相同)
  • 原消息与内容类型=“消息/ RFC822”的部分。 有时,MTA没有内容只返回原始邮件头。 在这种情况下,内容类型是“text / RFC822报头”。

后发送到test-dsn-failure@gmail.com电子邮件收到样品DSN:

Return-path: <>
Received: from xxx ([xxx])
by xxx with ESMTP; Fri, 04 May 2012 16:18:13 +0200
From: <Mailer-Daemon@xxx> (Mail Delivery System)
To: xxx
Subject: Undelivered Mail Returned to Sender
Date: Fri, 04 May 2012 15:25:09 +0200
MIME-Version: 1.0
Content-Type: multipart/report; report-type=delivery-status;
boundary="HTB3nt3RR7vw/QMPR4kDPbKg+XWjXIKdC/rfHQ=="

This is a MIME-encapsulated message.

--HTB3nt3RR7vw/QMPR4kDPbKg+XWjXIKdC/rfHQ==
Content-Description: Notification
Content-Type: text/plain

I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.

For further assistance, please send mail to <postmaster@xxx>

If you do so, please include this problem report. You can
delete your own text from the attached returned message.

<test-dsn-failure@gmail.com>: 550-5.1.1 The email account that you tried to reach does not exist. Please try
550-5.1.1 double-checking the recipient's email address for typos or
550-5.1.1 unnecessary spaces. Learn more at
550 5.1.1 http://support.google.com/mail/bin/answer.py?answer=6596 t12si10077186weq.36

--HTB3nt3RR7vw/QMPR4kDPbKg+XWjXIKdC/rfHQ==
Content-Description: Delivery report
Content-Type: message/delivery-status

Reporting-MTA: dns; xxx
Arrival-Date: Fri, 04 May 2012 15:25:09 +0200

Final-Recipient: rfc822; test-dsn-failure@gmail.com
Status: 5.1.1
Action: failed
Last-Attempt-Date: Fri, 04 May 2012 15:25:09 +0200
Diagnostic-Code: smtp; 550-5.1.1 The email account that you tried to reach does not exist. Please try
550-5.1.1 double-checking the recipient's email address for typos or
550-5.1.1 unnecessary spaces. Learn more at
550 5.1.1 http://support.google.com/mail/bin/answer.py?answer=6596 t12si10077186weq.36

--HTB3nt3RR7vw/QMPR4kDPbKg+XWjXIKdC/rfHQ==
Content-Description: Undelivered Message
Content-Type: message/rfc822

[original message...]

X-Failed-Recipients头似乎是确定的Gmail DSN的最快方式。 在此之后,看来你必须分析文本/纯文本内容。

分类:蟒蛇 时间:2012-01-01 人气:0
本文关键词: 电子邮件,蟒蛇
分享到:

相关文章

  • 接收和蟒蛇发送电子邮件 2013-05-03

    我怎么能接受和蟒蛇发送电子邮件? 各种各样的"邮件服务器". 我期待到做一个应用程序,听,看它是否临危一封电子邮件给foo@bar.domain.com,并发送邮件给发件人. 现在,我能够做到这一切的蟒蛇,会是最好使用第三​​方库? --------------解决方案------------- 这是一个很简单的例子: import smtplib server = 'mail.server.com' user = '' password = '' recipients = ['use

  • 蟒蛇的AppEngine发送电子邮件API被标记为Gmail电子邮件阅读器SPAM 2014-01-02

    我们使用AppEngine上的蟒蛇send_mail API发送电子邮件. 有没有办法告诉为什么只发送到一个收件人的邮件将被标记为垃圾邮件. 这似乎在AppEngine上的蟒蛇send_mail API发送到Gmail中才会发生. 在我们的例子中,我们发送电子邮件作为我们的AppEngine应用程序的管理员之一. 而电子邮件是用户刚刚购买的订单确认函,所以它肯定是不是垃圾邮件. 任何人都可以帮助呢? 这似乎很奇怪,因为它是唯一的,似乎是报告此问题的Gmail用户,我们从AppEngine上发送(

  • 蟒蛇CGI电子邮件动态输出为文本文件附件 2014-06-17

    我试图发送使用具有标准从,身体等,但是这是我的问题来在我的python脚本接受一个字符串信息和操作它(添加,删除,格式化等)蟒蛇电子邮件我我想借此输出并把它作为即时的附件. 我知道我可以转储输出到一个文本文件,然后将其附加到电子邮件. 然而,由于这个CGI脚本的安全性,我不能写CGI目录. 有没有一种方法可以动态地创建一个文本文件对象,并把它作为附件? 使用Python SMTP模块. 我不能因为权限创建一个传统的静态文本文件. 我想看看Python是能够创建在执行时,我可以填充数据,然后附加到

  • 蟒蛇 - 自动回复电子邮件 2014-10-29

    我想创建后缀管Python脚本自动回复HTML邮件:别名文件的示例: testmail: "| python /opt/script/autoreply.py /opt/script/autoreply.html" 该autoreply.html将包含HTML电子邮件. 有一个从蟒蛇的例子:http://docs.python.org/library/email-examples.html#id5 发送替代MimeMultipart的 我想用这个例子给我的脚本. 这个想法是加载auto

  • 蟒蛇 - 解析电子邮件 - 特殊字符 2012-01-06

    我可以利用一些帮助阅读电子邮件,在它和输出的字符的电子邮件特殊字符. 到目前为止,我亲眼目睹电子邮件来与字符集:"UTF-8","窗口-1252","ISO-8859-1" 我见过 'hey' 表示为 =91hey=92 和 '',""=hey÷½Öñ♦→%@¥÷ 表示为 =E2=80=98=E2=80=99,=E2=80=9C=E2=80=9D=3Dhey=C3=B7=C2=BD=C3=96=C3=B1=E2=99=A6=E

  • 蟒蛇 - 抓住电子邮件附件的盘? 2012-03-20

    我有一大堆的电子邮件500,每个附件. 我想编写一个Python脚本,将通过所有电子邮件中滚动,并保存这些附件到磁盘. 我怎么做呢? 另外,想我可以选择哪些电子邮件程序将用于检索POP3服务器中的消息-这将是最好使用Evolution? Thunderbird?一些其他的计划? --------------解决方案------------- 有没有必要使用一个电子邮件客户端,让您的电子邮件,而不是当Python有一个完美的cromulent poplib模块模块也为解析出的附件的电子邮件模块.

  • 谷歌应用程序引擎蟒蛇超时发送电子邮件 2012-04-27

    我的脚本抓住一个RSS页面的内容获取的URL在页面并将它们保存到一个列表,然后它抓住每一个URL的内容并将其电子邮件的页面的内容给我. 一切都工作得非常好接受我无法发送列表中的每一个环节. 列表中的典型地为约22连结. 我并不希望将多个网站的内容组合成一个电子邮件. 如果我不加超时我得到这样一个超过配额错误 <class 'google.appengine.runtime.apiproxy_errors.OverQuotaError'>: The API call mail.Send() re

  • 蟒蛇瓶 - 登录用的电子邮件地址,用户名不 2012-05-01

    我希望用户与他们的电子邮件地址登录,不能用的用户名. 有多容易做,与瓶? 我在哪里可以找到一个例子吗? --------------解决方案------------- 您可以使用瓶的flaskr例子(存在于以下例子瓶混帐回购协议),并重新命名的用户名有电子邮件.

  • 改变蟒蛇的行为未处理的异常发送电子邮件 2012-05-03

    我想改变在python未处理的异常(全部)的行为,以发送电子邮件而无需更改代码非常多,或使用特殊的错误处理程序无处不在. 我的希望是子类异常,然后在给定的模块开始重新定义它. 因此,子类是在这里: class ExceptionMailer(Exception): def __init__(self, m): self.message = m send_email(email_address,self.message) 然后,在该模块我能做到这一点的开头: Exception = Excepti

  • 确保接触形式的电子邮件不会丢失(蟒蛇) 2012-05-28

    我有一个接触形式的网站. 用户提交的姓名,电子邮件和消息,该网站的邮件我的详细信息. 很偶然我的服务器有问题,它的电子邮件系统,因此用户得到一个错误,这些联系方式都将丢失. (不要说:获得更好的服务器,所有服务器都可以有偶尔的电子邮件下去,我们得到了很多意见书). 我想实现,可以存储用户的详细信息,如果该邮件发送函数将返回错误代码的系统. 然后在每个进一步意见,检查任何存储提交,并尝试送不送我. 但是,如何存储数据? 我使用python,所以我想过使用搁置(单个文件半数据库). 或许有人会提出一

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.837 (s). 10 q(s)