PHP送信メール テキストメール 基本編3例 ・応用編2例

基本編3例:mail関数 UTF-8、mb_send_mail関数 UTF-8、mail関数 SHIFT-JIS
応用編2例:mail関数 Cc/Bcc UTF-8、mb_send_mail関数 添付ファイル UTF-8

はじめに

PHPでメール送信する方法は大きく分けると「mail関数」と「mb_send_mail関数」の2種類あります。
また、メール本文の形式には、文書のみで作成された一般的な「テキストメール」と、画像の挿入や文字加工で見た目を整えたHTMLで作成された「HTMLメール」があります。
日本語でのメール送信が主になることが想定される場合は、マルチバイトに対応のmb_send_mail関数の方を利用することを進めます。
本ページは、PHPのmail関数またはmb_send_mail関数を使用して、一般的なTextメール(テキストメール)の送信方法について、基本3例および、 応用2例の合わせて5例(下表)について述べます。 なお、HTMLメールの送信の方法については、別途公開予定です。
メール送信の検証メーラー(確認環境)は、@yahoo.co.jp、@outlook.jp および @gmail.comの3メーラーを使用します。

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

UTF-8mailテキストメール追加パラメータ
2PHP送信メール2 テキストメール基本 -
mb_send_mail関数/UTF-8

UTF-8mb_send_mailテキストメール追加パラメータ
3PHP送信メール3 テキストメール基本 -
mail関数/SHIFT-JIS

SHIFT-JISmailテキストメール
4PHP送信メール4 テキストメール応用 -
mail関数/CcBcc/UTF-8

UTF-8mailテキストメールCc/Bcc
5PHP送信メール5 テキストメール応用 -
mb_send_mail関数/添付ファイル/UTF-8

UTF-8mb_send_mailテキストメール添付ファイル
記事

1.PHP送信メール1 テキストメール基本-mail関数/UTF-8


・呼び出し方 - テキストメールを送信します
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でデフォルト値を指定している場合は、省略することができます。
  5. 追加パラメータ(params)(オプション)
    追加パラメータは、 追加のフラグをコマンドラインオプションとしてメール送信プログラムに渡す際に使用可能です。
    メール送信プログラムは、設定オプション sendmail_path により設定されます。
    例えば、 sendmail を使用する際に -f オプションを使って エンベロープ(エンベロープFrom)の senderアドレス(Return-Path)を設定する際に使用できます。
(1) mail関数を使用してメール送信するPHPサンプル

追加パラメータ(params)(オプション)の設定例です(7行、8行目参照)。
メール送信時、エラーが発生したときにメーラーからのエラー情報送信先メールアドレス(Return-Path)を設定できます($params)。

<?php
//PHP送信メール1 テキストメール基本 - mail関数/UTF-8
  $to = $_POST['to'];
  $subject = $_POST['subject'];
  $message = $_POST['message'];    // nl2br($_POST['content']); 
  $headers = "From: ". $_POST['from'];
  $params = "-f" . "xxxxx@yyyyy.com"; //追加パラメータ:送信エラー時のエラー情報送信先メールアドレス
  if(mail($to, $subject, $message, $headers, $params)){   //$params:追加パラメータ
	echo "メールを送信しました";
   } else {
	echo "メールの送信に失敗しました";
   }
?>  
<?php
//PHP送信メール1 テキストメール基本 - mail関数/UTF-8 
  $to = $_POST['to'];
  $subject = $_POST['subject'];
  $message = $_POST['message'];    // nl2br($_POST['content']); 
  $headers = "From: ". $_POST['from'];
  
  if(mail($to, $subject, $message, $headers)){
	echo "メールを送信しました";
   } else {
	echo "メールの送信に失敗しました";
   }
?>  

(2) メール送信する入力フォームHTMLサンプル

