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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

メール

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

Q&A

解決済

2回答

1776閲覧

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

erika.m

総合スコア46

PHP

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

メール

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

0グッド

1クリップ

投稿2017/09/07 11:34

編集2017/09/11 03:29

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

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

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

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

PHP

1<?php 2mb_language("ja"); 3mb_internal_encoding("UTF-8"); 4 5$to = "to_address@example.com"; 6$from = "from_address@example.com"; 7$fromname = "送信者 アイウエオ①㋐髙"; 8$subject = "件名 アイウエオ①㋐髙"; 9$message = "本文 アイウエオ①㋐髙"; 10 11$filepath = "tmp/test.jpg"; 12$filename = "テスト画像.jpg"; 13 14$boundary = "__BOUNDARY__"; 15 16$body = ""; 17$body .= "--$boundary\r\n"; 18$body .= "Content-Type: text/plain; charset=UTF-8\r\n"; 19$body .= "Content-Transfer-Encoding: base64\r\n"; 20$body .= "\r\n"; 21$body .= chunk_split(base64_encode($message))."\r\n"; 22$body .= "--$boundary\r\n"; 23$body .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n"; 24$body .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 25$body .= "Content-Transfer-Encoding: base64\r\n"; 26$body .= "\r\n"; 27$body .= chunk_split(base64_encode(file_get_contents($filepath)))."\r\n"; 28$body .= "--$boundary--\r\n"; 29 30$mail_headers = "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 31$mail_headers .= "Content-Transfer-Encoding: base64\r\n"; 32$mail_headers .= "From: =?UTF-8?B?".base64_encode($fromname)."?= <$from>"; 33 34$send = mail( 35 $to, 36 "=?UTF-8?B?".base64_encode($subject)."?=", 37 $body, 38 $mail_headers 39 ); 40 41var_dump($send); 42?> 43

実行環境

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hotta

2017/09/07 13:50

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

回答2

0

自己解決

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

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

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

PHP

1mb_language("ja"); 2mb_internal_encoding("UTF-8"); 3 4$to = "to_address@example.com"; 5$from = "from_address@example.com"; 6$fromname = "送信者 アイウエオ①㋐髙"; 7$subject = "件名 アイウエオ①㋐髙"; 8$message = "本文 アイウエオ①㋐髙"; 9 10$filepath = "tmp/test.jpg"; 11$filename = "テスト画像.jpg"; 12 13$boundary = "__BOUNDARY__"; 14 15 16$body = ""; 17$body .= "--$boundary\r\n"; 18$body .= "Content-Type: text/plain; charset=UTF-8\r\n"; 19$body .= "Content-Transfer-Encoding: base64\r\n"; 20$body .= "\r\n"; 21$body .= chunk_split(base64_encode($message))."\r\n"; 22$body .= "--$boundary\r\n"; 23$body .= "Content-Type: application/octet-stream; name=\"".mb_encode_mimeheader($filename, "UTF-8")."\"\r\n"; 24$body .= "Content-Disposition: attachment; filename=\"".mb_encode_mimeheader($filename, "UTF-8")."\"\r\n"; 25$body .= "Content-Transfer-Encoding: base64\r\n"; 26$body .= "\r\n"; 27$body .= chunk_split(base64_encode(file_get_contents($filepath)))."\r\n"; 28$body .= "--$boundary--\r\n"; 29 30$mail_headers = "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 31$mail_headers .= "Content-Transfer-Encoding: base64\r\n"; 32$mail_headers .= "From: ".mb_encode_mimeheader($fromname, "UTF-8")." <$from>\r\n"; 33 34$send = mail( 35 $to, 36 mb_encode_mimeheader($subject, "UTF-8"), 37 $body, 38 $mail_headers 39 ); 40 41var_dump($send);

投稿2017/09/11 03:56

erika.m

総合スコア46

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

疑問点① 「UTF-8をbase64エンコード」で送って、世間(※)のメーラーやMTAは対応しているのか

以前はWindowsのOutLookはいろいろ文字化けが起きていた気がします。現状は分かりません。

疑問点② そもそも「UTF-8をbase64エンコード」で送る場合の書き方はこれであっているのか

概ね問題ないのではないかと思います。(ファイル名にマルチバイトをそのまま記載して良かったかは?ですが。)

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

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

投稿2017/09/07 23:40

kitaji0306

総合スコア176

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問