3

メールの本文をスキャンして、転送されたメールからメール アドレス リストを探したい。

From: John Smith <john@example.com>
To: Jane Smith <jane@example.com>, Mary Smith
<mary@example.com>
Cc: Ed Smith <ed@example.com>
Subject: this is a test

各リストを完全に解析するために使用Mail_RFC822::parseAddressList()します (そこには詳細がたくさんあるので、再設計するべきではありません)。この機能。私はメールアドレスの行を探すだけの単純な正規表現を持っていますが、それはほとんどの場合うまくいきます。

しかし、実際には、上記の例のように、名前とアドレスが別の行に分割されているメールが時々あります。行ごとに行うと、上記の To: 行の上半分は parseAddressList() でまったく解析できません。アドレスのない名前は無効であるためです。下半分は解析されますが、前の行にあった名前が失われます。

したがって、一度に複数の行を確認できる正規表現が必要ですが、これは私の専門知識を超えて複雑になります。適切な解決策は、基本的な電子メール パターン ( ... 完璧である必要はありません) を見つけ続ける限り、行をグループ化し続けます[\w\.\+\-]+@[\w\.\-]+\.[\w\.\-]+が、行の先頭に単語とコロンの組み合わせ ( ^\S*:) がないため、次のようになります。上記の例では、Cc: 行が個別の一致です。よろしくお願いします。

4

2 に答える 2

1

文字列を前処理して文字の前の改行を削除し<、結果を関数に渡すことができますparseAddressList

に置き換えるような/(?:\r?\n|\r)\s*</もの<

$emails = Mail_RFC822::parseAddressList(preg_replace('/(?:\r?\n|\r)\s*</', '<', $emailHeaders));
于 2013-07-18T16:59:48.147 に答える