misc.log

日常茶飯事とお仕事と

EWSからメールを持ってくる際に特定のメールだけエラーになる

Microsoft Exchangeのメール処理用I/F、EWSを経由してPHPでメールを取ってくる処理を作成しているのですが、特定文面を含むメールだけがメール取得処理で下記のエラーを起こします。

looks like we got no XML document

エラーは、SoapClientクラスを継承したEWS用のクラスからGetItemメソッドでメール1件の情報オブジェクト(でっかい構造体のようなもの)を取得するところで発生。問題の文字は箇条書きのような文字列部分で、タブのような記号が入っているようにも見えるのですが正体不明。しかし、下記のサイトで同じエラー報告が挙がっており、やはりXMLとして使えない文字が入っているのでは?という話が挙がってますのでおそらくこれと同じかと。

stackoverflow.com

実際、ダメな文章のメールをHTML保存してみると、アンパサンドとシャープに続いて数字、さらにセミコロンが混入してました。これ、ユニコード文字をコード指定で表現する際の書式で、さらにコード1なんてありません。要するに「存在しない文字が混入してしまっている」ということ。

これを除去することは技術的には可能でしょうが、この文字だけかというと、文字として使えないあらゆるコードが存在するので対象は無数にあります。

というわけで、現実解として「エラーが出ているところをTry/Catchで囲んでエラーはログに出しつつ、そのメールだけスキップ」という作戦を取ろうかと。

いやはや。どうやってそんな文字が入ったのだろう。

世界の文字と記号の大図鑑 ー Unicode 6.0の全グリフ

世界の文字と記号の大図鑑 ー Unicode 6.0の全グリフ