サポート

エントリーメール投稿プラグインの動作について

suzuki (2014/05/14 16:58)

設置URL : http://www.nishi-shinjuku.net/

プラグインを設置したところ、メールタイトルが半角英数だとタイトルが空の時と同じ動作になります。

ヘッダー情報を見ると以下の様にちゃんとsubjectが入っています。
何故なんでしょうか?

X-SMTP-Result: 250 ok 1400052993 qp 11467
Date: Wed, 14 May 2014 16:36:08 +0900
From: Yasuhiro Suzuki <yasuhiro.suzuki@nishi-shinjuku.net>
To: blog@nishi-shinjuku.net
Subject: test
Message-Id: <20140514163607.A052.C4AE50A7@nishi-shinjuku.net>
MIME-Version: 1.0
X-Mailer: Becky! ver. 2.65.05 [ja]
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit

陽子 (2014/05/17 12:26)

こんにちはー。
ちょっと試してみましたら私も再現しました。
タイトルにtestと入れても表示は「No Subject」になりますね…
古いバージョンで試しただけですが、最新verでも同じでしょうか?

南方かおり (2014/05/19 11:26)

URL : http://holydragoon.jp/

こんにちは~。

最新版(ver.1.1.0)のエントリーメール投稿プラグインで同様の動作確認をしてみましたが、
お二方のおっしゃるとおり題名を「test」で投稿してみると、プラグイン側でSubjectがないように処理されてしまいました。
おそらくですが件名が「すべて半角英数字になっている」場合、同じ動作になると思われます。
(試しに「testですよ」という件名でメール投稿してみると、こちらは問題なくプラグインが動作して、freoに投稿できました)

暫定的な措置として、メール件名を取得する部分(エントリーメール投稿プラグインの419行目付近)にある

	if (preg_match('/(.*)=\?iso-2022-jp\?B\?([^?]+)\?=(.*)/i', $subject, $matches)) {
		$subject = $matches[1] . base64_decode($matches[2]) . $matches[3];
	} elseif (preg_match('/(.*)=\?iso-2022-jp\?Q\?([^?]+)\?=(.*)/i', $subject, $matches)) {
		$subject = $matches[1] . quoted_printable_decode($matches[2]) . $matches[3];
	} else {
		$subject = null;
	}

この部分を以下のスクリプトに置き換えて様子を見てください。

	//メール件名から取得した題名が半角文字だけだと以下の処理がうまくいかないので、半角文字のみの場合は処理を回避(暫定処置)
	if (!preg_match('/^\w+$/i', $subject)) {
		if (preg_match('/(.*)=\?iso-2022-jp\?B\?([^?]+)\?=(.*)/i', $subject, $matches)) {
			$subject = $matches[1] . base64_decode($matches[2]) . $matches[3];
		} elseif (preg_match('/(.*)=\?iso-2022-jp\?Q\?([^?]+)\?=(.*)/i', $subject, $matches)) {
			$subject = $matches[1] . quoted_printable_decode($matches[2]) . $matches[3];
		} else {
			$subject = null;
		}
	}

以上の対策で当方の本サーバー(ロリポップサーバー)にてメール投稿できたのを確認しています。

あとはプラグインの正式なバージョンアップを待つ形になると思います。
ないとさん、お手すきのときに修正よろしくお願いします。

suzuki (2014/05/22 12:13)

URL : http://www.nishi-shinjuku.net/

メールタイトルが半角英数記号以外なら(日本語タイトルなので)、iso-2022-jpでエンコードする。
処理としては、

	//メール件名が半角英数記号以外ならエンコード
	if (!preg_match('/^[!-~]+$/', $subject)) {
		if (preg_match('/(.*)=\?iso-2022-jp\?B\?([^?]+)\?=(.*)/i', $subject, $matches)) {
			$subject = $matches[1] . base64_decode($matches[2]) . $matches[3];
		} elseif (preg_match('/(.*)=\?iso-2022-jp\?Q\?([^?]+)\?=(.*)/i', $subject, $matches)) {
			$subject = $matches[1] . quoted_printable_decode($matches[2]) . $matches[3];
		} else {
			$subject = null;
		}
	}

で、良いんでしょうか?
正規表現が苦手なのでよろしくお願いします。

ちなみにハングルや中国語タイトルの場合は、ここを拡張しないと対応出来ないんですよね?

南方かおり (2014/05/23 11:12)

URL : http://holydragoon.jp/

こんにちは。

私も正規表現は苦手な方なので絶対とは言えないのですが、
半角記号もマッチングの対象に入れるのであれば、suzukiさんの書き方で問題ないと思います。
(PHP:preg_match()正規表現チェッカー ver2.0さん(http://okumocchi.jp/php/re.php)のリファレンスを参考にしました)

>ちなみにハングルや中国語タイトルの場合は、ここを拡張しないと対応出来ないんですよね?
ハングル、中国語など日本語以外のマルチバイト文字を使っている場合は、
おっしゃるとおりそれに対応した文字エンコードの処理が必要になってきます。
ただ海外の文字エンコードに関しては当方はまったく知識がないので、「こうすればよい」というアドバイスはできません・・・。

suzuki (2014/05/26 15:16)

URL : http://www.nishi-shinjuku.net/

以前のやり方だと日本語のタイトルが処理出来ませんでした。
そして、タイトルには、空白も入って来るので半角英数記号空白をマッチしないと駄目なのだと気付きました。

	if (preg_match('/(.*)=\?iso-2022-jp\?B\?([^?]+)\?=(.*)/i', $subject, $matches)) {
		$subject = $matches[1] . base64_decode($matches[2]) . $matches[3];
	} elseif (preg_match('/(.*)=\?iso-2022-jp\?Q\?([^?]+)\?=(.*)/i', $subject, $matches)) {
		$subject = $matches[1] . quoted_printable_decode($matches[2]) . $matches[3];
	//メール件名が半角英数スペースのみの場合
	} elseif (preg_match('/^[!-~\s]+$/', $subject ,$matches)) {
		$subject = $matches[0];
	} else {
		$subject = null;
	}

これで日本語タイトルは、全て問題無く動きますよね?

返信

  • この記事に返信します。
  • 返信の際は、設置URL以外の項目は入力必須です。
投稿フォーム
名前
設置URL
本文(本文の装飾について
編集キー(投稿した記事を編集する際に使用します。)
投稿キー(スパム対策に、投稿キー を半角で入力してください。)