<!DOCTYPE html>
<html lang="ja">
<head> 
<meta charset="UTF-8" />
<title>PHP送信メール1 テキストメール基本 - mail関数/UTF-8</title>
</head>
<body>
<h2>PHP送信メール1 テキストメール基本 - mail関数/UTF-8</h2>
<form action="php-sendmail-example1.php" method="post">
 <table>
        <tr><td>差出人(From)</td><td><input type="text" name="from"> 例:山田<yamada@yamada.co.jp></td></tr>
	<tr><td>送信先(To)</td><td><input type="text" name="to"></td></tr>
	<tr><td>件名</td><td><input type="text" name="subject"></td></tr>
	<tr><td>本文</td><td><textarea name="message" cols="50" rows="5">
PHP送信メール1 テキストメール基本 - mail関数/UTF-8

■特殊文字(環境依存文字)テスト
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳
㈱ ㌔ 髙 Ⅷ ㌫ ㎏ ㍼

侍ジャパン14年ぶり3度目の世界一!
WBC史上初 二刀流で活躍の大谷翔平が大会MVP獲得!
【2023 WORLD BASEBALL CLASSIC? 決勝ハイライト】
3月22日 アメリカ 2 - 3 日本
</textarea></td></tr>
	<tr><td></td><td><input type="submit" name="send" value="送信"></td></tr>
 </table>
</form>
</body>
</html>  

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

メール送信確認結果は、日本語を含むFromアドレス名称、件名および特殊文字を含む本文などは、正しく表示されます。
ただし、outlookメールは、以下の不具合があります。

  1. 件名が全角18文字以上の場合、文字化けする(outlook仕様)
  2. 本文が2行改行される(outlook仕様)
また、メール送信エラー時のエラー情報も、送信されています。


PHP送信メール1 メール送信確認結果
項番送信内容@yahoo.co.jp@outlook.jp@gmail.com携帯備 考
1Fromアドレス名称
OKOKOK
2件名
OKOK*1OK
3本文(特殊文字含む)
OKOK*2OK
4追加パラメータ(params)
メール送信エラー時のエラー情報 *3
OKOKOK
記事 *1:件名が全角18文字以上の場合文字化け
*2:本文が2行改行される
*3:メール送信エラーの確認方法は、存在しないメールアドレスをToに設定して確認しました。

2.PHP送信メール2 テキストメール基本-mb_send_mail関数/UTF-8


・呼び出し方 - テキストメールを送信します
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でデフォルト値を指定している場合は、省略することができます。
  5. 追加パラメータ(params)(オプション)
    追加パラメータは、 追加のフラグをコマンドラインオプションとしてメール送信プログラムに渡す際に使用可能です。
    メール送信プログラムは、設定オプション sendmail_path により設定されます。
    例えば、 sendmail を使用する際に -f オプションを使って エンベロープ(エンベロープFrom)の senderアドレス(Return-Path)を設定する際に使用できます。
(1) mb_send_mail関数を使用してメール送信するPHPサンプル

引数、戻り値は、mail関数と同じですが、mb_send_mail関数で日本語メールを送信する場合は、以下の2行を追加します。

     mb_language("Japanese");  // 言語の指定
     mb_internal_encoding("UTF-8");  // 文字のエンコードの指定

追加パラメータ(params)(オプション)の設定例を示します(15行、18行目参照)。 メール送信時、エラーが発生したときにメーラーからのエラー情報送信先メールアドレス(Return-Path)を設定できます($params)。

<?php
//PHP送信メール2 TEXTメール基本-mb_send_mail関数/UTF-8
   mb_language("Japanese");        //mb_send_mail 用
   mb_internal_encoding("UTF-8");  //mb_send_mail 用

   $to = $_POST['to'];
   $subject = $_POST['subject'];
   $message = $_POST['message']; 

   $fr = $_POST['from'];
   $fromarr =  explode("<",$_POST['from']);
   $fromname =   mb_encode_mimeheader($fromarr[0],"iso-2022-jp"); 
   $from = $fromname . "<" . $fromarr[1];
   $message = mb_convert_encoding($message, 'ISO-2022-JP-ms', 'UTF-8'); //特殊文字①などNGの場合mb_convert_encoding
   $params = "-f " . "ma3ki2@yahoo.co.jp";   //追加パラメータ:送信エラー時のエラー情報送信先メールアドレス
   $headers = "From: ". $from ."\r\n";  

   if(mb_send_mail($to, $subject, $message, $headers, $params)){   //$params:追加パラメータ
       echo "メールを送信しました";
   } else {
       echo "メールの送信に失敗しました";
   }
?>   
<?php
//PHP送信メール2 TEXTメール基本-mb_send_mail関数/UTF-8
   mb_language("Japanese");        //mb_send_mail 用
   mb_internal_encoding("UTF-8");  //mb_send_mail 用

   $to = $_POST['to'];
   $subject = $_POST['subject'];
   $message = $_POST['message']; 

   $fr = $_POST['from'];
   $fromarr =  explode("<",$_POST['from']);
   $fromname =   mb_encode_mimeheader($fromarr[0],"iso-2022-jp"); 
   $from = $fromname . "<" . $fromarr[1];
   $message = mb_convert_encoding($message, 'ISO-2022-JP-ms', 'UTF-8'); //特殊文字①などNGの場合mb_convert_encoding

   $headers = "From: ". $from ."\r\n";  

   if(mb_send_mail($to, $subject, $message, $headers)){  
       echo "メールを送信しました";
   } else {
       echo "メールの送信に失敗しました";
   }
?>  

このサンプルは、日本語のテキストメールを送信できますが、メール本文内に特殊文字を含む場合、特殊文字が文字化けします。 特殊文字を正しく表示するためには、下記のとおりmb_convert_encoding関数1行を追加(14行目)します。

     $message = mb_convert_encoding($message, 'ISO-2022-JP-ms', 'UTF-8'); //特殊文字①などNGの場合 


(2) メール送信する入力フォームHTMLサンプル

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHP送信メール2 テキストメール基本 - mb_send_mail関数/UTF-8</title>
</head>
<body>
<h2>PHP送信メール2 テキストメール基本 - mb_send_mail関数/UTF-8</h2>
<form action="php-sendmail-example2.php" method="post">
    <table>
        <tr><td>差出人(From)</td><td><input type="text" name="from"> 例:山田<yamada@yamada.co.jp></td></tr>
		<tr><td>送信先(To)</td><td><input type="text" name="to"></td></tr>
		<tr><td>タイトル</td><td><input type="text" name="subject"></td></tr>
		<tr><td>本文</td><td><textarea name="message" cols="50" rows="5">
PHP送信メール2 テキストメール基本 - mb_send_mail関数/UTF-8

■特殊文字(環境依存文字)テスト
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳
㈱ ㌔ 髙 Ⅷ ㌫ ㎏ ㍼

侍ジャパン14年ぶり3度目の世界一!
WBC史上初 二刀流で活躍の大谷翔平が大会MVP獲得!
【2023 WORLD BASEBALL CLASSIC 決勝ハイライト】
3月22日 アメリカ 2 - 3 日本
</textarea></td></tr>
		<tr><td></td><td><input type="submit" name="send" value="送信"></td></tr>
</form>
</body>
</html> 

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

メール送信確認結果は、日本語を含むFromアドレス名称、件名および特殊文字を含まない本文などは、正しく表示されます。
ただし、下記に示す不具合があります。

  1. 件名が全角18文字以上の場合、文字化けする(outlook仕様)
  2. 本文が2行改行される(outlook仕様)
  3. 本文内の特殊文字(環境依存文字)が、文字化けする(例:①など)

PHP送信メール2 メール送信確認結果
項番送信内容@yahoo.co.jp@outlook.jp@gmail.com携帯備 考
1Fromアドレス名称
OKOKOK
2件名
OKOK *1OK
3本文(特殊文字含む)
OK*3OK*2,*3OK*3
4追加パラメータ(params)
メール送信エラー時のエラー情報 *4
OKOKOK
記事 *1:件名が全角18文字以上の場合、文字化けする
*2:本文が2行改行される
*3:特殊文字(環境依存文字)が、文字化けする(例:①など)
*4:メール送信エラーの確認方法は、存在しないメールアドレスをToに設定して確認しました。

3.PHP送信メール3 テキストメール基本-mail関数/SHIFT-JIS


・呼び出し方 - テキストメールを送信します
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
/*** PHP送信メール3 - 基本テキストメール(mmail関数) SHIFT-JIS ***/
$to = $_POST['to']; 
$from = $_POST['from'];
$subject = $_POST['subject'];
$fromname = $_POST['from-name'];  // 送信者名
$from_name = mb_convert_encoding($fromname , 'UTF-8', 'SJIS-win');
$body = nl2br($_POST['message']);  //nl2br($_POST['content']); 
// 文字コードをUTF-8に変換
$from_name 	= mb_encode_mimeheader($from_name);  //outlookのみ これを指定
$subject 	= mb_convert_encoding($subject, 'UTF-8', 'SJIS-win'); //ISO-2022-JP-ms 携帯文字化け 件名タイトルコード変換不要2023.3.23
$message	= mb_convert_encoding($body, 'UTF-8', 'SJIS-win');

mb_internal_encoding("utf-8");  // PHPの文字コードをUTF-8に指定

//header設定
$headers = 'MIME-Version: 1.0';
$headers .= "\r\n";
$headers .= "From:" . $from_name . "<" . $from . ">";
$headers .= "\r\n";
$headers .= "Content-type: text/html; charset=UTF-8";
$headers .= "\r\n";
$headers .= "Content-Transfer-Encoding = 8bit";

// メール送信
mail($to, $subject, $message, $headers);
?>

(2) メール送信する入力フォームHTMLサンプル

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="SHIFT-JIS" />
<title>PHP送信メール3 テキストメール基本 - mail関数/SHIFT-JIS</title>
</head>
<body>
<h2>PHP送信メール3 テキストメール基本 - mail関数/SHIFT-JIS</h2>
<form action="php-sendmail-example3.php" method="post">
    <table>
        <tr><td>差出人名</td><td><input type="text" name="from-name"> 例:山田太郎</td></tr>
        <tr><td>差出人メールアドレス(From)</td><td><input type="text" name="from"> </td></tr>
	<tr><td>送信先(To)</td><td><input type="text" name="to"></td></tr>
	<tr><td>タイトル</td><td><input type="text" name="subject"></td></tr>
	<tr><td>本文</td><td><textarea name="message" cols="50" rows="5">
PHP送信メール3 テキストメール基本 - mail関数/SHIFT-JIS

■特殊文字(環境依存文字)テスト
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳
㈱ ㌔ 髙 Ⅷ ㌫ ㎏ ㍼

侍ジャパン14年ぶり3度目の世界一!
WBC史上初 二刀流で活躍の大谷翔平が大会MVP獲得!
【2023 WORLD BASEBALL CLASSIC 決勝ハイライト】
3月22日 アメリカ 2 - 3 日本
</textarea></td></tr>
		<tr><td></td><td><input type="submit" name="send" value="送信"></td></tr>
</form>
</body>
</html> 

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

メール送信確認結果は、日本語を含むFromアドレス名称、件名および特殊文字を含む本文などは、正しく表示されます。
ただし、outlookメールにおいて、以下の不具合があります。

  1. 件名が全角18文字以上の場合、文字化けする(outlook仕様)
  2. 本文が2行改行される(outlook仕様)

PHP送信メール3 メール送信確認結果
項番送信内容@yahoo.co.jp@outlook.jp@gmail.com携帯備 考
1Fromアドレス名称
OKOKOK
2件名
OKOK*1OK
3本文(特殊文字含む)
OKOK*2OK
4その他
記事 *1:件名が全角18文字以上の場合、文字化けする
*2:本文が2行改行される

4.PHP送信メール4 テキストメール応用 - mail関数/CcBcc/UTF-8


・呼び出し方 - テキストメールを送信します
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
//PHP送信メール4 テキストメール応用 - mail関数/CcBcc/UTF-8
   $name = $_POST['name'];
   $from = $_POST['from'];
   $to = $_POST['to'];
   $subject = $_POST['subject'];
   $cc = $_POST['cc'];
   $bcc = $_POST['bcc'];
   $message = nl2br($_POST['message']);
   //ヘッダー
   $headers = "From: ". $name  . "<" . $from . ">";  // mb_encode_mimeheader($name) 
   $headers .= "\r\n";      //改行
   $headers .= "Cc: $cc";   //cc
   $headers .= "\r\n";
   $headers .= "Bcc: $bcc"; //bcc
   $headers .= "\r\n";
   $headers .= "Content-Type: text/html; charset=UTF-8";
   //メールを送信
if(mail($to, $subject, $message,$headers)){
	echo "メールを送信しました";
} else {
	echo "メールの送信に失敗しました";
}
?> 

(2) メール送信する入力フォームHTMLサンプル

<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>PHP送信メール4 テキストメール応用 - mail関数/CcBcc/UTF-8</title>
</head>
<body>
<h2>PHP送信メール4 テキストメール応用 - mail関数/CcBcc/UTF-8</h2>
<form action="php-sendmail-example4.php" method="post">
    <table>
        <tr><td>差出人名</td><td><input type="text" name="name"> </td></tr>
        <tr><td>差出人(From)</td><td><input type="text" name="from"> </td></tr>
		<tr><td>宛先(To)</td><td><input type="text" name="to"></td></tr>
		<tr><td>Cc</td><td><input type="text" name="cc"></td></tr>
		<tr><td>Bcc</td><td><input type="text" name="bcc"></td></tr>
		<tr><td>件名</td><td><input type="text" name="subject" size="45"></td></tr>
		<tr><td>本文</td><td><textarea name="message" cols="50" rows="5">
PHP送信メール4 テキストメール応用 - mail関数/CcBcc/UTF-8

■特殊文字(環境依存文字)テスト
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳
㈱ ㌔ 髙 Ⅷ ㌫ ㎏ ㍼

侍ジャパン14年ぶり3度目の世界一!
WBC史上初 二刀流で活躍の大谷翔平が大会MVP獲得!
【2023 WORLD BASEBALL CLASSIC? 決勝ハイライト】
3月22日 アメリカ 2 - 3 日本
</textarea></td></tr>
		<tr><td></td><td><input type="submit" name="send" value="送信"></td></tr>
</form>
</body>
</html> 

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

メール送信確認結果は、日本語を含むFromアドレス名称、件名および特殊文字を含む本文などは、正しく表示されます。
ただし、outlookメールにおいて、以下の不具合があります。

  1. 件名が全角18文字以上の場合、文字化けする(outlook仕様)
  2. 本文が2行改行される(outlook仕様)


PHP送信メール4 メール送信確認結果
項番送信内容@yahoo.co.jp@outlook.jp@gmail.com携帯備 考
1Fromアドレス名称
OKOKOK
2件名
OKOK*1OK
3本文(特殊文字含む)
OKOK*2OK
4その他
記事 *1:件名が全角18文字以上の場合文字化け
*2:本文が2行改行される

5.PHP送信メール5 テキストメール応用 - mb_send_mail関数/添付ファイル/UTF-8


・呼び出し方 - テキストメールを送信します
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関数で日本語メールを送信する場合は、以下の2行を追加します。

     mb_language("Japanese");  // 言語の指定
     mb_internal_encoding("UTF-8");  // 文字のエンコードの指定

<?php
//PHP送信メール5 TEXTメール応用 - mb_send_mail関数/添付ファイル/UTF-8
 
mb_language("ja");
mb_internal_encoding("UTF-8");

