[PHP] 携帯を考慮して文字化け対策なmailto <a href="mailto:~"> を書いてみる。

ってか、mailtoなんて使う機会がめっきり無いわけですが、
ちょいと必要になったので作ってみました。

とりあえず携帯対応で文字化け対策なmailto

mailtoを書くにあたってそもそもですね、めんどくさい。
メアドだけならいいけど、subject入れたいだとかbody入れたいとかね。
日本語だとエンコードしなきゃとか、改行はそのまま書けないだとか、で、携帯まで考えたら文字コードを考えなきゃいけない。

ので

めんどくさいから、もうmailto書くのやめる。

ので

とりあえず携帯は無視してmailtoを作る

<?php
// ※classに放り込む場合
class exampleClass{
public function mailto($param){
$prm = array();
foreach(array('to', 'cc', 'bcc', 'subject', 'body', 'text') as $k)
$prm[$k] = (isset($param[$k]) ? $param[$k] : '');
foreach(array("rn", "r") as $s)
$prm['body'] = str_replace($s, "n", $prm['body']);
$prm['body'] = str_replace("n", "rn", $prm['body']);
$args = array();
foreach(array('subject', 'body') as $k){
if (strlen($prm[$k]) > 0)
array_push($args, $k . '=' . rawurlencode($prm[$k]));
}
foreach(array('cc', 'bcc') as $k){
if (strlen($prm[$k]) > 0)
array_push($args, $k . '=' . $prm[$k]);
}
$href = 'mailto:' . $prm['to'] . (strlen($s = implode('&', $args)) > 0 ? '?' . $s : '');
return '<a href="' . $href . '">' . $prm['text'] . '</a>';
}
}

// ※関数として使うなら
function mailto($param){
// 関数内のコードは、↑と同じで
}

とりあえずmailtoを使ってみる。

<body>
<p><?php;
// classに放り込んだ場合
$oj = new exampleClass();
$oj ->mailto(array(
'to' => 'you@example.com',
'subject' => 'ども',
'text' => 'メールはこちらから'
));
?></p>
<p><?php;
// 関数として宣言した場合
mailto(array(
'to' => 'you@example.com',
'subject' => 'ども',
'text' => 'メールはこちらから'
));
?></p>
</body>

出力結果はともに

<body>
<p><a href="mailto:you@example.com?subject=%82%C7%82%E0">メールはこちらから</a></p>
</body>

こんな感じになりますな。
ちなみに、 「%82%C7%82%E0」の部分は、「ども」をurlエンコードしたからこうなってます。
で、上記の例ではパラメータのccとbccは外しました。必要なら同じように含めます。

なわけで・・・

携帯ごとに文字化け対策したmailtoにする

<?php
// 端末判別の方法をなにか作っておきます。
function isSoftbank(){ // ここではとりあえず
// IPアドレスとかユーザーエージェントなどなどで判別
return (boolean);
}

// classにした場合は、継承させちゃいます。
class exampleClassMobile extends exampleClass{
public function mailto($param){
if ( ! isSoftbank()){ // ソフトバンク以外はsjis
foreach(array('subject', 'body') as $key){
if (isset($param[$key]))
$param[$key] = mb_convert_encoding($param[$key], 'Shift_JIS', 'auto');
}
}
return parent::mailto($param);
}
}

// 関数として使うなら
function mailtoWithMobile($param){
if ( ! isSoftbank()){ // ソフトバンク以外はsjis
foreach(array('subject', 'body') as $key){
if (isset($param[$key]))
$param[$key] = mb_convert_encoding($param[$key], 'Shift_JIS', 'auto');
}
}
return mailto($param);
}

とりあえず携帯対応で文字化け対策なmailtoを使ってみる。

<body>
<p><?php;
// classに放り込んだ場合
$oj = new exampleClassMobile();
$oj ->mailto(array(
'to' => 'you@example.com',
'subject' => 'ども',
'text' => 'メールはこちらから'
));
?></p>
<p><?php;
// 関数として宣言した場合
mailtoWithMobile(array(
'to' => 'you@example.com',
'subject' => 'ども',
'text' => 'メールはこちらから'
));
?></p>
</body>

結果は同じなので省略・・・。

でもやっぱり送信フォームとか作っちゃうから、使う機会ってかなり限定されるかもねーー。

あと、ブログ用にコードをちょこちょこ変えてる部分があるので、エラーったときは適当に直してください。

※ 追記
そういえば、phpはutf8前提で書いてますので、eucやshift-jisな方は上手い具合に変えてください。