はじめに
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関数: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送信メール1 テキストメール基本 - mail関数/UTF-8 | UTF-8 | テキストメール | 追加パラメータ | ||
2 | PHP送信メール2 テキストメール基本 - mb_send_mail関数/UTF-8 | UTF-8 | mb_send_mail | テキストメール | 追加パラメータ | |
3 | PHP送信メール3 テキストメール基本 - mail関数/SHIFT-JIS | SHIFT-JIS | テキストメール | |||
4 | PHP送信メール4 テキストメール応用 - mail関数/CcBcc/UTF-8 | UTF-8 | テキストメール | Cc/Bcc | ||
5 | PHP送信メール5 テキストメール応用 - mb_send_mail関数/添付ファイル/UTF-8 | UTF-8 | mb_send_mail | テキストメール | 添付ファイル | |
記事 |
1.PHP送信メール1 テキストメール基本-mail関数/UTF-8
・呼び出し方 - テキストメールを送信します
- 送信先アドレス(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でデフォルト値を指定している場合は、省略することができます。 - 追加パラメータ(params)(オプション)
追加パラメータは、 追加のフラグをコマンドラインオプションとしてメール送信プログラムに渡す際に使用可能です。
メール送信プログラムは、設定オプション sendmail_path により設定されます。
例えば、 sendmail を使用する際に -f オプションを使って エンベロープ(エンベロープFrom)の senderアドレス(Return-Path)を設定する際に使用できます。
追加パラメータ(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メールは、以下の不具合があります。
- 件名が全角18文字以上の場合、文字化けする(outlook仕様)
- 本文が2行改行される(outlook仕様)
項番 | 送信内容 | @yahoo.co.jp | @outlook.jp | @gmail.com | 携帯 | 備 考 |
1 | Fromアドレス名称 | OK | OK | OK | ||
2 | 件名 | OK | OK*1 | OK | ||
3 | 本文(特殊文字含む) | OK | OK*2 | OK | ||
4 | 追加パラメータ(params) メール送信エラー時のエラー情報 *3 | OK | OK | OK | ||
記事 |
*1:件名が全角18文字以上の場合文字化け *2:本文が2行改行される *3:メール送信エラーの確認方法は、存在しないメールアドレスをToに設定して確認しました。 |
2.PHP送信メール2 テキストメール基本-mb_send_mail関数/UTF-8
・呼び出し方 - テキストメールを送信します
- 送信先アドレス(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でデフォルト値を指定している場合は、省略することができます。 - 追加パラメータ(params)(オプション)
追加パラメータは、 追加のフラグをコマンドラインオプションとしてメール送信プログラムに渡す際に使用可能です。
メール送信プログラムは、設定オプション sendmail_path により設定されます。
例えば、 sendmail を使用する際に -f オプションを使って エンベロープ(エンベロープFrom)の senderアドレス(Return-Path)を設定する際に使用できます。
引数、戻り値は、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アドレス名称、件名および特殊文字を含まない本文などは、正しく表示されます。
ただし、下記に示す不具合があります。
- 件名が全角18文字以上の場合、文字化けする(outlook仕様)
- 本文が2行改行される(outlook仕様)
- 本文内の特殊文字(環境依存文字)が、文字化けする(例:①など)
項番 | 送信内容 | @yahoo.co.jp | @outlook.jp | @gmail.com | 携帯 | 備 考 |
1 | Fromアドレス名称 | OK | OK | OK | ||
2 | 件名 | OK | OK *1 | OK | ||
3 | 本文(特殊文字含む) | OK*3 | OK*2,*3 | OK*3 | ||
4 | 追加パラメータ(params) メール送信エラー時のエラー情報 *4 | OK | OK | OK | ||
記事 |
*1:件名が全角18文字以上の場合、文字化けする *2:本文が2行改行される *3:特殊文字(環境依存文字)が、文字化けする(例:①など) *4:メール送信エラーの確認方法は、存在しないメールアドレスをToに設定して確認しました。 |
3.PHP送信メール3 テキストメール基本-mail関数/SHIFT-JIS
・呼び出し方 - テキストメールを送信します
- 送信先アドレス(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
/*** 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メールにおいて、以下の不具合があります。
- 件名が全角18文字以上の場合、文字化けする(outlook仕様)
- 本文が2行改行される(outlook仕様)
項番 | 送信内容 | @yahoo.co.jp | @outlook.jp | @gmail.com | 携帯 | 備 考 |
1 | Fromアドレス名称 | OK | OK | OK | ||
2 | 件名 | OK | OK*1 | OK | ||
3 | 本文(特殊文字含む) | OK | OK*2 | OK | ||
4 | その他 | |||||
記事 |
*1:件名が全角18文字以上の場合、文字化けする *2:本文が2行改行される |
4.PHP送信メール4 テキストメール応用 - mail関数/CcBcc/UTF-8
・呼び出し方 - テキストメールを送信します
- 送信先アドレス(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
//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メールにおいて、以下の不具合があります。
- 件名が全角18文字以上の場合、文字化けする(outlook仕様)
- 本文が2行改行される(outlook仕様)
項番 | 送信内容 | @yahoo.co.jp | @outlook.jp | @gmail.com | 携帯 | 備 考 |
1 | Fromアドレス名称 | OK | OK | OK | ||
2 | 件名 | OK | OK*1 | OK | ||
3 | 本文(特殊文字含む) | OK | OK*2 | OK | ||
4 | その他 | |||||
記事 |
*1:件名が全角18文字以上の場合文字化け *2:本文が2行改行される |
5.PHP送信メール5 テキストメール応用 - mb_send_mail関数/添付ファイル/UTF-8
・呼び出し方 - テキストメールを送信します
- 送信先アドレス(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関数で日本語メールを送信する場合は、以下の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アドレス名称、件名および特殊文字を含む本文などは、正しく表示されます。
また、添付ファイルも正しく受信しています。
項番 | 送信内容 | @yahoo.co.jp | @outlook.jp | @gmail.com | 携帯 | 備 考 |
1 | Fromアドレス名称 | OK | OK | OK | ||
2 | 件名 | OK | OK*1 | OK | ||
3 | 本文(特殊文字含む) | OK | OK*2 | OK | ||
4 | その他 | |||||
記事 |
*1:件名が全角18文字以上の場合、文字化けする *2:本文が2行改行される |
- ▼ サイト内関連リンク
- ・PHP送信メール テキストメール 基本編3例 ・応用編2例(本ページ)
- ・PHP送信メール HTMLメール 基本編2例・応用編1例
- ・PHP送信メール docomoガラケー携帯メール TEXT/HTMLメール2例