PHP送信メール HTMLメール 基本編2例・応用編1例

基本編2例:mail関数 UTF-8、mb_send_mail関数 UTF-8
応用編1例:mail関数 添付ファイル UTF-8

はじめに

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関数およびmb_send_mail関数のPHPマニュアルは以下を参照してください。
PHP送信メール HTMLメール 基本・応用編 3例 メニュー
項番PHP送信メール名(ページ内リンク)ソースコードPHP関数テキストメール
HTMLメール
応用機能備 考
1PHP送信メール6 HTMLメール基本
-mail関数/UTF-8

UTF-8mailHTMLメール
2PHP送信メール7 HTMLメール基本
-mb_send_mail関数/UTF-8

UTF-8mb_send_mailHTMLメール
3PHP送信メール8 HTMLメール応用
-mail関数/添付ファイル/UTF-8

UTF-8mailHTMLメール添付ファイル
記事

1.PHP送信メール6 HTMLメール基本-mail関数/UTF-8


・呼び出し方 - HTMLメールを送信します
mail( 送信先アドレス, 件名, メール本文, 追加ヘッダー)
  1. 送信先アドレス(to)
    メールを送信したい宛先アドレス。
    複数の宛先にメールを送信する場合は、コンマ区切りで複数のアドレスを指定(入力)します。
    (例)"to1@example.com,to2@example.com,to3@example.com"
  2. 件名(subject)
    メールの件名は1行あたりの文字制限の半角78文字まで入力できます(下メール本文を参照)。
  3. メール本文(message)
    メールの本文。
    本文メッセージの改行コードは CRLF (\r\n) となります。各行の長さは 70 文字を超えては いけません。 改行も含めた文字列を代入できますが、一行あたりの長さは70文字未満でなければなりません。そのため日本語の場合は35文字以下になります。
  4. 追加ヘッダー(headers) (オプション)
    メールヘッダーの後に追加挿入されます。
    通常、これには追加のヘッダ(From、Cc、Bcc)のために用いられます。メールを送信する際には、必ず Fromヘッダーが含まれていなければなりません。
    PHP7.2.0以降はstring型とarray型どちらでも使用できます。それ以前はstring型のみになります。
    複数のヘッダを追加する場合は CRLF(\r\n)で区切ります。
    「From」ヘッダーは、php.iniでデフォルト値を指定している場合は、省略することができます。
(1) mail関数を使用してメール送信するPHPサンプル

<?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)に入力(貼り付け)します。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>PHP送信メール6 HTMLメール基本-mail関数/UTF-8</title>
</head>
<body>
<h1>PHP送信メール6 HTMLメール基本-mail関数/UTF-8</h1>
<form action="php-sendmail-example6.php" method="post">
<table id="form">
   <th></th>
   <td style="font-size:20px;font-Weight:bold">
   </td>
   </tr>
   <th>差出人メールアドレス(From)</th>
   <td>
     <input type="text" name="from" size="35" value=""  placeholder="(例) 山田太郎<xxxxx@vvvvv.com>"><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="55" value="PHP送信メール6 HTMLメール基本"><br>
   </td>
  </tr>
   <tr>
   <th>本文</th>
   <td><textarea name="message" rows="7" cols="60">
   ここに、HTMLメール本文(HTML)を貼り付けます
   </textarea></td>
   </tr>
   <tr>
   <th></th>
   <td>	<input type="submit" value="送信"> <input type="reset" value="リセット">
   </td>
   </tr>
</table>
<p class="btn">

</p>
</form>
</body>
</html>  
<html>
<head>
    <title>HTMLメールサンプル</title>
