【PHP入門】メールを送信する方法(mail/mb_send_mail)

こんにちは!フリーエンジニアのせきです。

PHPでは関数を使用することで、簡単にメールを送信することができます。この記事では、

  • mail関数の使用方法
  • mb_send_mail関数の使用方法
  • HTMLメールを送信する方法
  • CC、BCCを指定してメールを送信する方法
  • SMTP経由で送信する方法

といった基本的な内容から、応用的な内容に関しても解説していきます。今回はそんなメールを送信する方法について、わかりやすく解説します!

目次

SMTP認証について

本編の内容に入る前にSMTP認証について触れておきます。記事の後半でも触れますが、SMTPはメール送信のためのプロトコルで、メール送信に使うサーバをSMTPサーバといいます。

現代的なメールサービスではSMTPサーバにSMTP認証というものが組み込まれており、PHPの組み込み関数のみでメールをやり取りするのは少々面倒な状態です。

この記事ではローカル環境のようなSMTP認証がかかっていない環境を想定してサンプルを提供していますが、もし現実の環境でPHPでメールの送受信を実装する際はPEARやQdmailといったライブラリを使うのが一般的です。

ライブラリの導入は紙幅の関係で紹介できませんが、興味のある方はPEARやQdmailで検索してみてください。

メールを送信する

ここではmail関数、mb_send_mail関数を使用して、メールを送信する方法について解説します。

mail関数とは

メールを送信するにはmail関数を使用します。mail関数は以下のように記述します。

bool mail (string $受信者, string $タイトル, string $本文[, string $追加ヘッダ[, string $追加パラメータ ]])

引数について、順番に解説します。

    • 受信者

メールの受信者を指定します。指定できるのは、以下のような形式です。受信者が複数の場合は、カンマ区切りで指定します。

xxx@yyyyy.com
XXX<xxx@yyyyy.com>

    • タイトル

メールのタイトルを指定します。改行はできません。

    • 本文

メールの本文を指定します。改行する場合は、改行コードであるCRLF(\r\n)を使用します。各行の長さは70文字を超えてはいけません。

    • 追加ヘッダ

「From」や「Cc」など、追加したいヘッダを指定します。複数のヘッダを追加する場合は、改行コードであるCRLF(\r\n)を使用します。「From」ヘッダは必須ですが、php.iniにデフォルト値を指定してある場合は、プログラムでは省略することができます。

    • 追加パラメータ

メール送信プログラムに追加したいオプションがある場合に使用します。mail関数は、メールの送信に成功すればTRUEを、失敗すればFALSEを返します。受信者に届いたかどうかではないので、注意してください。

mail関数を使用して、メールを送信するサンプルです。

<?php
$to = "to@samurai.jp";
$subject = "TEST MAIL";
$message = "Hello!\r\nThis is TEST MAIL.";
$headers = "From: from@samurai.jp";
 
mail($to, $subject, $message, $headers);
?>
差出人:from@samurai.jp
宛先:to@samurai.jp
件名:TEST MAIL
Hello!
This is TEST MAIL.

受信者を「$to」、タイトルを「$subject」、メッセージを「$message」、Fromヘッダを「$headers」に入れ、mail関数に渡しています。これで指定した値で、メールが届きます。

mb_send_mail関数とは

mail関数でメールを送信すると、日本語が文字化けしてしまう可能性があります。mb_send_mail関数を使うと、日本語などのマルチバイト文字を扱ってメールの送信を行うことができます。mb_send_mail関数は以下のように記述します。

bool mb_send_mail(string $受信者, string $タイトル, string $本文[, string $追加ヘッダ[, string $追加パラメータ ]])

引数、戻り値は、mail関数と同じです。mb_send_mail関数で日本語のメールを送る場合は、最初に以下の2行を記述します。

mb_language("Japanese");
mb_internal_encoding("UTF-8");

mb_languageは言語を設定する関数です。mb_internal_encodingは文字のエンコードを指定します。

フォームからメールを送信する

入力フォームを作成し、そこからメールを送信し、結果を画面に表示させるサンプルを作成します。送信先、メールのタイトル、本文を入力するmailform.htmlを作成します。

