[リストへもどる]
一括表示
タイトルau-iphoneへ絵文字メールを送る際のロジック
記事No945
投稿日: 2012/05/09(Wed) 11:04:29
投稿者まさ
こんにちは。本ツールを活用させてもらっています。ありがとうございます。さて、本ツールの範囲外になるのかもしれませんが、ご教授いただければ助かります。

●質問の背景
メールを絵文字入りで送付する場合、相手機種によって「UTF-8」と「SJIS」を使い分けています。※下記「コーディング抜粋」を参照。
前者は主にiphone向けですが、auはメールアドレスだけでは判別できないため、ロジックが組めず困っています。
ただ、通常のキャリア間メール(docomo→au等)では、相手がiphoneだろうが、そうでなかろうが、特に問題なく絵文字変換できているので、何らかの判別方法があると思っています。

●質問内容
・まず、相手機種によって「UTF-8」と「SJIS」を使い分ける方法は妥当な考え方でしょうか。もし他に方法があれば、教えていただけると助かります。
・上記が妥当だとして、使い分けるための、手続き・ロジックを教えていただけると助かります。

●コーディング抜粋
$wkSubject = base64_encode($wkSubject);

if($wkCarrier == "iphone"):
$wkSubject = "=?UTF-8?B?" . $wkSubject . "?=";
else:
$wkSubject = "=?Shift_JIS?B?" . $wkSubject . "?=";
endif;

$wkMailbody = $Subject;
$wkMailbody = base64_encode($wkMailbody);
$header = "From:" .$mailad ."\r\n";
$header .= "Reply-To:" .$mailad ."\r\n";
$header .= "MIME-Version: 1.0\r\n";

if($wkCarrier == "iphone"):
$header .= "Content-Type: text/plain;charset=UTF-8\r\n";
else:
$header .= "Content-Type: text/plain;charset=Shift_JIS\r\n";
endif;

$header .= "Content-Transfer-Encoding: base64";

@mail($mailad,$wkSubject,$wkMailbody,$header, "-f " .$mailad);

以上、お忙しい中、お手数となりますがよろしくお願いいたします。

タイトルRe: au-iphoneへ絵文字メールを送る際のロジック
記事No946
投稿日: 2012/05/10(Thu) 00:20:55
投稿者revulo
HTML_Emoji を使っていただき、ありがとうございます。
au の iPhone は所有していないので、以下の文章は推測です。

本来は、相手機種によってメールのエンコーディングを変えてやるのが、
(バッドノウハウとしては)妥当な考え方だと思いますが、au の携帯は、
メールアドレスからは iPhone かガラケーかを判別できないのですよね?
そうすると au の携帯に対しては、それが iPhone かどうかは考えずに、
どれかのエンコーディングに決めうちして送るしかないと思います。

それで、どのエンコーディングでメールを送るのが良いかですが、
次のようなページを見つけました。

俺日記 : au版iPhoneの絵文字対応はどんなものだったのか?
http://might1976.doorblog.jp/archives/53614910.html

この情報が正しいとすれば、

iso-2022-jp …… 半角カナが使えない
Shift_JIS …… iPhone で絵文字が表示されない
UTF-8 …… 一部のガラケーで不具合が生じるかもしれないが、おそらく大丈夫

となりそうです。iso-2022-jp での送信を試したければ、

$text = $emoji->filter($text, 'Utf8ToSJIS');
$text = mb_convert_encoding($text, 'ISO-2022-JP', 'SJIS-win');

のように2段階に分ければ、絵文字も含めて変換できると思いますが、
もし、HTML_Emoji で iso-2022-jp への変換もサポートすべきと分かったら、
その時には対応を検討します。

タイトルRe: au-iphoneへ絵文字メールを送る際のロジック
記事No947
投稿日: 2012/05/10(Thu) 22:31:06
投稿者まさ
返信ありがとうございます。以下、テストしてみました。
●「ezweb.ne.jp」宛のメールはUTF-8に統一
・au(ガラケー=CA007機種)絵文字は正しく表示される。
・au(iphone)絵文字は化ける。
次に
●iphoneは絵文字変換ができていなかったので、「ezweb.ne.jp」のときは強制的に「$wkCarrier = "iphone"」にしてみました。
・au(ガラケー=CA007機種)絵文字は正しく表示される。
・au(iphone)絵文字は正しく表示される。
という結果になりました。
ガラケーのときiphoneの文字コードでも正常に表示される?結果オーライですが、よくわかっていません。この対応で問題ないでしょうか。