</head>
<body>
  <table cellpadding="0" cellspacing="0" border="0" width="600px">
  <tr>
  <td bgcolor="#1757b9">
    <table cellpadding="0" cellspacing="0" border="0" width="580px" style="margin-left:10px;margin-right:10px">
      <tr>
        <td style="font-size:32px;font-weight:bold;color:#1757b9;padding-left:5px" bgcolor="#ffffff">住宅ハウス通信</td>
        <br>
      </tr>
      <tr>
        <td bgcolor="#ffffff"> 
          <img src="https://livedoor.blogimg.jp/otokoyouzome/imgs/6/6/66826c7d-s.jpg" width="570px" style="padding-left:5px;padding-right:5px">
          <br>
        </td>
      </tr>
      <tr>
        <td bgcolor="#ffffff">
          <p style="font-size:18px;padding-left:5px;font-weight:bold;color:blue">こんにちは、住宅ハウス通信です。</p>
          <p style="font-size:18px;padding-left:5px">
            
            このメールはサンプルです。<br>
            このメールはサンプルです。<br>
            このメールはサンプルです。<br><br>
            ↓ここをクリック!↓<br>
            <a href="http://urbanqee.com/mail-php/textarea/htmlmail-template-20230318-WBC.html">サンプルリンク</a>
          </p>
          <br>
        </td>
      </tr>
    </table>
    <table cellpadding="0" cellspacing="0" border="0" width="580px" style="margin-left:10px;margin-right:10px">
      <tr>
        <td bgcolor="#ffffff" width="49%">
          <p style="color:#ff0000;font-weight:bold;padding-left:5px">注目情報1</p>
          <img src="https://livedoor.blogimg.jp/otokoyouzome/imgs/9/8/98d0f64a-s.jpg" width="270px" style="padding-left:10px;padding-right:10px">
          <br>
          <br>
          <p style="font-size:12px;padding-left:5px">注目情報その1です</p>
          <br>
        </td>
        <td bgcolor="#ffffff" width="49%">
          <p style="color:#ff0000;font-weight:bold;padding-left:5px">注目情報2</p>
          <img src="https://livedoor.blogimg.jp/otokoyouzome/imgs/8/4/84940194-s.jpg" width="270px" style="padding-left:10px;padding-right:10px">
          <br>
          <br>
          <p style="font-size:12px;padding-left:5px">注目情報その2です</p>
          <br>
        </td>
      </tr>
    </table>
  </td>
  </tr>
  <tr>
  <td bgcolor="#1757b9" align="left" style="padding:6px;">
    <p style="font-size:11px;color:#ffffff;padding-left:200px;">
      <br>
      住宅ハウス通信編集部:******************<br>
      発行元住所:********************<br>
      発行元電話番号:0123456789<br>
      発行元メールアドレス:******@******<br><br>
[配信停止]<br>
メールの受信をご希望されない場合は、こちらよりお手続きお願い致します。<br>
<br>
Copyright (C) XXXXXXX CO.,LTD. All rights reserved.
</p>
  </td>
  </tr>
  </table>
</body>
</html>  


(3)メール送信確認結果

メール送信確認結果は、日本語を含むFromアドレス名称、件名および特殊文字を含む本文などは、正しく表示されます。
なお、outlookメールにおいて、テキストメールで件名が全角18文字以上の場合、文字化けしましたが、HTMLメールでは、正しく表示されます。

PHP送信メール6 メール送信確認結果
項番送信内容@yahoo.co.jp@outlook.jp@gmail.com携帯備 考
1Fromアドレス名称
OKOKOK
2件名
OKOKOK
3本文(HTML)
OKOKOK
4その他
記事

2.PHP送信メール7 HTMLメール基本-mb_send_mail関数/UTF-8


