(PHP)mb_send_mailをレンタルサーバーで使ってメール送信する方法

  • URLをコピーしました!
AWSのCloud9環境でPHPの学習を進めています。 またレンタルサーバーを使って実際に作ったPHPが本番環境で動くかを確かめたり、といったことも行っています。 PHPのmb_send_mailというメール送信の関数の使い方の話です。 Cloud9環境では動くけどレンタルサーバーでは動かない事もあるので調べていました。 侍エンジニア塾というプログラミングスクールに入ってるんですけど、自分で調べて解決したので記事にしています。 ということで今日はPHPのmb_send_mail関数を使ったメール送信をやってみました。
目次

phpでメール送信するための手順は2つ

①mb_send_mailを動かすphpファイルの作成 ②php.iniファイルの設定 この2つの手順ですすめていきます。

mb_send_mail関数のリファレンスを確認

(PHP)mb_send_mailをレンタルサーバーで使ってメール送信する方法の本文画像 1
さてphpのコーディングをする前に関数のリファレンスを確認して引数やら使い方やらを見ていきましょう。 mb_send_mailという関数はメールを送信する関数です。 mail()関数でもメール送信はできるけどmb(マルチバイト)日本語を送る事を想定するとmb_send_mail関数を使った方が良いということで基本的にはmb_send_mailを使うようです。

引数などの書き方と返り値

mb_send_mail ( 宛先 , タイトル, 本文, ヘッダー ) となっています。
引数 説明
宛先 String string型で送信先のメールアドレスを指定します。アドレスをカンマで区切れば複数の宛先を指定できます。
タイトル String string型でこのメールのタイトルを記述します
本文 String string型でこのメールの本文を記述します。
ヘッダー String
Array
メールヘッダの最後に挿入されるstringまたはarrayとなっています。ここで送信元アドレス(From)やCc, Bcc、返信先アドレスを指定したりできます。
これでmb_send_mail関数を呼び出して成功すればTRUEが、失敗すればFALSEが返ります。

mb_send_mailをするPHPファイルを用意

以下のPHPファイルを用意します。MAILTOやFromやReturn-Pathは適宜編集してください。 このphpファイルをレンタルサーバーにアップロードしてブラウザでアクセスするだけでメールが送信されます。

<?php

const MAILTO = "info@pg-happy.jp";  //宛先メールアドレス
const SUBJECT = "サンキューメール";
$content = "レンタルサーバーでのメール送信テストです。\n";
$content .= "このメールを受け取ったということはちゃんと送信されていますね。";

$headers = <<<HEAD
From : from@pg-happy.jp //送信元メールアドレス
Return-Path: from@pg-happy.jp //送信元メールアドレス
Content-Type: text/plain;charset=ISO-2022-JP //おまじない(無くてもいいっぽい)
HEAD;

$is_success = mb_send_mail(MAILTO, SUBJECT, $content, $headers);

if(!$is_success) {
  die('メール送信失敗');
}

?>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>メール送信完了画面</title>
</head>
<body>
<p>メール送信が完了しました。</p>
</body>
</html>


もしこのソースで試すなら、MAILTOはご自身のメールアドレスを設定してください。 $headersにはヘッダー情報を入れていきますが、Fromだけでも大丈夫です。 その際には
$headers = 'From:from@pg-happy.jp';
とすればOKです。 ちなみにFromのメールアドレスは架空のでも問題ありませんでした。(本当は良くないと思うけど) レンタルサーバーによってはそのサーバー内で作成したメールアドレスしか受け付けない場合もあるかもしれません。 またPHPのリファレンスによるとFromは必ず記述しなければ以下のWarningが出ると書かれています。 Warning: mail(): “sendmail_from” not set in php.ini or custom “From:” header missing けど私がテストしたときはFromが無くてもメール送信できちゃいました。 その際の送信元はレンタルサーバーのデフォルトメールアドレスになっていました。

サーバーのphp.iniファイルの設定