タイトルRe^2: au-iphoneへ絵文字メールを送る際のロジック
記事No948
投稿日: 2012/05/11(Fri) 08:45:38
投稿者revulo
$emoji = HTML_Emoji::getInstance($mailcarrier);

のようにオブジェクトを作ると思いますが、この時の $mailcarrier は、
@ezweb.ne.jp 宛てならば 'au' にしているのでしょうか?
(それは、ガラケーかもしれませんし、iPhone かもしれませんが。)

もしそうであれば、その対応で合っていると思います。
その場合、絵文字は au 用の絵文字に変換されています。
iPhone の存在も考慮すると、au の携帯には au の絵文字を使って UTF-8 で
メールを送るのが良い、ということになるのでしょう。

もし仮に、この $mailcarrier を 'iphone' にすると、
それは iPhone 用の絵文字に変換することになりますので、
おそらく au のガラケーでは表示されないと思います。

タイトルRe^3: au-iphoneへ絵文字メールを送る際のロジック
記事No949
投稿日: 2012/05/11(Fri) 22:22:50
投稿者まさ
返信ありがとうございます。revulo様が記載している最後の方法でロジックを組んでいます。つまり、
●変更前
if($wkMaildomain == "ezweb.ne.jp") {$wkCarrier = "aumail";}
●変更後
if($wkMaildomain == "ezweb.ne.jp") {$wkCarrier = "iphone";}
と修正したあとに
$emoji = HTML_Emoji::getInstance($wkCarrier);
にしています。

タイトルRe^4: au-iphoneへ絵文字メールを送る際のロジック
記事No950
投稿日: 2012/05/12(Sat) 09:09:27
投稿者revulo
ということは、au のガラケーにメールで iPhone 用の絵文字を送った場合、
au のサーバ側で変換処理をしてくれているのでしょうか?
ちょっと考えづらいですが、その可能性はあるかもしれません。

それでうまくいっているのであれば、確かに結果オーライなのですが、
私は、先のコメントで書きましたように、au の携帯に対しては、

・絵文字は au の絵文字に変換する
・UTF-8 でメールを作成し、UTF-8 用のメールヘッダも送信する

でうまくいかないだろうかと思っています。
$wkCarrier = 'iphone' にすることで iPhone で文字化けしなくなったのは、
それまでは Shift_JIS で送っていたからではないでしょうか?

タイトルRe^5: au-iphoneへ絵文字メールを送る際のロジック
記事No951
投稿日: 2012/05/13(Sun) 00:42:27
投稿者まさ
返信ありがとうございます。正確にお伝えするため、実際のコーディングを送付します。
"ezweb.ne.jp"のメールドメインだったら無理やり「iphone」にしています。
"ezweb.ne.jp"のメールドメインであるau:iphoneとau:CA-007ともにメール絵文字は正しく表示されました。
au側で変換しているのですかね。revulo様が仰る「au」に統一する方法でも実験したいと思います。

●メイン
$wkMailbody = $row2['CUST_MEI_ATENA'] ."\n" ."\n";
$wkMailbody .= $row['MAIL_BODY'] ."\n" ."\n";
$wkMailbody .= $row2['TENNIN_MEI_TEN'] ."(" .$row2['TENNIN_MAIL_ADDR'] .")";
$wkRet = sendMailEmoji($row2["CUST_MAIL_ADDR"],$row['MAIL_SUBJECT'],$wkMailbody,$row['MAIL_FROM']);

●メインから呼ばれる関数(sendMailEmoji)とキャリア判別関数(getMailcarrier)

function sendMailEmoji($to,$subject,$body,$from) {
$wkCarrier = getMailcarrier($to);
$emoji = HTML_Emoji::getInstance($wkCarrier);
$emoji->disableEscaping();
$wkSubject = $emoji->filter($subject, 'output');
$wkSubject = base64_encode($wkSubject);
if($wkCarrier == "iphone"):
$wkSubject = "=?UTF-8?B?" . $wkSubject . "?=";
else:
$wkSubject = "=?Shift_JIS?B?" . $wkSubject . "?=";
endif;
 -- 省略 --
if($wkCarrier == "iphone"):
$wkHeader .= "Content-Type: text/plain;charset=UTF-8\r\n";
else:
$wkHeader .= "Content-Type: text/plain;charset=Shift_JIS\r\n";
endif;
$wkHeader .= "Content-Transfer-Encoding: base64";
mail($to,$wkSubject,$wkMailbody,$wkHeader, "-f " .$from);
return true;
}
function getMailcarrier($address) {
 -- 省略 --
if($wkMaildomain == "i.softbank.jp") {$wkCarrier = "iphone";}
if($wkMaildomain == "ezweb.ne.jp") {$wkCarrier = "iphone";}
 -- 省略 --
return $wkCarrier;
}

