Microsoft Exchangeのメール処理用I/F、EWSを経由してPHPでメールを取ってくる処理を作成しているのですが、特定文面を含むメールだけがメール取得処理で下記のエラーを起こします。
looks like we got no XML document
エラーは、SoapClientクラスを継承したEWS用のクラスからGetItemメソッドでメール1件の情報オブジェクト(でっかい構造体のようなもの)を取得するところで発生。問題の文字は箇条書きのような文字列部分で、タブのような記号が入っているようにも見えるのですが正体不明。しかし、下記のサイトで同じエラー報告が挙がっており、やはりXMLとして使えない文字が入っているのでは?という話が挙がってますのでおそらくこれと同じかと。
実際、ダメな文章のメールをHTML保存してみると、アンパサンドとシャープに続いて数字、さらにセミコロンが混入してました。これ、ユニコード文字をコード指定で表現する際の書式で、さらにコード1なんてありません。要するに「存在しない文字が混入してしまっている」ということ。
これを除去することは技術的には可能でしょうが、この文字だけかというと、文字として使えないあらゆるコードが存在するので対象は無数にあります。
というわけで、現実解として「エラーが出ているところをTry/Catchで囲んでエラーはログに出しつつ、そのメールだけスキップ」という作戦を取ろうかと。
いやはや。どうやってそんな文字が入ったのだろう。

世界の文字と記号の大図鑑 ー Unicode 6.0の全グリフ
- 作者: ヨハネス・ベルガーハウゼン,シリ・ポアランガン,小泉均
- 出版社/メーカー: 研究社
- 発売日: 2014/08/22
- メディア: 単行本
- この商品を含むブログ (4件) を見る