<html>
	<head>
		<meta charset="utf-8" />
		<script type="text/javascript" charset="UTF-8"></script>
	</head>
	<body>
		<form action="./mail.php" method="post">
		<p>受信者</p><input type="text" name="to">
		<p>タイトル</p><input type="text" name="title">
		<p>本文</p><textarea name="content" cols="50" rows="5"></textarea>
		<p><input type="submit" name="send" value="送信"></p>
		</form>
	</body>
</html>

次にメールを送信するmail.phpを作成します。

<html>
	<head>
		<meta charset="utf-8" />
	</head>
	<body>
		<?php
			mb_language("Japanese");
			mb_internal_encoding("UTF-8");

			$to = $_POST['to'];
			$title = $_POST['title'];
			$content = $_POST['content'];

			if(mb_send_mail($to, $title, $content)){
				echo "メールを送信しました";
			} else {
				echo "メールの送信に失敗しました";
			}
		?>
	</body>
</html>

mailform.htmlにアクセスし送信ボタンを押すと、メールが送信されます。

01

画像:メールフォーム

HTMLメールを送信する方法

メールの形式には、文章のみで構成されるテキストメールと、HTMLで作成し装飾文字や画像などを用いたHTMLメールがあります。

HTMLメールを送信するには、第四引数「$追加ヘッダ」にContent-typeヘッダを追加し、「text/html」を指定します。HTMLメールを送信するサンプルです。

<?php
$to = "to@samurai.jp";
$subject = "TEST MAIL";
$message = "<html><body><h1>TEST MAIL</h1></body></html>";
$headers = "From: from@samurai.jp";
$headers .= "\r\n";
$headers .= "Content-type: text/html; charset=UTF-8";
 
mail($to, $subject, $message, $headers);
?>
差出人:from@samurai.jp
宛先:to@samurai.jp
件名:TEST MAIL
TEST MAIL
(h1サイズで表示されます)

$headersに”Content-type: text/html; charset=UTF-8″を追加しています。”charset=”の後には文字コードを指定します。ここでは世界共通で使われている文字コードであるUTF-8を指定しています。

$headersには既にFromヘッダが追加されており、複数のヘッダを追加する場合は改行コードであるCRLF(\r\n)を使用する必要があるので、FromヘッダとContent-typeヘッダを「”\r\n”」で連結しています。これでHTMLメールが届きます。

CC、BCCを指定する方法

CC、BCCを指定するには、第四引数「$追加ヘッダ」にCcヘッダ、Bccヘッダを追加します。CC、BCCを指定してメールを送信するサンプルです。

<?php
$to = "to@samurai.jp";
$subject = "TEST MAIL";
$message = "Hello!rnThis is TEST MAIL.";
$headers = "From: from@samurai.jp";
$headers .= "\r\n";
$headers .= "Cc: cc@samurai.jp";
$headers .= "\r\n";
$headers .= "Bcc: bcc@samurai.jp";
 
mail($to, $subject, $message, $headers);
?>
差出人:from@samurai.jp
宛先:to@samurai.jp
CC:cc@samurai.jp
件名:TEST MAIL
Hello!
This is TEST MAIL.

$headersに”Cc: cc@samurai.jp”と”Bcc: bcc@samurai.jp”を追加しています。それぞれのヘッダは「”\r\n”」で連結しています。これでCC、BCCを指定したメールが届きます。

CCやBCCを複数指定したい場合は、以下のようにヘッダを追加します。

$headers .= "Cc: cc1@samurai.jp";
$headers .= "\r\n";
$headers .= "Cc: cc2@samurai.jp";
$headers .= "\r\n";
$headers .= "Bcc: bcc1@samurai.jp";
$headers .= "\r\n";
$headers .= "Bcc: bcc2@samurai.jp";

SMTP経由で送信する方法

SMTP(Simple Mail Transfer Protocol)とはメールを送信するプロトコルです。実際に使われている外部のSMTPサーバを使用することで、送信したメールが迷惑メールに分類されたり、スパムとしてブロックされたりすることを回避することができます。

SMTPの設定はphp.iniから変更することができます。php.iniの[mail function]部分の「SMTP」にSMTPサーバ名、「smtp_port」にポート番号を記述します。

[mail function]
; http://php.net/smtp
SMTP = smtp.xxxxx.com
; http://php.net/smtp-port
smtp_port = 587

このように設定すると、SMTPサーバ「smtp.xxxxx.com」を利用してメールが送信されます。

PHPを継続的に学習するコツ

PHPの学習をしていて、わからないところが多く何回も調べながらやるのは正直、嫌になってしまいますよね。そこで、どのようにすれば継続的に学習を続けて行けるのかそのコツをご紹介します。

目的を明確にする

まずは、なぜPHPを学んでいるのか明確にしましょう。例えば、PHPを学んで

  • Webサイトが作りたい
  • WordPressの編集がしたい
  • エンジニアとして転職したい
  • フリーランスを目指したい


など、目的は色々あると思います。

この目的を明確にすることがとても大事で、PHPを学ぶ学習意欲に繋がっていきます。目的がないまま学習をしていると、学習すること自体が目的になってしまい、ゴールのない果てしない道を進むことになります。その結果、挫折してしまう人が多いのが現状となっています。

そうならないためにも、PHPを学ぶ目的は言えるようにしましょう。もし言えない場合は、学ぶプログラミング言語自体間違っている可能性もあります。なので、しっかり目的から学んでいる言語があっているか確認しましょう。

学習プランを決める

目的が明確になったら、次に学習プランを立てましょう。この学習プランを立てずに学習している人が多いのですが、学習プランがないと自分が今どのくらい進んでいて、後どのくらい学習をすればいいのか見えないので、学習をすること自体がきつく長続きしません。

学習を継続的に続けるためには学習プランは必須とも言えます。いつまでに、どのレベルになっていて、最終的なゴールはいつ達成するのかはしっかり決めましょう。

先生を見つける

「何度もエラーになって、自分で調べては修正する」この繰り返しがPHPを学習していると起こります。調べてもよくわからないし、時間もかかってしまってプラン通りに学習が進まないというのは当然のように起こります。

調べて直したけどうまく動かないしどうなってんの

このように思い、学習をすること自体に嫌気が指して挫折してしまう人も多いです。

そうならないためにも、「先生」を見つけることが大事になります。先生と言ってもそう簡単に探せそうにないですよね。最近ではSNSでもコミュニティーが増え、相談しやすい環境が増えてきています。こういったコミュニティーや勉強会を利用して先生を見つけるのも一つの手です。

自分に投資することも大事

学習サイトやアプリなど、無料で学習できる環境が整ってはいるものの自分に投資して学習をすることも大事です。本や有料学習サイトは、無料では学べない範囲の学習や機能が付いているので、効率的に学習をすることが可能です。

そして、投資のもう一つの方法がプログラミングスクールで学ぶことです。

独学と違い、プログラミングスクールでは上で紹介した学習を継続するためのサポートが徹底されているので、最も効率の良い学び方と言えるでしょう。先生も自分で探す必要がないので、エラーなどで躓いて時間がかかる心配もありません。

ですが、当然いきなりスクールに入るのは抵抗がありますよね。

その場合は、弊社で行っている無料カウンセリングへ参加してみてください。この無料カウンセリングでは、なぜPHPを学ぶのかその目的をヒアリングして、本当にPHPを学ぶべきなのか、その学習プランはどのように立てるのかなどの提案をしています。

目的をヒアリングすることで、あなたに最適な言語や学習プランが分かるので、最速でエンジニアを目指せるイメージがわきます。

手軽にしかもオンラインでも受けられるので、ぜひ一度目的を明確にしてみましょう。

無料カウンセリングに申し込む

まとめ

今回はメールを送信する方法について解説しました。ショッピングサイトなどの構築では、メール機能が必須となってきますので、使い方をしっかり覚えましょう。メールを送信する方法を忘れてしまったら、この記事を思い出して下さい!

この記事を書いた人

フリーランスでWebシステム開発やゲーム開発をしています。
読者の方にプログラミングの面白さをお伝えしたいです。

目次