タイトルRe^6: au-iphoneへ絵文字メールを送る際のロジック
記事No952
投稿日: 2012/05/14(Mon) 08:44:50
投稿者revulo
これでうまくいかないだろうか、というコードを一応載せておきます。
動作検証はしていませんが、もしよろしければ参考にして下さい。
$wkCarrier の値は 'aumail' でなくて良いのか? と思うかもしれませんが、
UTF-8 の場合は、'au' と 'aumail' の区別は無くなるので、
単純に 'au' にしています。

function sendMailEmoji($to,$subject,$body,$from) {
$wkCarrier = getMailcarrier($to);
$emoji = HTML_Emoji::getInstance($wkCarrier);
if ($wkCarrier == 'au') {
$emoji->utf8 = true;
}
$emoji->disableEscaping();
$wkSubject = $emoji->filter($subject, 'output');
$wkSubject = base64_encode($wkSubject);
if ($emoji->utf8):
$wkSubject = ”=?UTF-8?B?” . $wkSubject . ”?=”;
else:
$wkSubject = ”=?Shift_JIS?B?” . $wkSubject . ”?=”;
endif;
 -- 省略 --
if ($emoji->utf8):
$wkHeader .= ”Content-Type: text/plain;charset=UTF-8\r\n”;
else:
$wkHeader .= ”Content-Type: text/plain;charset=Shift_JIS\r\n”;
endif;
$wkHeader .= ”Content-Transfer-Encoding: base64”;
mail($to,$wkSubject,$wkMailbody,$wkHeader, ”-f ” .$from);
return true;
}

function getMailcarrier($address) {
 -- 省略 --
if($wkMaildomain == "i.softbank.jp") {$wkCarrier = "softbank";}
if($wkMaildomain == "ezweb.ne.jp") {$wkCarrier = "au";}
 -- 省略 --
return $wkCarrier;
}

タイトルRe^7: au-iphoneへ絵文字メールを送る際のロジック
記事No953
投稿日: 2012/05/16(Wed) 22:27:17
投稿者まさ
返信ありがとうございます。提示いただいたコーディングを試しましたが、iphoneもガラケーも絵文字部分は化けてしまいました。取り急ぎ状況をお伝えします。

タイトルRe^8: au-iphoneへ絵文字メールを送る際のロジック
記事No954
投稿日: 2012/05/17(Thu) 08:15:56
投稿者revulo
確認したいのですが、HTML_Emoji はどのバージョンのものをお使いでしょうか?
HTML_Emoji 0.8.3 以前と、Unicode 6.0 の絵文字に対応したベータ版では、
キャリアに iPhone を指定した時の動作が違います。
前者だと SoftBank の絵文字に、後者だと Unicode 6.0 の絵文字に変換します。

というのは、つい最近知ったのですが、Unicode 6.0 の絵文字を送った場合には、
au のサーバ側で変換してくれるようです。
http://d.hatena.ne.jp/NAOI/20120516/1337145807

au の UTF-8 の絵文字を送ると文字化けする、というのが釈然としませんが、
キャリアとして強制的に "iphone" (というか "unicode"?)を指定するのは、
実は理にかなっているのかもしれないです。

タイトルRe^9: au-iphoneへ絵文字メールを送る際のロジック
記事No957
投稿日: 2012/05/30(Wed) 14:24:35
投稿者まさ
すみません。返信が大変遅れました。以下のベータ版を使用しています。
http://download.revulo.com/PHP/HTML_Emoji-20111114.zip
http://download.revulo.com/PHP/emoji_images.zip
「Unicode 6.0 の絵文字を送った場合には、au のサーバ側で変換してくれるようです。」ということなので問題ないということでしょうか。

タイトルRe^10: au-iphoneへ絵文字メールを送る際のロジック
記事No959
投稿日: 2012/05/31(Thu) 12:41:37
投稿者revulo
> すみません。返信が大変遅れました。以下のベータ版を使用しています。
> http://download.revulo.com/PHP/HTML_Emoji-20111114.zip
> http://download.revulo.com/PHP/emoji_images.zip
> 「Unicode 6.0 の絵文字を送った場合には、au のサーバ側で変換してくれるようです。」ということなので問題ないということでしょうか。

それならば納得です。
au 宛ての絵文字メールで、ガラケーと iPhone の両方に対応するためには、
現状では Unicode 6.0 の絵文字を使って UTF-8 で送信するのが、解決策の1つ
ということですね。
有用な情報をどうもありがとうございました。