はじめに
PHPでメール送信する方法は大きく分けると「mail関数」と「mb_send_mail関数」の2種類あります。
また、メール本文の形式には、文書のみで作成された一般的な「テキストメール」と、画像の挿入や文字加工で見た目を整えたHTMLで作成された「HTMLメール」があります。
日本語でのメール送信が主になることが想定される場合は、マルチバイトに対応のmb_send_mail関数の方を利用することを進めます。
本ページは、PHPのmail関数またはmb_send_mail関数を使用して、HTMLメールの下表3例のメール送信方法について述べます。
なお、テキストメールの送信方法については、下記を参照してください。
http://urbanqee.com/mail-php/php-text-sendmail-basic.html
メール送信の検証メーラー(確認環境)は、@yahoo.co.jp、@outlook.jp および @gmail.comの3メーラーを使用します。
- mail関数:https://www.php.net/manual/ja/function.mail.php
- mb_send_mail関数:https://www.php.net/manual/ja/function.mb-send-mail.php
項番 | PHP送信メール名(ページ内リンク) | ソースコード | PHP関数 | テキストメール HTMLメール | 応用機能 | 備 考 |
1 | PHP送信メール6 HTMLメール基本 -mail関数/UTF-8 | UTF-8 | HTMLメール | |||
2 | PHP送信メール7 HTMLメール基本 -mb_send_mail関数/UTF-8 | UTF-8 | mb_send_mail | HTMLメール | ||
3 | PHP送信メール8 HTMLメール応用 -mail関数/添付ファイル/UTF-8 | UTF-8 | HTMLメール | 添付ファイル | ||
記事 |
1.PHP送信メール6 HTMLメール基本-mail関数/UTF-8
・呼び出し方 - HTMLメールを送信します
- 送信先アドレス(to)
メールを送信したい宛先アドレス。
複数の宛先にメールを送信する場合は、コンマ区切りで複数のアドレスを指定(入力)します。
(例)"to1@example.com,to2@example.com,to3@example.com" - 件名(subject)
メールの件名は1行あたりの文字制限の半角78文字まで入力できます(下メール本文を参照)。 - メール本文(message)
メールの本文。
本文メッセージの改行コードは CRLF (\r\n) となります。各行の長さは 70 文字を超えては いけません。 改行も含めた文字列を代入できますが、一行あたりの長さは70文字未満でなければなりません。そのため日本語の場合は35文字以下になります。 - 追加ヘッダー(headers) (オプション)
メールヘッダーの後に追加挿入されます。
通常、これには追加のヘッダ(From、Cc、Bcc)のために用いられます。メールを送信する際には、必ず Fromヘッダーが含まれていなければなりません。
PHP7.2.0以降はstring型とarray型どちらでも使用できます。それ以前はstring型のみになります。
複数のヘッダを追加する場合は CRLF(\r\n)で区切ります。
「From」ヘッダーは、php.iniでデフォルト値を指定している場合は、省略することができます。
<?php //PHP送信メール6 HTMLメール基本-mail関数/UTF-8 $to = $_POST['to']; $subject = $_POST['subject']; $message = $_POST['message']; //nl2br($_POST['message']); $headers = "From:" . $_POST['from']; $headers .= "\r\n"; $headers .= "Content-type: text/html; charset=UTF-8"; //メール起動 if(mail($to, $subject, $message, $headers)){ echo "メールを送信しました"; } else { echo "メールの送信に失敗しました"; } ?>
(2) メール送信する入力フォームHTMLサンプル
入力フォームの操作において、HTMLメール本文(HTML)全体を、入力フォームの本文(textarea)に入力(貼り付け)します。
(3)メール送信確認結果
メール送信確認結果は、日本語を含むFromアドレス名称、件名および特殊文字を含む本文などは、正しく表示されます。
なお、outlookメールにおいて、テキストメールで件名が全角18文字以上の場合、文字化けしましたが、HTMLメールでは、正しく表示されます。
項番 | 送信内容 | @yahoo.co.jp | @outlook.jp | @gmail.com | 携帯 | 備 考 |
1 | Fromアドレス名称 | OK | OK | OK | ||
2 | 件名 | OK | OK | OK | ||
3 | 本文(HTML) | OK | OK | OK | ||
4 | その他 | |||||
記事 |
2.PHP送信メール7 HTMLメール基本-mb_send_mail関数/UTF-8
・呼び出し方 - HTMLメールを送信します
- 送信先アドレス(to)
メールを送信したい宛先アドレス。
複数の宛先にメールを送信する場合は、コンマ区切りで複数のアドレスを指定(入力)します。
(例)"to1@example.com,to2@example.com,to3@example.com" - 件名(subject)
件名は1行あたりの文字制限の半角78文字まで入力できます(下メール本文を参照)。
ただし、outlookメールの場合、全角18/半角36文字以内です(オーバーの場合文字化け)。 - メール本文(message)
メールの本文。
本文メッセージの改行コードは CRLF (\r\n) となります。各行の長さは 70 文字を超えては いけません。 改行も含めた文字列を代入できますが、一行あたりの長さは70文字未満でなければなりません。そのため日本語の場合は35文字以下になります。 - 追加ヘッダー(headers) (オプション)
メールヘッダーの後に追加挿入されます。
通常、これには追加のヘッダ(From、Cc、Bcc)のために用いられます。メールを送信する際には、必ず Fromヘッダーが含まれていなければなりません。
PHP7.2.0以降はstring型とarray型どちらでも使用できます。それ以前はstring型のみになります。
複数のヘッダを追加する場合は CRLF(\r\n)で区切ります。
「From」ヘッダーは、php.iniでデフォルト値を指定している場合は、省略することができます。
引数、戻り値は、mail関数と同じですが、mb_send_mail関数でHTMLメールを送信する場合は、以下の2行は不用です。
mb_language("Japanese"); // 言語の指定
mb_internal_encoding("UTF-8"); // 文字のエンコードの指定
<?php //PHP送信メール7 HTMLメール基本-mb_send_mail関数/UTF-8 //mb_language("Japanese"); //mb_send_mail関数の場合 HTMLメールの場合不要 //mb_internal_encoding("UTF-8"); //mb_send_mail関数の場合 HTMLメールの場合不要 $to = $_POST['to']; $from = $_POST['from'];; $name = $_POST['name']; $subject = $_POST['subject']; $message = $_POST['message']; // nl2br($_POST['message'])は、2行改行される //$message = mb_convert_encoding($message, 'ISO-2022-JP-ms', 'UTF-8'); //特殊文字①などNGの場合mb_convert_encoding //ヘッダー $headers = "From:" . $name . "<" .$from . ">" . "\r\n"; $headers .= 'Content-type: text/html; charset=UTF-8'; //メール送信 if (mb_send_mail($to, $subject, $message, $headers)) { echo 'メールを送信しました'; } else { echo 'メールの送信に失敗しました'; } ?>
(2) メール送信する入力フォームHTMLサンプル
入力フォームの操作において、HTMLメール本文(HTML)全体を、入力フォームの本文(textarea)に入力(貼り付け)します。 なお、HTMLメール本文(HTML)は、前項1-(2) "メール送信する入力フォームHTMLサンプル"を参照。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHP送信メール7 HTMLメール基本-mb_send_mail関数/UTF-8</title> </head> <body> <form action="php-sendmail-example7.php" method="post"> <table id="form"> <th></th> <td style="font-size:20px;font-Weight:bold">PHP送信メール7 HTMLメール基本 入力フォーム </td> </tr> <th>差出人名称</th> <td> <input type="text" name="name" size="35" value="アーバンキュウ東京"><br> </td> </tr> <th>差出人メールアドレス(From)</th> <td> <input type="text" name="from" size="35" value=""><br> </td> </tr> <th>宛先メールアドレス(To)</th> <td> <input type="text" name="to" size="35" value=""><br> </td> </tr> <th>件名</th> <td> <input type="text" name="subject" size="35" value="PHP送信メール7 HTMLメール基本-mb_send_mail"><br> </td> </tr> <tr> <th></th> <td><textarea name="message" rows="7" cols="55"> ここに、HTMLメール本文(HTML)を貼り付けます </textarea></td> </tr> </table> <p class="btn"> <input type="submit" value="送信"> <input type="reset" value="リセット"> </p> </form> </body> </html>
(3)メール送信確認結果
メール送信確認結果は、日本語を含むFromアドレス名称、件名および特殊文字を含まない本文など、正しく表示されます。
項番 | 送信内容 | @yahoo.co.jp | @outlook.jp | @gmail.com | 携帯 | 備 考 |
1 | Fromアドレス名称 | OK | OK | OK | ||
2 | 件名 | OK | OK | OK | ||
3 | 本文(特殊文字含む) | OK | OK | OK | ||
4 | その他 | |||||
記事 |
3.PHP送信メール8 HTMLメール応用-mail関数/添付ファイル/UTF-8
PHP送信メール8では、メール本文のHTMLメールコードをPHPの内部に持ち、入力フォームからの入力データをメール本文内に埋め込む方法 にいて記述します。 参考サイト(引用):info-search.info
・呼び出し方 - HTMLメールを送信します
- 送信先アドレス(to)
メールを送信したい宛先アドレス。
複数の宛先にメールを送信する場合は、コンマ区切りで複数のアドレスを指定(入力)します。
(例)"to1@example.com,to2@example.com,to3@example.com" - 件名(subject)
件名は1行あたりの文字制限の半角78文字まで入力できます(下メール本文を参照)。
ただし、outlookメールの場合、全角18/半角36文字以内です(オーバーの場合文字化け)。 - メール本文(message)
メールの本文。
本文メッセージの改行コードは CRLF (\r\n) となります。各行の長さは 70 文字を超えては いけません。 改行も含めた文字列を代入できますが、一行あたりの長さは70文字未満でなければなりません。そのため日本語の場合は35文字以下になります。 - 追加ヘッダー(headers) (オプション)
メールヘッダーの後に追加挿入されます。
通常、これには追加のヘッダ(From、Cc、Bcc)のために用いられます。メールを送信する際には、必ず Fromヘッダーが含まれていなければなりません。
PHP7.2.0以降はstring型とarray型どちらでも使用できます。それ以前はstring型のみになります。
複数のヘッダを追加する場合は CRLF(\r\n)で区切ります。
「From」ヘッダーは、php.iniでデフォルト値を指定している場合は、省略することができます。
<?php //引用:https://info-search.info/?p=843 //PHP送信メール8 HTMLメール応用-mail関数/添付ファイル/UTF-8 //メール送信関数 function SendAttachedMail( $mail_from , $mail_to , $subject , $body_html , &$file , $from_name ){ $subject="=?iso-2022-jp?B?".base64_encode(mb_convert_encoding( $subject , "jis" , 'utf-8' ))."?="; $mail_from_name = $mail_from; $boundary = "__BOUNDARY__". uniqid( rand() , true ) . "__"; // mb_language( 'Japanese' ); mb_internal_encoding( 'UTF-8' ); //--ヘッダー $headers= "MIME-Version: 1.0\n"; $headers .="Content-Type: Multipart/Mixed; boundary=\"$boundary\"\n"; $headers .="From: " . mb_encode_mimeheader($from_name) . "< $mail_from >\n"; //mb_encode_mimeheader($mail_from_name) $headers .="Content-Transfer-Encoding: 7bit\n"; // body $body="--$boundary\n"; $body.="Content-Type: text/html; charset=\"UTF-8\"\n"; $body.="Content-Transfer-Encoding: binary\n"; $body.="\n"; $body.=$body_html."\n"; // 添付ファイル if ($file) { foreach ($file as $value){ $filename = mb_encode_mimeheader( mb_convert_encoding( basename( $value ) , "ISO-2022-JP" , 'auto' ) ); $body .= "--$boundary\r\n"; $body .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n"; $body .= "Content-Transfer-Encoding: base64\n"; $body .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; $body .= "\n"; $body .= chunk_split( base64_encode(file_get_contents($value) ), 76 ,"\r\n" ); $body .= "\r\n"; } } $body .= "--$boundary--\r\n"; // 送信部分 if(!mail ($mail_to,$subject, $body , $headers)){ echo "メールの送信に失敗しましたメールを送信しました"; }else{ echo "メールを送信しました"; } } //メール送信関数 ここまで //入力フォーム $name = $_POST['name']; $from = $_POST['from']; $sex = $_POST['sex']; $nenrei = $_POST['nenrei']; $to = $_POST['to']; //宛先アドレス(To) $subject = $_POST['subject']; //件名 $tenpu = $_POST['tenpufile']; //添付ファイル //HTMLメール(本文)埋め込みデータ $data[0]=$name; //お名前 $data[1]=$sex; //性別 $data[2]=$nenrei; //年齢 $data[3]=$from; //メールアドレス(From) $data[4]=$subject; //件名 //HTMLメール(本文) $body = "<html><body>"; $body .="お問合せ頂きありがとうございます。<br>\r\n"; $body .= "<hr><br>\n"; $body .= "<img src=\"https://livedoor.blogimg.jp/otokoyouzome/imgs/3/3/3360a31d.jpg\" height=\"200\" align=\"left\">\r\n"; $body .= "お名前: $data[0] <br>\r\n"; $body .= "性別: $data[1] <br>\r\n"; $body .= "年齢:$data[2] <br>\r\n"; $body .= "メールアドレス: $data[3] <br>\r\n"; $body .= "ご相談内容:<br>\r\n"; $body .= "$data[4] <br><br>\r\n"; $body .="<hr><b>ご回答の内容につきましては、添付ファイルのPDFをご参照ください。</b><br><br><b>関連写真</b><br>\r\n"; $body .="<img src=\"https://livedoor.blogimg.jp/otokoyouzome/imgs/6/6/66826c7d-s.jpg\"><br>\r\n"; $body .="<a href=\"https://~\"><img src=\"https://livedoor.blogimg.jp/otokoyouzome/imgs/9/8/98d0f64a-s.jpg\"></a><br>\r\n"; $body .="</html></body>"; //添付ファイル $file[] = $tenpu; //メール送信起動 $mail_to = $to; $mail_from = $data[3]; $from_name = $data[0]; $subject = $data[4]; SendAttachedMail($mail_from ,$mail_to , $subject, $body, $file, $from_name ); ?>
(2) メール送信する入力フォームHTMLサンプル
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHP送信メール8 HTMLメール応用-mail関数/添付ファイル/UTF-8</title> <style> th{ text-align:left; } </style> </head> <body style="background:beige"> <form action="php-sendmail-example8.php" method="post"> <table id="form"> <th></th> <td style="font-size:20px;font-Weight:bold">PHP送信メール8 HTMLメール応用-mail関数/添付ファイル/UTF-8 </td> </tr> <th>お名前(差出人)</th> <td> <input type="text" name="name" size="35" value=""><br> </td> </tr> <th>差出人メールアドレス(From)</th> <td> <input type="text" name="from" size="35" value=""><br> </td> </tr> <th>性別</th> <td> <input type="radio" id="men" name="sex" value="男性" checked><label>男性</label> <input type="radio" id="wemen" name="sex" value="女性"><label>女性</label> </td> </tr> <th>年齢</th> <td> <input type="text" name="nenrei" size="1" value=""><br> </td> </tr> <th>宛先メールアドレス(To)</th> <td> <input type="text" name="to" size="35" value="ma3ki2@yahoo.co.jp"><br> </td> </tr> <th>お問い合わせ件名</th> <td> <input type="text" name="subject" size="52" value=""><br> </td> </tr> <th>添付ファイル名(URL)</th> <td> <input type="text" name="tenpufile" size="35" value="" placeholder="(例) ./tmp/XXX.pdf">(お問い合わせ内容記述ファイル)<br> </td> </tr> <!--<tr style=" vertical-align:top"> <th>メール本文(HTML形式)</th> <td><textarea name="message" rows="7" cols="55"></textarea></td> </tr>--> <tr style=" vertical-align:top"> <th></th> <td><br><input type="submit" value="送信"> <input type="reset" value="リセット"></td> </tr> </table> </form> </body> </html>
(3)メール送信確認結果
メール送信確認結果は、日本語を含むFromアドレス名称、件名および特殊文字を含む本文などは、正しく表示されます。
項番 | 送信内容 | @yahoo.co.jp | @outlook.jp | @gmail.com | 携帯 | 備 考 |
1 | Fromアドレス名称 | OK | OK | OK | ||
2 | 件名 | OK | OK | OK | ||
3 | 本文(特殊文字含む) | OK | OK | OK | ||
4 | その他 | |||||
記事 |
- ▼ サイト内関連リンク
- ・PHP送信メール テキストメール 基本編3例 ・応用編2例
- ・PHP送信メール HTMLメール 基本編2例・応用編1例(本ページ)
- ・PHP送信メール docomoガラケー携帯メール TEXT/HTMLメール2例