web-dev-qa-db-ja.com

引用されたテキストを除いて、その人が書いたばかりの実際の電子メールメッセージを取得します

このサイトには2つの既存の質問があります。 1つはPython用、もう1つはJava用です。

(PHPで)ほぼ同じことができるようにしたいと思います。メールプロキシを作成しました。このプロキシでは、一意のメールアドレスをメールで送信することで2人が一緒に連絡を取ることができます。しかし、私が見つけた問題は、人が電子メールを受信して​​返信を押すと、彼が書いたテキストを正確にキャプチャし、以前の通信から引用されたテキストを破棄するのに苦労していることです。

HTMLメールとプレーンテキストメールの両方を送信しているため、両方で機能するソリューションを見つけようとしています。

また、必要に応じて<*****RESPOND ABOVE HERE*******>タグをメールに挿入すると、以下のすべてを破棄できるようになります。

私に何をすすめますか?常にそのタグをHTMLコピーとプレーンテキストコピーに追加してから、その上のすべてを取得しますか?

それでも、各メールクライアントがどのように応答を作成するかを知るというシナリオが残ります。たとえば、Gmailはこれを行うため:

On Wed, Nov 2, 2011 at 10:34 AM, Message Platform <[email protected]> wrote:
## In replies all text above this line is added to your message conversation ##

ベストプラクティスの提案や推奨事項はありますか?

または、最も人気のある50のメールクライアントを取得して、それぞれにカスタム正規表現の作成を開始する必要があります。次に、これらのクライアントごとに、ユーザーのロケールも追加されるものに影響を与えると推測しているため、奇妙な異なるロケール設定もあります。

または、日付が含まれている場合は、常に前の行を削除する必要がありますか?..など

20
Layke

メッセージから返信/署名を抽出するのに役立つライブラリはたくさんあります。

また、MailGunが受信メールを解析するサービスを提供し、そのコンテンツを選択したURLにPOST送信します。メールから引用されたテキストを自動的に削除します: http: //blog.mailgun.com/handle-incoming-emails-like-a-pro-mailgun-api-2-0/

お役に立てば幸いです。

13
Pedro

残念ながら、電子メールを細心の注意を払ってクリーンアップしたい場合(実際の返信電子メール自体の一部ではないものをすべて削除したい場合)、あなたは傷ついた世界にいます。 理想的な方法は、あなたが提案するように、人気のある電子メールクライアント/サービスごとに正規表現を作成することですが、それはかなりばかげた量の作業であり、私は 怠惰で愚かであること それについて。

興味深いことに、 Facebookエンジニア でもこの問題に問題があり、 Googleには特許があります 「引用されたテキストを検出する」方法についてです。

許容できると思われる解決策は3つあります。

そのままにしておきます

最初の解決策は、メッセージにすべてを残すことです。ほとんどの電子メールクライアントはこれを行い、誰も文句を言わないようです。もちろん、オンラインメッセージシステム(Facebookの「メッセージ」など)は、開始スタイルの応答がある場合、かなり奇妙に見えます。これをうまく機能させるための卑劣な方法の1つは、引用符で囲まれた行を折りたたんでメッセージをレンダリングし、「引用符で囲まれたテキストを展開する」への小さなリンクを含めることです。

古いメッセージから返信を分離します

2番目の解決策は、おっしゃるように、--------- please reply above this line ----------のようにメッセージの先頭に線引きメッセージを配置し、返信を処理するときにその行とその下のすべてを削除することです。多くのシステムがこれを行っており、それは世界で最悪のことではありません...しかし、それはあなたの電子メールをより「自動化」され、個人的ではないように見せます(私の意見では)。

引用されたテキストを取り除く

最後の解決策は、>で始まる新しい行を削除することです。これは、おそらく返信メールから引用された行です。ほとんどの電子メールクライアントは、引用されたテキストを示すこの方法を使用します。これはまさにそれを行う正規表現(PHP)です:

$clean_text = preg_replace('/(^\w.+:\n)?(^>.*(\n|$))+/mi', '', $message_body);

この単純な方法を使用すると、いくつかの問題が発生します。

  • 多くの電子メールクライアントでは、以前の電子メールを引用することもできます。また、それらの引用行の前に>を付けることもできるため、引用符を削除することになります。
  • 通常、引用された電子メールの上にOn [date], [person] saidのような行があります。この行は、異なる電子メールクライアント間で同じ形式になっていないため、削除するのが困難です。また、削除した引用テキストの1行または2行上にある可能性があります。私はこの検出方法を実装しましたが、中程度の成功を収めて、私のPHP Imap ライブラリにあります。

もちろん、テストは重要であり、トレードオフは特定のシステムにとって価値があるかもしれません。 YMMV。

22
geerlingguy

おそらく役立つ: quotequail はPythonライブラリで、メール内の引用されたテキストを識別するのに役立ちます

2
philfreo

Afaik、(標準の)電子メールは、すべての行の前に ">"を追加して、テキスト全体を引用する必要があります。 strstr()を使用して削除できます。それ以外の場合は、そのJavaの例をphpに移植しようとしましたか?それは正規表現に他なりません。

GithubやFacebookのようなページでもこの問題があります。

1
sascha

ただのアイデア:あなたは最初に送信されたテキストを持っているので、それを探してそれと追加の周囲のノイズを返信から取り除くことができます。追加の改行、HTML要素、 ">"文字がメールクライアントアプリケーションによって追加されるため、これは簡単なことではありません。

正規表現は、シンプルで元のテキストを完全にカットするため、機能する場合は間違いなく優れていますが、頻繁に機能しない場合は、これがフォールバック方法になる可能性があります。

0

引用されたテキストまたは返信は単なるテキストであることに同意します。したがって、それをフェッチする正確な方法はありません。とにかく、このように正規表現置換を使用できます。

$filteringMessage = preg_replace('/.*\n\n((^>+\s{1}.*$)+\n?)+/mi', '', $message);

テスト https://regex101.com/r/xO8nI1/2

0
radzserg

https://mailgun.com は、返信の抽出(引用されたコンテンツの削除)と、クラウドベースのサービスとしての署名の抽出を提供します。私はまだそれをテストしていませんが、有望に見えます。

0
Andris