http://moodle.org/mod/forum/discuss.php?d=112262 こちらのディスカッションの続きです.
Moodleのメッセージ機能で電子メールを送る際,画面下の入力ボックスに入力したテキストから,なんらかのルールに基づいて電子メールのSubjectとしているらしい.当初はメッセージに第1行がSubjectになるものだと勝手に確信していたのですが,どうやら異なるようで,先ほども物凄く長いSubjectのメールが届きました.
(QuickMailブロックを利用している場合はSubject入力欄があるのでこの問題は生じない)
調べてみました.
email_to_user()で電子メールを送る直前にSubjectを生成しています.
message/lib.phpのfunction message_post_message(),
$messagesubject = preg_replace('/\s+/', ' ', strip_tags($message)); // make sure it's all on one line
$messagesubject = message_shorten_message($messagesubject, 30).'...';
ここです.$messageはどうやらメール本文全文のようです.空白文字(改行文字も含む)を全て' 'に置き換えた後に,message_shorten_message()関数でSubjectを作っていると思われます.当然,引数の30は,”最大で30文字”と思いきや,実は違いました.
function message_shorten_message()の2つめの引数である$minlength,そう,”少なくとも30文字”(正確にはUTF-8で少なくとも30byte)という意味でした.少し長いですが,下に全文を掲載します.
ルールは,
(1)メール本文が30byteに満たないならばすべてSubject
(2)30文字(minlegth)を越えた後に'.'か' '(半角ピリオド,半角空白)が存在したらそこまでをSubjectとする.
です.'<'と'>'で括られた'.'と' 'を無視するなど少々の例外はあり.
function message_shorten_message($message, $minlength=0) {
$i = 0;
$tag = false;
$length = strlen($message);
$count = 0;
$stopzone = false;
$truncate = 0;
if ($minlength == 0) $minlength = MESSAGE_SHORTLENGTH;
for ($i=0; $i<$length; $i++) {
$char = $message[$i];switch ($char) {
case "<":
$tag = true;
break;
case ">":
$tag = false;
break;
default:
if (!$tag) {
if ($stopzone) {
if ($char == '.' or $char == ' ') {
$truncate = $i+1;
break 2;
}
}
$count++;
}
break;
}
if (!$stopzone) {
if ($count > $minlength) {
$stopzone = true;
}
}
}if (!$truncate) {
$truncate = $i;
}return substr($message, 0, $truncate);
}