・呼び出し方 - HTMLメールを送信します
mb_send_mail( 送信先アドレス, 件名, メール本文, 追加ヘッダー)
  1. 送信先アドレス(to)
    メールを送信したい宛先アドレス。
    複数の宛先にメールを送信する場合は、コンマ区切りで複数のアドレスを指定(入力)します。
    (例)"to1@example.com,to2@example.com,to3@example.com"
  2. 件名(subject)
    件名は1行あたりの文字制限の半角78文字まで入力できます(下メール本文を参照)。
    ただし、outlookメールの場合、全角18/半角36文字以内です(オーバーの場合文字化け)。
  3. メール本文(message)
    メールの本文。
    本文メッセージの改行コードは CRLF (\r\n) となります。各行の長さは 70 文字を超えては いけません。 改行も含めた文字列を代入できますが、一行あたりの長さは70文字未満でなければなりません。そのため日本語の場合は35文字以下になります。
  4. 追加ヘッダー(headers) (オプション)
    メールヘッダーの後に追加挿入されます。
    通常、これには追加のヘッダ(From、Cc、Bcc)のために用いられます。メールを送信する際には、必ず Fromヘッダーが含まれていなければなりません。
    PHP7.2.0以降はstring型とarray型どちらでも使用できます。それ以前はstring型のみになります。
    複数のヘッダを追加する場合は CRLF(\r\n)で区切ります。
    「From」ヘッダーは、php.iniでデフォルト値を指定している場合は、省略することができます。
(1) mb_send_mail関数を使用してメール送信するPHPサンプル

引数、戻り値は、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アドレス名称、件名および特殊文字を含まない本文など、正しく表示されます。

PHP送信メール7 メール送信確認結果
項番送信内容@yahoo.co.jp@outlook.jp@gmail.com携帯備 考
1Fromアドレス名称
OKOKOK
2件名
OKOKOK
3本文(特殊文字含む)
OKOKOK
4その他
記事

3.PHP送信メール8 HTMLメール応用-mail関数/添付ファイル/UTF-8


PHP送信メール8では、メール本文のHTMLメールコードをPHPの内部に持ち、入力フォームからの入力データをメール本文内に埋め込む方法 にいて記述します。 参考サイト(引用):info-search.info


・呼び出し方 - HTMLメールを送信します
mail( 送信先アドレス, 件名, メール本文, 追加ヘッダー)
  1. 送信先アドレス(to)
    メールを送信したい宛先アドレス。
    複数の宛先にメールを送信する場合は、コンマ区切りで複数のアドレスを指定(入力)します。
    (例)"to1@example.com,to2@example.com,to3@example.com"
  2. 件名(subject)
    件名は1行あたりの文字制限の半角78文字まで入力できます(下メール本文を参照)。
    ただし、outlookメールの場合、全角18/半角36文字以内です(オーバーの場合文字化け)。
  3. メール本文(message)
    メールの本文。
    本文メッセージの改行コードは CRLF (\r\n) となります。各行の長さは 70 文字を超えては いけません。 改行も含めた文字列を代入できますが、一行あたりの長さは70文字未満でなければなりません。そのため日本語の場合は35文字以下になります。
  4. 追加ヘッダー(headers) (オプション)
    メールヘッダーの後に追加挿入されます。
    通常、これには追加のヘッダ(From、Cc、Bcc)のために用いられます。メールを送信する際には、必ず Fromヘッダーが含まれていなければなりません。
    PHP7.2.0以降はstring型とarray型どちらでも使用できます。それ以前はstring型のみになります。
    複数のヘッダを追加する場合は CRLF(\r\n)で区切ります。
    「From」ヘッダーは、php.iniでデフォルト値を指定している場合は、省略することができます。
(1) mail関数を使用してメール送信するPHPサンプル

<?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アドレス名称、件名および特殊文字を含む本文などは、正しく表示されます。

PHP送信メール3 メール送信確認結果
項番送信内容@yahoo.co.jp@outlook.jp@gmail.com携帯備 考
1Fromアドレス名称
OKOKOK
2件名
OKOKOK
3本文(特殊文字含む)
OKOKOK
4その他
記事



はじめにPHP送信メール6 基本PHP送信メール7 基本PHP送信メール8 応用TOPへ
     ▼ サイト内関連リンク
・PHP送信メール テキストメール 基本編3例 ・応用編2例
・PHP送信メール HTMLメール 基本編2例・応用編1例(本ページ)
・PHP送信メール docomoガラケー携帯メール TEXT/HTMLメール2例