sendmailとphpで質問です。

現在PHPを使ってウェブ上からメールを送るようにしてます。
このメールを送る際に外部のSMTPを使用したいと考えてます。
php.iniにそれらしき項目があったのですが、外部のものを使用するときはIDやPWが必要じゃないかと思っているのですがサーバーとポートの指定箇所がある程度でした。
設定項目があるので使用は出来ると思うのですが、php.iniでの指定の仕方について教えてください。
また可能ならGmailあたりを使ったテスト方法などもアドバイスいただけると助かります。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2010/11/10 00:20:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答6件)

id:dedara No.1

回答回数30ベストアンサー獲得回数4

ポイント19pt

テキストだけのメールなら特に外部にサーバ立てなくても設定なしでmb_sendmail()とか。


外部のSMTPサーバならphp.iniで設定じゃなくて、PEAR::MAILとか使ってその処理の中でサーバーやアカウントだとかの設定するとかな気がします。


Gmailを使うならこのあたりとか。

http://www.yasashis.com/wordpress/2010/01/gmailのsmtp利用してメールを送信するphp/

id:quocard

phpmailerは便利そうです。

こちら試して見ます。

mb_sendmail()で外部smtpを使用できるならOKなんですが、そういった記述を見つけられませんでした。

php.iniでSMTPに関してIDやパスも設定できればいけるのかな?とも思っておりました。

Pear:Mailも考えたのですが外部サーバーでPear:Mailを入れることが出来なかったので質問させていただきました。

2010/11/03 09:14:30
id:asuka645 No.2

回答回数856ベストアンサー獲得回数97

ポイント19pt

php.iniにそれらしき項目があったのですが、外部のものを使用するときはIDやPWが必要じゃないかと思っているのですがサーバーとポートの指定箇所がある程度でした。

ということは、PHPをWindowsで動かしているのですね?

質問にそういう前提条件を書いていただけると助かります。


"php.ini" の SMTP にSMTPサーバのIPを、smtp_portにポート番号(通常は25)を記述して下さい。


しかし、どこのISPをご利用か分かりませんが、大手のプロバイダではOutbound Port 25 Blockingを実施していますので、自前のSMTPサーバにせよ外部のサーバにせよ、利用することはできないでしょう。

id:quocard

質問内容は読まれてますか?

php.iniにサーバーとポートを記述するのはわかってますが、それ以外の情報を書く場所がないので質問させていただいておりました。

外部のSMTPを使用できるのはわかっておりますしOP25がされている場合はポートの変更やAUTHの設定でいけると思っております。

それらを踏まえた上で回答いただけたら助かりました。

2010/11/03 09:15:08
id:asuka645 No.3

回答回数856ベストアンサー獲得回数97

ポイント18pt

質問内容は読まれてますか?

php.iniにサーバーとポートを記述するのはわかってますが、それ以外の情報を書く場所がないので質問させていただいておりました。

外部のSMTPを使用できるのはわかっておりますしOP25がされている場合はポートの変更やAUTHの設定でいけると思っております。

それらを踏まえた上で回答いただけたら助かりました。

何か勘違いされておいでのようなので、補足させていただきます。


sendmailなどのSMTPサーバは、基本的にID/パスワード等による認証の必要はありません。認証が必要なのはPOPやIMAPなどの受信サーバの方です。


参考

id:quocard

ありかとうございます。

まだ勘違いしているかもしれませんが、外部のものを経由する場合に勝手に使えるということになるのでしょうか?

2010/11/03 11:55:01
id:JULY No.4

回答回数966ベストアンサー獲得回数247

ポイント18pt

外部の SMTP というのが、ちょっと曖昧なのですが、例えば、固定 IP で ISP と契約しているような場合、OP25B の対象外となり、相手の MTA(つまり、相手のメールアドレスのドメインを使って、DNS に対して MX レコードを取得して得られるサーバ)に直接送信する事は可能です。

