【问题标题】:App Engine Datastore storing email in wrong formatApp Engine Datastore 以错误的格式存储电子邮件
【发布时间】:2025-12-30 12:30:16
【问题描述】:

我的应用程序接收传入的电子邮件并将发件人的电子邮件地址保存到数据存储中。问题是它以这种格式保存它们:

John Smith <jsmith@email.com>

由于我的应用程序及其查询的设置方式,我只能搜索这种格式的地址:jsmith@email.com

我尝试使用正则表达式来格式化消息,但由于某种原因它不起作用,我尝试的每个表达式都出现列表索引超出范围错误。如果有帮助,这是我的邮件处理程序的代码。

我已经检查了 App Engine 中的日志,并且传入的消息确实以我需要的格式出现,但随后我检查了数据存储实体,它也将其添加到名称中。

我只需要知道如何在没有多余位的情况下获取存储的电子邮件地址。

import webapp2
import logging
from google.appengine.ext.webapp import mail_handlers
from google.appengine.api import mail
import os
from main import WorkRequest
import re


class IncomingMailHandler(mail_handlers.InboundMailHandler):
    def receive(self, message):
        (encoding, payload) = list(message.bodies(content_type='text/plain'))[0]
        body_text = payload.decode()
        logging.info('Received email message from %s, subject "%s": %s' %
                     (message.sender, message.subject, body_text))

        logging.info (message.sender)
        logging.info(message.subject)
        logging.info(body_text)


        sender = str(message.sender)
        logging.info(sender)

        email_address = re.findall('<([^>])>', sender)[0]

        wr = WorkRequest()

        wr.email = email_address
        wr.userId = None
        wr.title = message.subject
        wr.content = body_text
        wr.status = "OPEN"
        wr.submission_type = "EMAIL"
        wr.assigned_to = "UNASSIGNED"
        wr.put()

application = webapp2.WSGIApplication([('/_ah/mail/.+', IncomingMailHandler)],debug=True)

【问题讨论】:

    标签: python email google-app-engine


    【解决方案1】:

    除非在您的代码片段发布时出现错误,否则该正则表达式不太可能匹配。试试

    email_address = re.findall('<(.*?)>', sender)[0]
    

    这将处理一种特定形式的地址。

    【讨论】:

      【解决方案2】:

      或者,而不是正则表达式:

      email = email.split('<')[1].split('>')[0]
      

      【讨论】:

        【解决方案3】:

        使用标准库的email 包中的parseaddr 函数。

        >>> from email.utils import parseaddr
        >>> sender = 'John Smith <jsmith@email.com>'
        >>> name, address = parseaddr(sender)
        >>> print name
        John Smith
        >>> print address
        jsmith@email.com
        

        来自docs

        解析地址——应该是一些包含地址的值 字段,例如收件人或抄送 - 进入其组成的真实姓名和电子邮件 地址部分。返回该信息的元组,除非解析 失败,在这种情况下返回一个 2 元组 ('', '')。

        【讨论】: