質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • PHP

    19207questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • メール

    238questions

    メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

PHPでの添付メール送信&文字化け回避について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 899

erika.m

score 38

PHPを利用してメールを送りたくて試行錯誤しています。
ネットに情報はたくさんありましたが、特に文字化けに関することはサイトによって言っていることが違い、どれが正しいのか困惑している状況です。

表示文字に制限があるので出来るだけISO-2022-JPを使いたくないという気持ちがあり
いろいろと組み合わせ、(自身の環境でですが)試してみた結果、以下のようになりました。

問題点等ご指摘いただければ幸いです。
あと、一般的にはこうするという書き方や、ライブラリ、フレームワーク等ありましたら教えていただけますでしょうか。
よろしくお願いします。

疑問点① 「UTF-8をbase64エンコード」で送って、世間(※)のメーラーやMTAは対応しているのか
※メジャー処が対応していれば大丈夫だろうと思ってます…。
疑問点② そもそも「UTF-8をbase64エンコード」で送る場合の書き方はこれであっているのか

<?php
mb_language("ja");
mb_internal_encoding("UTF-8");

$to = "to_address@example.com";
$from = "from_address@example.com";
$fromname = "送信者 アイウエオ①㋐髙";
$subject = "件名 アイウエオ①㋐髙";
$message = "本文 アイウエオ①㋐髙";

$filepath = "tmp/test.jpg";
$filename = "テスト画像.jpg";

$boundary = "__BOUNDARY__";

$body  = "";
$body .= "--$boundary\r\n";
$body .= "Content-Type: text/plain; charset=UTF-8\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "\r\n";
$body .= chunk_split(base64_encode($message))."\r\n";
$body .= "--$boundary\r\n";
$body .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";
$body .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "\r\n";
$body .= chunk_split(base64_encode(file_get_contents($filepath)))."\r\n";
$body .= "--$boundary--\r\n";

$mail_headers  = "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$mail_headers .= "Content-Transfer-Encoding: base64\r\n";
$mail_headers .= "From: =?UTF-8?B?".base64_encode($fromname)."?= <$from>";

$send = mail(
        $to,
        "=?UTF-8?B?".base64_encode($subject)."?=",
        $body,
        $mail_headers
    );

var_dump($send);
?>

実行環境

さくらインターネット上で動かしています。
PHP 5.4
OS:FreeBSD 9.1-RELEASE
Webサーバ:Apache/2.2.34 

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hotta

    2017/09/07 22:50

    まず、OSとPHPのバージョン情報は最低限必要だと思います。あと、メールに100%はおそらくないので、具体的に『受け取り側がXXとYYというパターンは最低でも救いたい』という目標を決めて、その環境を作ってテストしてから、もし動かない場合にそのパターンを詳細に明示してから質問したほうがよいのではないでしょうか。そうしないと、回答者の方でも再現テストができませんので。

    キャンセル

回答 2

check解決した方法

0

軽い気持ちで全てのメーラに対応できればと思っていましたが
どうも100%の対応は無理だということが判明しましたのでUTF-8は諦めます。
特に今回はPC以外での受信を想定していましたので、ガラケーでの表示を優先しようと思います。
UTF-8が表示できない機種が未だ存在しているということが分かっただけでも収穫でした。

以下、質問に載せていたUTF-8でのメール送信コードを少し変更して、自分の中では確定版として残しておきます。
※ヘッダ部分と添付ファイル名にmb_encode_mimeheaderを使うように変更しました。

これはこれで社内システム等限られた環境だと文字化けの心配なく送れるので、無駄ではなかったと思います。

mb_language("ja");
mb_internal_encoding("UTF-8");

$to = "to_address@example.com";
$from = "from_address@example.com";
$fromname = "送信者 アイウエオ①㋐髙";
$subject = "件名 アイウエオ①㋐髙";
$message = "本文 アイウエオ①㋐髙";

$filepath = "tmp/test.jpg";
$filename = "テスト画像.jpg";

$boundary = "__BOUNDARY__";


$body  = "";
$body .= "--$boundary\r\n";
$body .= "Content-Type: text/plain; charset=UTF-8\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "\r\n";
$body .= chunk_split(base64_encode($message))."\r\n";
$body .= "--$boundary\r\n";
$body .= "Content-Type: application/octet-stream; name=\"".mb_encode_mimeheader($filename, "UTF-8")."\"\r\n";
$body .= "Content-Disposition: attachment; filename=\"".mb_encode_mimeheader($filename, "UTF-8")."\"\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "\r\n";
$body .= chunk_split(base64_encode(file_get_contents($filepath)))."\r\n";
$body .= "--$boundary--\r\n";

$mail_headers  = "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$mail_headers .= "Content-Transfer-Encoding: base64\r\n";
$mail_headers .= "From: ".mb_encode_mimeheader($fromname, "UTF-8")." <$from>\r\n";

$send = mail(
        $to,
        mb_encode_mimeheader($subject, "UTF-8"),
        $body,
        $mail_headers
    );

var_dump($send);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

疑問点① 「UTF-8をbase64エンコード」で送って、世間(※)のメーラーやMTAは対応しているのか
以前はWindowsのOutLookはいろいろ文字化けが起きていた気がします。現状は分かりません。

疑問点② そもそも「UTF-8をbase64エンコード」で送る場合の書き方はこれであっているのか
概ね問題ないのではないかと思います。(ファイル名にマルチバイトをそのまま記載して良かったかは?ですが。)

何がメール送信のスタンダードか自分も正しい解はもっていないのですが、
・PEARやComposerで見つかるもの
・検索結果で情報が多いもの
・フレームワークを利用していればをそこで利用されているもの
を使用するのがいいのではないかと考えています。

また、日本ではまだまだISO-2022-JPが根深いので、安全に送信するなら
Content-Typeの指定はISO-2022-JPを利用するほうが無難だと思います。
ただ、内部のエンコーディングは(ISO-2022-JP-MS)を利用するなどの工夫である程度は
利用出来る文字範囲を広げることも可能ではないかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19207questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • メール

    238questions

    メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。