もちろんこの場合、相手の MTA に対して無関係のドメイン名を持つアドレスを送信した場合、通常は、相手の MTA が中継を拒否しておしまいです。

例えば、

  • abc@example.jp 宛のメールを、
  • example.com の MTA へ送信する、

といった事は出来ません。

で、個人契約のように、特定の IP の割り当てが保証されていない場合、多くの ISP では OP25B の対象となり、その ISP が管理している MTA にしか、TCP/IP のレベルでつながりません。

で、おっしゃっているのは、このようなケースで、例えば、ISP 以外の固定の MTA に対して送信したい、ということだと思います。であれば、もちろん、その送信相手の MTA が対応しているか否かにもよりますが、通常は Submission ポート(587 番)で、その相手 MTA の認証を受けるために SMTP-AUTH という手段を使います。

この SMTP-AUTH を使った送信を PHP で行うには、PEAR ライブラリを使うことになります。

Manual :: SMTP 認証を試みる

Net_SMTP パッケージ自体の使い方は、検索するとサンプルのプログラムはいくつか見つかると思いますが、参考までに一つ、紹介しておきます。

(PHP) Net_SMTPおよびNet_Mailでのメール送信 (r271-635)

id:quocard

ありがとうございます。

現在固定IPで運用してます。

いままではsendmailでそのまま送ってましたが、セキュリティ上の理由から

ちゃんとしたSMTPを利用したいと考えたわけです。

紹介いただいたNet_SMTPにはパスワードなどいれる場所もありますが、上の回答ではパスワードなどは不要であるとの回答もいただきました。

まだ理解出来ていないのか、勘違いしているのかわからなくなってきました。

2010/11/03 13:22:20
id:asuka645 No.5

回答回数856ベストアンサー獲得回数97

ポイント18pt

まだ勘違いしているかもしれませんが、外部のものを経由する場合に勝手に使えるということになるのでしょうか?

「外部のもの」という言葉が曖昧ですね。


現状、ネット上にあるSMTPサーバで、利用者認証無しに接続できるものは皆無です。迷惑メール発信の温床になることを避けるためです。


では、どのような利用者認証をしているかというと、これはSMTPサーバによりけりです。

たとえばGmailの場合、TLSまたはSSL認証を行いますので、PHP側のプログラムでハンドリングしてやる必要があります。単にphp.iniを書き換えただけでは対応できないということです。

PHPの実行環境においてTLSまたはSSLがソケットとしてサポートされているなら、fsockopen関数を使って比較的簡単にハンドリングできます。

そうでない場合は、PHP環境での実行は諦め、バッチ処理にした方が手っ取り早いと思います。

id:quocard

判りにくくてすいませんでした。

外部というのは今sendmailを使用して送信しているサーバー以外の事を指してました。

php.iniについてはよく見るとwin32と書かれていたのでRedhatでは意味のない項目のようでした。

PHPは少し古いですが5.1.6なのでTLS/SSLソケットはサポートされていると思います。

2010/11/04 18:23:05
id:JULY No.6

回答回数966ベストアンサー獲得回数247

ポイント18pt

現在固定IPで運用してます。

いままではsendmailでそのまま送ってましたが、セキュリティ上の理由から

ちゃんとしたSMTPを利用したいと考えたわけです。

sendmail で送っていたのが、なぜセキュリティ上の理由で別の MTA へ送信しようということになったのかが微妙ですが...

ということは置いておいて、やろうとしていることは大体わかりました。

で、SMTP の認証の要・不要に関してですが、ざっくり言ってしまうと、

  • 自分で作る PHP のプログラムで、sendmail と同様の事をやろうとすれば、認証は不要。
  • sendmail がやっていた部分を、自組織外のメールサーバにやらせようとするなら、そのメールサーバによっては認証が必要。

ということになります。

で、「sendmail がやっていたこと」の中に、「宛先メールアドレス毎に、送信先の MTA を調べて、SMTP を使ってメールを送信」という事が含まれます。

私の先の回答でも触れていますが、もし、宛先が「abc@example.jp」だった場合、

  1. example.jp の MX レコードを、DNS へ問い合わせて、送り先の MTA を調べる。
  2. example.jp の MX レコードが見つかったら(仮に MX レコードが mta.example.jp だったとする)、mta.example.jp へ接続し、SMTP でメールを送信する。

ということになります。この時、SMTP 中で認証は必要ありません。mta.example.jp は、自分宛のメールは認証無しに受け取ります。じゃないと、「私のメールアドレスはこれこれです。で、私あてにメールを送る場合には、そちらの管理者の方に、これこれのアカウントとパスワードを使って送るようにお願いしてください」てなことになってしまいます。

ここで重要なのは、mta.example.jp が認証なしに受け取るのは「自分宛」です。もし、mta.example.jp 宛に「xyz@example.com」宛のメールを送っても、「そんなの知らんがな!」と言って拒否します。四半世紀前には、「あぁ、転送しておくわ」というサーバが多かったのですが、今時、まっとうなサーバではそんな事はありません。

メールソフトで送信先として設定する SMTP サーバの場合、通常は「自組織内の IP アドレスから届いたメールは転送する」というルールになっています。ISP が用意する SMTP サーバや、会社内の SMTP サーバは、決まった IP アドレスから届いたときだけ、転送を許可します。

ところが、ISP の縛りのないメールサーバで転送しようとすると、どんな IP アドレスから接続されるか分からないので、IP アドレスだけでは転送の許可/不許可の判断は出来ません。そこで許可/不許可の判断を「アカウントの認証処理によって判断する」という仕組が、SMTP-AUTH です。

SMTP Authenticationとは【SMTP-AUTH】 - 意味/解説/説明/定義 : IT用語辞典

SMTP-AUTH 自体はオプション扱いなので、必須条件ではありません。多くの場合、

  • SMTP-AUTH の認証を受けていない場合は、自分宛のメールだけを受け取る。自分宛でなければ受け取りを拒否する。
  • SMTP-AUTH の認証を受けている場合は、転送を許可する。

となっています。また、後者の用途に特化したものが「Submission プロトコル」で、ポート番号が 587 番で SMTP-AUTH による認証が必須、という以外は、ほぼ SMTP と同じ手順になります。

と長々と一般論を書きましたが、「固定IP」ということであれば、OP25B によるブロックは無いと考えられるので、sendmail が宛先毎に SMTP の接続先を決めて送っていた処理を、PHP で実装するのであれば、認証は不要です。

そうではなくて、ある特定の MTA に常に送信し、その MTA が中継する事を期待するなら、「その MTA 次第」になります。

SMTP-AUTH での認証が必要な場合もありますし、こちら側の IP アドレスで判断してもらえるケースもあります。後者であれば、契約時に申請した IP アドレスからは、認証なしに中継してもらえることになります。

id:quocard

理解するのに時間がかかってしまいました。

大変丁寧に説明していただきありがとうございます。

こちらを元に色々と調べて不明だった点や勘違いしている点を修正することが出来ました。

やろうとしている事を整理しますと

Aサーバーから直接送信していたメールを自組織のBサーバーのSMTPを使う形で送信する

となります。

Bサーバーは自組織であれば認証は不要という設定となっているようなので認証は要らないようです。

Pear、fsockopen、phpmailerを使う方法と色々とご提示いただきましたが、Aサーバーの内容を出来るだけ変えずに対応したいと考えsendmail.mcとcfを変えることで対応できないかと考えました。

今現在ファイルの中を読み込んでいる最中でsendmail.cfやsendmail.mcを変えるだけでこういった事が可能なのかはちょっとまだ判りませんがこちらの方法も併せて試してみたいと思います。

引き続き識者の方からこの手法や内容の指摘についてあればお願いします。

2010/11/05 12:30:38

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません