7

SendgridとそのParseAPIを使用してメールを送受信しています。Parse APIを使用すると、Webアプリは$ _POSTとして電子メールを受信できますが、問題は、$ _ POSTで、連鎖する以前のメッセージとメタデータからメッセージ自体を抽出できるようにしたいということです。

次の写真で私が何を意味するかを示すために、 「GMAILから12373から12373に送信しようとしています」というテキストをキャプチャしたいと思いますが、その下のすべてのジャンクではありません。それが不可能な場合$_POST['text']、メッセージ自体を分離できるように、電子メールの本文()を解析する方法について誰かが提案を持っていますか?

問題は、メールクライアント(Gmail、Outlookなど)によっては、日付情報(この場合は「2013年1月23日水曜日...」)でフォローできるかどうかがわかりません。メッセージ自体。すべての電子メールクライアントがメッセージの下に日付を入れた場合、改行の後に日付などを探すための豪華な正規表現を設計できるように思われます。考え?

**全体**以前のメッセージを含むメッセージ本文

4

4 に答える 4

14

いくつかのオプションがあります。

1)メールを分割するトークンを挿入します

--- reply above this line ---次のようなことをして、そのトークンの下にあるすべてのものを切り取る ことができます。

2)メール返信解析ライブラリを使用する

githubによって行われた本当に良いものがありますが、それはルビーです。phpポートがありますが、それはあなたが必要とするものに良いかもしれません:

完全に機能するコード

<?php
  require_once 'application/third_party/EmailReplyParser-master/src/autoload.php';
  $email = new \EmailReplyParser\Email();
  $reply = $email->read($_POST['text']);            
  $message=$reply[0]->getContent();
  $message=preg_replace('~On(.*?)wrote:(.*?)$~si', '', $message); 
  //Last line is needed for some email clients, e.g., some university e-mails: foo@bar.edu but not Gmail or Hotmail, to get rid of "On Jan 23...wrote:" 
  //This failure to remove "On Jan 23...wrote:" is a known issue and is documented in their README

 ?>
于 2013-02-17T00:42:00.793 に答える
1

電子メールメッセージから引用符で囲まれたメッセージスレッドを解析する保証された方法はないため、すべての場合に機能する正規表現やその他のコードは見つかりません。返信のフォーマットを定義する標準はありません。すでに観察したように、さまざまなメールクライアントがさまざまな規則を使用しています。実際、多くの場合、ユーザーは引用されたテキストを編集できます。また、ユーザーは、ヘッダーの有無にかかわらず、無関係のメッセージを貼り付けることができるため、フォーマットを組み合わせることができます。

送受信されたすべてのメッセージの履歴を記録および保持できる場合は、(通常、ただし常にではありませんが)In-Reply-Toヘッダー(RFC-5322を参照)を使用して、前のメッセージを照合することで見つけることができます。メッセージIDヘッダー、および本文で差分を実行し、重複するテキストの実行を削除します。一部の電子メールシステムがプレゼンテーションを改善するためにこれを行っていることは明らかですが、利用可能なオープンソースコードを私は知りません。

于 2013-02-17T01:04:07.553 に答える
0

//引用されたテキストを切り取ります、https://regex101.com/r/xO8nI1/5

    $message = preg_replace('/(On\s.*<\n){0,1}(.*\n(\n){0,1}((^>+\s?.*$)+\n?)+)/mi', '', $message);
于 2016-05-13T08:48:47.360 に答える
0

英語以外の言語での返信はどうですか?マーカーを追加するソリューションを考え出しましたが、(ユーザーの言語に基づいて)すべての電子メールに対してマーカーを翻訳する代わりに、いくつかの非表示の文字をその中に入れました(U+200B正確にはゼロ幅スペース)。「On...」正規表現に基づくと、エラーが発生しやすく、一部の電子メールコンテンツを簡単にカットできます。

于 2017-05-11T11:43:10.680 に答える