-PR-
解決済み

CentOS7×apache×php メールを送信

  • すぐに回答を!
  • 質問No.9398334
  • 閲覧数50
  • ありがとう数4
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 72% (27/37)

CentOS7×apache×php×外部smtpからメールを送信したいです。
しかし、上手く行きません。


【環境】
LAN内のPCにCentOS7をインストールし、apacheとphpをインストールしました。
それ以外のものpostfixなどは入っていないとします。
クライアントPCはWindows10です。
phpの動作確認は、Windows10のPCからブラウザでphpinfo()が見れるところまでできています。


【目標】
下記のphpをブラウザで参照すると、「メール送信に成功致しました。」が出て、メールが届くようにする。

[test_mb_send_mail.php]
<?php
$sTo = 'adr@yahoo.co.jp';
$sFromMail = 'adr@独自ドメイン.jp';
$sSubject = '件名:メール送信テスト';
$sHeaders = "From: {$sFromMail}\r\n";
$sMessage = '本文:テスト';

//送信処理
mb_language("Japanese");
mb_internal_encoding("UTF-8");

if(mb_send_mail($sTo, $sSubject, $sMessage, $sHeaders)){
echo 'メール送信に成功致しました。<br/>';
}else{
echo 'メール送信に失敗致しました。<br/>';
}
?>
[test_mb_send_mail.php]


【メールアドレス】
メールアドレスは2つ用意しています。

adr@yahoo.co.jp ・・・ yahooで作ったメール。thunderbirdメーラで普段使っています。
adr@独自ドメイン.jp ・・・ 契約しているさくらインターネットで作ったメール。thunderbirdメーラで普段使っています。

どちらを受け側、送り側にしても構いませんが、とりあえず、adr@yahoo.co.jpを送り側にします。


【thunderbirdメーラに登録しているsmtpの情報】
smtp.mail.yahoo.co.jp
465
adr@yahoo.co.jp
通常のパスワード認証
SSL/TLS


mail.独自ドメイン.jp
587
adr@独自ドメイン.jp
通常のパスワード認証
STARTTLS


