代码之家  ›  专栏  ›  技术社区  ›  Manuel Ceron

用Python解析电子邮件

  •  13
  • Manuel Ceron  · 技术社区  · 16 年前

    我正在编写一个Python脚本来处理从 Procmail question ,我正在使用以下Procmail配置:

    :0:
    |$HOME/process_mail.py
    

    我的process\u mail.py脚本通过stdin接收电子邮件,如下所示:

    From hostname Tue Jun 15 21:43:30 2010
    Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400
    Received: from mail-fx0-f44.google.com (209.85.161.44)
    by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400
    Received: by fxm19 with SMTP id 19so170709fxm.3
    for <username@domain.com>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
    MIME-Version: 1.0
    Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15
    Jun 2010 18:47:33 -0700 (PDT)
    Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
    Date: Tue, 15 Jun 2010 20:47:33 -0500
    Message-ID: <AANLkTikFsIjJ3KYW1HJWcAqQlGXNiXE2YMzrj39I0tdB@mail.gmail.com>
    Subject: TEST 12
    From: Full Name <username@sender.com>
    To: username@domain.com
    Content-Type: text/plain; charset=ISO-8859-1
    
    ONE
    TWO
    THREE
    

    >>> import email
    >>> msg = email.message_from_string(full_message)
    

    我想得到像“From”、“to”和“Subject”这样的消息字段。但是,消息对象不包含这些字段中的任何一个。

    我做错什么了?

    3 回复  |  直到 9 年前
        1
  •  10
  •   Alex Martelli    16 年前

    您必须确保行不会意外中断(如上所述,尽管很难说这是否是复制粘贴问题),并使用完整的消息,例如:

    Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400
    Received: from mail-fx0-f44.google.com (209.85.161.44) by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400
    Received: by fxm19 with SMTP id 19so170709fxm.3 for <username@domain.com>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
    MIME-Version: 1.0
    Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
    Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
    Date: Tue, 15 Jun 2010 20:47:33 -0500
    Message-ID: <AANLkTikFsIjJ3KYW1HJWcAqQlGXNiXE2YMzrj39I0tdB@mail.gmail.com>
    Subject: TEST 12
    From: Full Name <username@sender.com>
    To: username@domain.com
    Content-Type: text/plain; charset=ISO-8859-1
    
    ONE
    TWO
    THREE
    

    然后

    msg = email.message_from_string(msgtxt)
    print msg['Subject']
    

    印刷品 TEST 12

        2
  •  4
  •   Michael Mrozek    16 年前

    看起来您的换行符在附加行之前没有空格,根据 RFC 2822 §2.3.2 是非法的:

    每个标题字段在逻辑上是一行字符,包括
    字段名、冒号和字段正文。为方便起见
    但是,为了处理每行998/78字符的限制,
    标题字段的字段体部分可以拆分为多个字段
    线条表示法;这叫做“折叠”。一般规则是
    在本标准允许折叠空白的地方(不是
    仅限WSP字符),可以在任何WSP之前插入CRLF。为了
    例如,标题字段:

        Subject: This is a test
    

        Subject: This
         is a test
    

    应该是这样的:

    From hostname Tue Jun 15 21:43:30 2010
    Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400
    Received: from mail-fx0-f44.google.com (209.85.161.44)
        by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400
    Received: by fxm19 with SMTP id 19so170709fxm.3
        for <username@domain.com>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
    MIME-Version: 1.0
    Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15
        Jun 2010 18:47:33 -0700 (PDT)
    Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
    Date: Tue, 15 Jun 2010 20:47:33 -0500
    Message-ID: <AANLkTikFsIjJ3KYW1HJWcAqQlGXNiXE2YMzrj39I0tdB@mail.gmail.com>
    Subject: TEST 12
    From: Full Name <username@sender.com>
    To: username@domain.com
    Content-Type: text/plain; charset=ISO-8859-1
    
    ONE
    TWO
    THREE
    
        3
  •  2
  •   Manuel Ceron    16 年前

    我自己回答。