$to =  $_POST['to'];     //宛先
$name = $_POST['name'];  //送信者名
$from = $_POST['from'];  //送信者メールアドレス
$subject = $_POST['subject'];  //件名
$message = $_POST['message'];  // メール本文
$message = mb_convert_encoding($message, 'ISO-2022-JP-ms', 'UTF-8'); //特殊文字①などNGの場合
$tenpupath = $_POST['tenpufile'];
$tenpupatharr = explode("/",$tenpupath); 
$array_count = count($tenpupatharr);  //配列の長さを調べる
$flname =  $tenpupatharr[$array_count-1]; 
$file_path = $tenpupath;  //添付したいファイルのパス
$file = $flname;          //ファイル名
//ヘッダー設定
$header = "Content-Type: multipart/mixed;boundary=\"__BOUNDARY__\"\r\n";
$header .= "Return-Path: " . $to . " \r\n";
//$header .= "From: ". $from ." \n";
$header .= "From: ". $name . "<" . $from . ">" ." \r\n";
$header .= "Sender: " . $from ." \r\n";
$header .= "Reply-To: " . $to . " \r\n";
//本文設定
$body = "--__BOUNDARY__\n";
$body .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n";
$body .= $message . "\n";
$body .= "--__BOUNDARY__\n";
//添付ファイル設定  
$body .= "Content-Type: application/octet-stream; name=\"{$file}\"\n";
$body .= "Content-Disposition: attachment; filename=\"{$file}\"\n";
$body .= "Content-Transfer-Encoding: base64\n";
$body .= "\n";
$body .= chunk_split(base64_encode(file_get_contents($file_path)));
$body .= "--__BOUNDARY__\n";
//送信 if(mail( $to, $subject, $body, $header)){
if(mb_send_mail( $to, $subject, $body, $header)){
	echo "メールを送信しました";
} else {
	echo "メールの送信に失敗しました";
}
?> 

このサンプルは、日本語のテキストメールを送信できますが、メール本文内に特殊文字を含む場合、特殊文字が文字化けします。 特殊文字を正しく表示するためには、下記のとおりmb_convert_encoding関数1行を追加(8行目)します。

     $message = mb_convert_encoding($messages, 'ISO-2022-JP-ms', 'UTF-8'); //特殊文字①などNGの場合


(2) メール送信する入力フォームHTMLサンプル

<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>PHP送信メール5 テキストメール応用 - mb_send_mail関数/添付ファイル/UTF-8</title>
</head>
<body>
<h2>PHP送信メール5 テキストメール応用 - mb_send_mail関数/添付ファイル/UTF-8</h2>
<form action="php-sendmail-example5.php" method="post">
    <table>
        <tr><td>差出人名</td><td><input type="text" name="name"> </td></tr>
        <tr><td>差出人(From)</td><td><input type="text" name="from"> </td></tr>
        <tr><td>添付ファイル(URL)</td><td><input type="text" name="tenpufile" placeholder="(例) ./tmp/xxxxx.pdf"> </td></tr>
	<tr><td>送信先(To)</td><td><input type="text" name="to"></td></tr>
	<tr><td>タイトル</td><td><input type="text" name="subject" size=40></td></tr>
	<tr><td>本文</td><td><textarea name="message" cols="50" rows="5">
テキストメール本文(UTF=8)

<WBC:日本6-5メキシコ>◇準決勝◇20日(日本時間21日)
◇ローンデポパーク(米フロリダ州マイアミ)

【写真】ヘルメットを脱ぎ捨てる大谷

 侍ジャパン大谷翔平投手(28=エンゼルス)が、“ヘルメット飛ばし激走”の心境を明かした。
1点を追う9回先頭、メキシコの守護神ガエゴス(カージナルス)の140キロのチェンジアップを捉えた。
右中間への当たりに、一塁ベース付近で自らヘルメットを投げ飛ばして激走。
同点へ望みをつなぐ二塁打を決めた。
</textarea></td></tr>
		<tr><td></td><td><input type="submit" name="send" value="送信"></td></tr>
</form>
</body>
</html> 

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

メール送信確認結果は、日本語を含むFromアドレス名称、件名および特殊文字を含む本文などは、正しく表示されます。
また、添付ファイルも正しく受信しています。

PHP送信メール5 メール送信確認結果
項番送信内容@yahoo.co.jp@outlook.jp@gmail.com携帯備 考
1Fromアドレス名称
OKOKOK
2件名
OKOK*1OK
3本文(特殊文字含む)
OKOK*2OK
4その他
記事 *1:件名が全角18文字以上の場合、文字化けする
*2:本文が2行改行される


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