[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な方は上手い具合に変えてください。

広告