2017-12-22 22 views
1

私のアプリケーションは受信メールを受信し、送信者のメールアドレスをデータストアに保存します。方法のためApp Engine Datastoreが電子メールを間違った形式で保存しています

John Smith <[email protected]>

私のアプリ、クエリが、私はこれだけの形式でアドレスを検索することができます設定されています::問題は、それがこの形式で保存しますです[email protected]

私が使用しようとしました正規表現は、メッセージをフォーマットするが、それは何らかの理由で動作しません、私はリストのインデックスを私が試したすべての式で範囲のエラーを取得します。それが役に立つなら、ここに私のメールハンドラのコードがあります。

私は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) 

答えて

0

コードフラグメントが投稿されたときに何かが壊れていない限り、その正規表現は非常に一致しません。お試しください

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

これは、特定のアドレス形式を処理します。代わりに、正規表現の代わりに

0

、:

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

は、標準ライブラリのemailパッケージからparseaddr機能を使用してください。 docsから

>>> from email.utils import parseaddr 
>>> sender = 'John Smith <[email protected]>' 
>>> name, address = parseaddr(sender) 
>>> print name 
John Smith 
>>> print address 
[email protected] 

解析アドレス - 例えばToまたはCcのようないくつかのアドレスを含む フィールドの値でなければならない - その構成本名やメール アドレス部分に。パース が失敗しない限り、その情報のタプルを返します。この場合、2タプルの( ''、 '')が返されます。

関連する問題