(PHP)mb_send_mailをレンタルサーバーで使ってメール送信する方法の本文画像 2
mb_send_mail関数を使うにあたってサーバー内にあるphp.iniファイルを編集する必要がある場合があります。 私が使ってるレンタルサーバーのエックスサーバーでは特に編集の必要はありませんでしたけど。 以下のように記述があると思いますがこのままで問題なし。
SMTP = localhost
smtp_port = 25
sendmail_path = /usr/sbin/sendmail -t -i
最初メール送信ができなくて色々調査してたんですけど、ネットのブログとかでは以下のように編集すべし、とか書かれているブログもありました。
SMTP = sv000.xserver.jp
smtp_port = 587
sendmail_path = /usr/sbin/sendmail -t -i
STMPには自分が契約しているサーバーの番号を記述し、smtp_portには25ではなくて587を指定せよ、ということです。 念のためエックスサーバーのphp.iniの編集方法を書いておきます サーバーパネルからログインし 画面下部php.ini設定をクリックし 該当のドメインを選択し php.ini直接編集をクリック これで編集画面が出てくるので編集できるようになります。

デフォルト送信元メールアドレスをphp.iniに記述しちゃう

以下の1文をphp.iniに追記してもOKです。
sendmail_from = from@pg-happy.jp
そうするとデフォルトの送信元メールアドレスがこれに設定されます。 phpファイルのほうで
$headers = 'From:from@pg-happy.jp';
というのを書かなくてもいいことになります。書かなければphp.iniの方が使われます。 一通り設定ができたらアップロードしたphpファイルにブラウザでアクセスしてみましょう。 また宛先メールアドレスにメールが届いていることを確認しましょう。

mb_send_mailと各社レンタルサーバー別の挙動

(PHP)mb_send_mailをレンタルサーバーで使ってメール送信する方法の本文画像 3
ここではmb_send_mailが各社レンタルサーバーで使えるかテストしてみたのでその結果を書いています。

エックスサーバーでmb_send_mail

前述のとおり問題なく動きました。

さくらレンタルサーバーでmb_send_mail

特に問題なくメール送信できた。php.iniの編集も必要なくデフォルトのままでOKでした。 php.iniの設定はデフォルトで以下のようになっています。
sendmail_from → no value SMTP = localhost smtp_port = 25 sendmail_path = /usr/sbin/sendmail -t -i
送信元メールアドレスは自動的に「アカウント名@wwwサーバ番号.sakura.ne.jp」となっていました。

ロリポップレンタルサーバーでmb_send_mail

こちらも特に問題なくメール送信できました。php.iniの編集もしておらずデフォルトのままです。 ユーザーによるphp.iniの設定は制限がされていて、ロリポップの標準設定を使うようになってるみたいです。 ちなみにデフォルトの送信元は「アカウント名@phy.lolipop.jp」のようになっていました。適宜Fromを記述して設定しましょう。

バリューサーバーでmb_send_mail

こちらもmb_send_mailは正常に使えました。 php.iniは以下のようになっており特に編集はしませんでした。デフォルトの送信元アドレスは「root@契約したバリューサーバードメイン.jp」です。
sendmail_from → no value SMTP = localhost smtp_port = 25 sendmail_path = /usr/sbin/sendmail -t -i
ということでお値段が安めの人気のレンタルサーバー4種に関してmb_send_mailが正常動作することを確認できました

教材のmb_send_mailが動いたり動かなかったり

私がいまPHPの学習で取り組んでいる教材ではmb_send_mailの記述が以下のようになっていました。 headerに色々と記述してるみたいなんですよね。

const SUBJECT = 'サイト改善アンケート';
const TO = 'info@pg-happy.jp';

$headers = <<<HEAD
From : {$_POST['from']}
Return-Path: {$_POST['from']}
Content-Type: text/plain;charset=ISO-2022-JP
HEAD;

$body = "●●".SUBJECT."●●\n";
mb_send_mail(TO, SUBJECT, $body, $headers);


よく見ると Fromのところが $_POST[‘from’]となっています。これは教材ではNULLが入っているっぽくてphp.iniのデフォルトを使用するようになってるみたいですけど。 Cloud9だとNULLでも問題なくメール送信できて、エックスサーバーだとメール送信できなかったんです。 これだけはいまだに謎です。取り急ぎFromには何も記述しないか、しっかり送信元を記述すれば動くことがわかりました。

プログラミング学習を体系的に進めたい人へ

独学で基礎を確認したあとに、質問できる環境や転職・副業向けの学習サポートも比べたい人は、プログラミングスクールの比較記事も参考にしてください。学習目的、料金、受講期間、サポート範囲を分けて見ると、自分に合う学び方を選びやすくなります。


目次