携帯サイトのmailtoを端末ごとに書き換える関数

携帯サイトでのmailtoの書き方はキャリアによってそれぞれ違う。
それをアクセスしてきた端末ごとに書き換えるPHPの関数です。

mailtoのsubjectとbodyの内容を日本語で書いておけばオッケー。
ただし改行とか%とか&は誤作動の原因になるのでURLエンコードは必要です。

置き換え前置き換え後
改行%0D%0A
%%25
&%26
?%3F
"%22

(それ以外は日本語)

<?php
/* ================================
 * mailto4mobile
 * mailto4mobilesub
 *
 * @create  2009-04-02
 * @author  pentan
 * @url     http://pentan.info/
 *
 * Copyright (c) 2009 pentan.info All Rights Reserved.
 * 著作権表示部分の変更削除は禁止です
 * ================================
 */

function mailto4mobile ($body){
  return preg_replace_callback(
            "/<a [^>]*href=\"mailto:[^\"]+\"[^>]*>/iUs",
            create_function('$matches','return mailto4mobilesub($matches[0]);'),
            $body
          );
}

function mailto4mobilesub($a_tag){
  $emailto="";
  $emailcc="";
  $emailbcc="";
  $emailsubject="";
  $emailbody="";
  
  if(preg_match("/href=\"mailto:([^\"]*)\"/is",$a_tag,$match)){
    $mailto=trim($match[1]);
  }else{
    return $a_tag;
  }
  $mailto=htmlspecialchars_decode($mailto);

  if(preg_match("/^([^?\"]+)\?/i",$mailto."?",$match)){
    $emailto=urldecode(trim($match[1]));
  }
  if(preg_match("/(&|\?)cc=([^&]+)&/i",$mailto."&",$match)){
    $emailcc=urldecode(trim($match[2]));
  }
  if(preg_match("/(&|\?)bcc=([^&]+)&/i",$mailto."&",$match)){
    $emailbcc=urldecode(trim($match[2]));
  }
  if(preg_match("/(&|\?)subject=([^&]+)&/is",$mailto."&",$match)){
    $emailsubject=trim($match[2]);
  }
  if(preg_match("/(&|\?)body=([^&]+)&/is",$mailto."&",$match)){
    $emailbody=trim($match[2]);
  }

  if(str_replace("%","",$emailsubject)==urlencode(str_replace("%","",$emailsubject))
    && str_replace("%","",$emailbody)==urlencode(str_replace("%","",$emailbody))){
    return $a_tag;
  }

  $emailsubject=urldecode($emailsubject);
  $emailbody=urldecode($emailbody);

  $agent = $_SERVER['HTTP_USER_AGENT']; 
  if (preg_match("/^(SoftBank|Vodafone)/", $agent)) {
    $emailsubject=mb_convert_encoding($emailsubject,"UTF-8","SJIS-win");
    $emailbody=mb_convert_encoding($emailbody,"UTF-8","SJIS-win");
    
    $emailsubject=rawurlencode($emailsubject);
    $emailbody=rawurlencode($emailbody);

    $mailto="";
    if($emailcc)$mailto.=($mailto?'&':'?')."cc=".$emailcc;
    if($emailbcc)$mailto.=($mailto?'&':'?')."bcc=".$emailbcc;
    if($emailsubject)$mailto.=($mailto?'&':'?')."subject=".$emailsubject;
    if($emailbody)$mailto.=($mailto?'&':'?')."body=".$emailbody;

    $mailto="mailto:".$emailto.$mailto;


  } else if (preg_match("/^J-PHONE\/3\.0/", $agent)) {
    $mailto="";
    if($emailbody)$mailto.="\" mailbody=\"".htmlspecialchars($emailbody);
    $mailto="mailto:".$emailto.$mailto;

  } else if (preg_match("/^J-PHONE\/4\.1\/J-SA51/", $agent)) {
    $emailsubject=htmlspecialchars($emailsubject);
    $emailbody=htmlspecialchars($emailbody);

    $mailto="";
    if($emailcc)$mailto.=($mailto?'&':'?')."cc=".$emailcc;
    if($emailbcc)$mailto.=($mailto?'&':'?')."bcc=".$emailbcc;
    if($emailsubject)$mailto.=($mailto?'&':'?')."subject=".$emailsubject;
    if($emailbody)$mailto.="\" mailbody=\"".$emailbody;

    $mailto="mailto:".$emailto.$mailto;

  } else if (preg_match("/^J-PHONE\/4\./", $agent)) {
    $mailto="mailto:?\" mailbody=\"".htmlspecialchars($emailbody);
    $emailbody=htmlspecialchars($emailbody);

    $mailto="";
    if($emailcc)$mailto.=($mailto?'&':'?')."cc=".$emailcc;
    if($emailbcc)$mailto.=($mailto?'&':'?')."bcc=".$emailbcc;
    if($emailbody)$mailto.="\" mailbody=\"".$emailbody;

    $mailto="mailto:".$emailto.$mailto;
  } else if (preg_match("/^J-PHONE/", $agent)) {
    $emailsubject=urlencode($emailsubject);
    $emailbody=htmlspecialchars($emailbody);

    $mailto="";
    if($emailcc)$mailto.=($mailto?'&':'?')."cc=".$emailcc;
    if($emailbcc)$mailto.=($mailto?'&':'?')."bcc=".$emailbcc;
    if($emailsubject)$mailto.=($mailto?'&':'?')."subject=".$emailsubject;
    if($emailbody)$mailto.="\" mailbody=\"".$emailbody;

    $mailto="mailto:".$emailto.$mailto;
  }else{
    $emailsubject=urlencode($emailsubject);
    $emailbody=urlencode($emailbody);

    $mailto="";
    if($emailcc)$mailto.=($mailto?'&':'?')."cc=".$emailcc;
    if($emailbcc)$mailto.=($mailto?'&':'?')."bcc=".$emailbcc;
    if($emailsubject)$mailto.=($mailto?'&':'?')."subject=".$emailsubject;
    if($emailbody)$mailto.=($mailto?'&':'?')."body=".$emailbody;

    $mailto="mailto:".$emailto.$mailto;
  }

  return preg_replace("/href=\"[^\"]+\"/is",'href="'.$mailto.'"',$a_tag);
}

?>

Smartyで使うときはoutputfilterに入れてしまうとよい。

$smarty->register_outputfilter('mailto4mobile');

スポンサーリンク

関連記事

スポンサーリンク

counter カウンタの値を表示する

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る