【/etc/php.iniの変更箇所】
[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = me@example.com

 ↓ ↓ ↓

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = smtp.mail.yahoo.co.jp
; http://php.net/smtp-port
smtp_port = 465
username = adr@yahoo.co.jp
password = パスワード

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = adr@yahoo.co.jp


【状況】
「メール送信に失敗致しました。」という自分で設定したメッセージが出ます。

具体的に何がいけないのか?
何かを確認しないといけないなら、具体的に何を確認したらよいのか知りたいです。


以上、宜しくお願い致します。
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.4
レベル12

ベストアンサー率 65% (286/435)

>メーラー機能を持ったライブラリが存在するのですね。
>
>それを追加すればpostfix(のようなモノ)は必要ないのですね?

ライブラリを使うときに送信用のクラスに外部のSMTP(と認証)の情報を渡します。なのでローカルには何も必要ないです。
phpでMUA(メールクライアント)を作って、SMTPなどの情報をメーラに設定するのと同様にphp(メールライブラリを使うソース)でも設定するだけですね。

ローカルにMTA(Postfixなど)を入れてもそこからどうやって投げるのか(相手先にスパムと判定されて拒否されずに済むか)はけっこう難題です。そのあたりのスキルがないのであればphpmailerなどのライブラリに頼るべきです。
お礼コメント
linuxorfe

お礼率 72% (27/37)

有難うございます。

phpmailerに絞って試してみます。
投稿日時 - 2017-11-22 09:08:02

その他の回答 (全3件)

  • 回答No.1
レベル12

ベストアンサー率 65% (286/435)

>postfixなどは入っていないとします。

SMTPは何も入っていないのですよね?だとしたら

>SMTP = localhost

localhostがそもそも誤りですね。

パスワード認証が不要なSMTPはないんでしょうか?php.iniではSMTP名とポート番号しか設定はないので、認証が必要だとmail()関数では厳しいです。接続に使っているISPのメールアカウントは使えませんか(一般的にISPの接続内からなら認証不要なので)。

質問者さんの環境で認証不要で使えるSMTPが存在しなければ、phpmailerなどのライブラリを使うことになります(phpmailerはWordpressに組み込まれているメール送信ライブラリで認証などの設定も可能)。


というかCentOSなどではpostfixやsendmailをインストールするのが普通だと思いますけどね(外部SMTPに丸投げするにしても細かい部分はそっちで面倒をみる)。SMTPを指定するのは(php.iniに書いているとおり)「Win32 only」なので…
お礼コメント
linuxorfe

お礼率 72% (27/37)

有難うございます。

>localhostがそもそも誤りですね。

いや、そっちはビフォーの方です。
アフターは
SMTP = smtp.mail.yahoo.co.jp
です。

変更前を書いたのはややこしかったでしょうか。



>接続に使っているISPのメールアカウントは使えませんか

yahooのメールか
さくらインターネットで作成したメールアカウントではダメですか?



>というかCentOSなどではpostfixやsendmailをインストールするのが普通だと思いますけどね(外部SMTPに丸投げするにしても細かい部分はそっちで面倒をみる)。SMTPを指定するのは(php.iniに書いているとおり)「Win32 only」なので…

やりたい事は、phpからメールを送るという事なのですが、何と何が必須で必要なのかが分かっていません。

で、前回、postfixなどのメールサーバは必須なのか必要ないのかを重点に聞いてみたのですが、「必須でない」という回答が付きました。

phpからメールを送信したいです。
https://okwave.jp/qa/q9397977.html

それを鵜呑みにしていたのですが、
どうやらpostfixのようなモノは必須のようですね。
ご指摘の通り「Win32 only」と書いている部分は、機能しなくて、その下の「Unix only」のところが勝ちます。

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = /usr/sbin/sendmail -t -i

postfixをアンインストールすると、
/usr/sbin/sendmailが消えるので、メールが飛ばない以前にphp側でエラーになり、「メール送信に失敗致しました。」となります。
これが、この質問当初の状態です。

postfixをインストールすると、
sendmail_path = /usr/sbin/sendmail -t -i
の部分が生きるので、postfix側の設定は全く何もしなくても、php側では投げた事で満足して、「メール送信に成功致しました。」となります。
ただし、postfixの設定はしていないのでメールは届きません。



ここで、質問です。
CentOS7×apache×phpのみで
外部smtpからメールを送信する事は可能ですか?不可能ですか?
postfix(のようなもの)は必須ですか?


postfixを使うやり方は別途、質問を立て直します。

ここでは、
CentOS7×apache×phpのみで
外部smtpからメールを送信する事は可能ですか?不可能ですか?
の答えと、もし可能であればその方法が知りたいです。
投稿日時 - 2017-11-17 17:32:16
  • 回答No.2
レベル12

ベストアンサー率 65% (286/435)

あぁ。すみません。ざっくりとしか読んでなかった(汗

>外部smtpからメールを送信する事は可能ですか?不可能ですか?

素のphp「だけ」じゃ無理です。基本的にはメールを「ローカルにあるメールを送信する機能」に丸投げすることしか出来ません。込み入ったことをしようとすれば外部ライブラリ(phpmailer)が必要です(なのでWordpressはphpmailerを取り込んだ)。

外部SMTPを使うとなると認証やらなにやらやることが多いですが、巣のphpにはその設定を書くようなところもないです。


(蛇足)
オールインワンパッケージ(Apache+php+MySQL)のxamppでは専用のsendmailプログラムが付属してたりします(php.iniでそのプログラムを指定すれば有効になる)。そのsendmailプログラムの設定ファイル(sendmail.ini)でSMTPの指定や認証関係の設定が出来るようになっていたハズです。
お礼コメント
linuxorfe

お礼率 72% (27/37)

>素のphp「だけ」じゃ無理です。
>外部ライブラリ(phpmailer)が必要です。

メーラー機能を持ったライブラリが存在するのですね。

それを追加すればpostfix(のようなモノ)は必要ないのですね?
投稿日時 - 2017-11-21 09:09:43
  • 回答No.3
レベル12

ベストアンサー率 67% (346/515)

コンピューター カテゴリマスター
ホスティングサーバーやレンタルサーバーでなら割りと簡単ですが、
自宅サーバーということだと 最近はプロバイダにより25番ポートがブロックされている
ことが多いので この場合、単にpostfixをインストールしただけでは、
外部ドメイン宛(つまり別のメールサーバー宛)のメールは届かないことになります。
(ローカルのドメイン宛なら届きますが)

このようにスパム不正発行の対策でOP25Bされている自宅のLinuxサーバーから
PHP でメールを送りたいとなると 
外部のSMTPサーバー(gmailとかyahooとか自分のプロバイダのとか)に対して
SMTP認証でメール中継を許可させた上で、メール送信を代替わりしてもらう必要があります。

ただ WindowsのPHPだとphp.iniでSMTP認証の設定が出来るのですが
Linuxでとなると

・MTA(postfix)をインストールして
 postfix側で外部のSMTPサーバーにSMTP認証して送信中継を丸投げする設定を
 行っておいてから、PHPの mb_send_mail() では、localhostに送信する

または、先にご回答のある通り

・mb_send_mail ()を使うのではなく、外部のSMTPサーバーが指定できるライブラリを使う

のどちらかになるでしょう。


余談ですが、このようにしてメール中継を使えば無制限にメールが送れる
という訳ではなく、はやり大量にスパムやメルマガを発行すると 
外部のSMTPサーバー側で検知されて、 そのSMTP認証アカウントが
凍結(停止)されることになりますし、
ReceivedのIPアドレスがブラックリストに載ることになります。

また、プロバイダでは、Fromのアドレスやドメイン名の制限をしている
SMTPサーバーもあります。
この場合、プロバイダのドメインに関係のない、自分の所有している独自ドメイン名を
Fromにしてメール送信することは、できないことになります。
お礼コメント
linuxorfe

お礼率 72% (27/37)

有難うございます。

>外部のSMTPサーバー(gmailとかyahooとか自分のプロバイダのとか)に対して
>SMTP認証でメール中継を許可させた上で、メール送信を代替わりしてもらう必要があります。

なるほど、少しわかってきました。
投稿日時 - 2017-11-21 09:18:01
このQ&Aで解決しましたか?
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-

特集


開業・独立という夢を持つ人へ向けた情報満載!

ピックアップ

ページ先頭へ