フォームが送信されたときにメールを送信しようとしています。 PHPMailerを使用して、以下の構成でメールを送信しています。
$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'mail.example.in';
$mail->Port = 25;
$mail->SMTPAuth = true;
$mail->Username = '[email protected]';
$mail->Password = 'password';
$mail->setFrom("[email protected]" , "User");
$mail->addAddress('[email protected]', 'Receiver');
$mail->addBCC('[email protected]', 'Another user');
$mail->AddReplyTo('[email protected]', 'User');
$mail->isHTML(true);
$mail->Subject = $subject;
$mail->Body = $message;
if($mail->send())
echo "Your request has been received. We will soon contact you.";
else echo "Unable to send your request. Please try again";
これはlocalhostで正常に動作します。しかし、サーバー(example.in)にデプロイすると、以下の例外が発生します。
SMTP ERROR: Failed to connect to server: Connection timed out (110)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
-編集-
Telnetコマンドを使用してSMTPサーバーに接続しようとしましたが、受信者を追加できません。以下のエラーが出ますか?
Last login: Fri Sep 16 11:08:06 on ttys000
admin:~ admin$ telnet mail.example.in 25
Trying 111.91.153.112...
Connected to mail.example.in.
Escape character is '^]'.
220 fbs-ho-mailserver.example.in ESMTP Service (Lotus Domino Release 8.5.3FP3) ready at Fri, 16 Sep 2016 11:36:01 +0530
HELO example.in
250 fbs-ho-mailserver.example.in Hello example.in ([111.91.127.222]), pleased to meet you
MAIL from: [email protected]
250 [email protected]... Sender OK
RCPT to: [email protected]
554 Relay rejected for policy reasons.
-編集-
このアカウントをOutlookで設定できました。私は何が起こっているのか本当に混乱しています。
あなたのエラーは言う:
SMTP ERROR: Failed to connect to server: Connection timed out (110)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
それでは https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting を見てみましょう:
「SMTPエラー:SMTPホストに接続できませんでした。」
これは、SMTP connect()が失敗した、またはデバッグ出力に接続されていないCalled Mail()として表示される場合もあります。これは多くの場合PHPMailerの問題として報告されますが、ほとんどの場合、ローカルDNSの障害、ファイアウォールのブロック(GoDaddyなど)、またはローカルネットワーク上のその他の問題が原因です。これは、PHPMailerがHostプロパティで指定したSMTPサーバーに接続できないことを意味しますが、その理由を正確には述べていません。また、openssl拡張機能がロードされていないことが原因である可能性もあります(以下の暗号化の注意を参照)。
このエラーの原因を診断するためのいくつかの手法を以下で説明します。
GoDaddy
人気のある米国のホスティングプロバイダーであるGoDaddyは、メールの送信に非常に厳しい(ほとんど役に立たなくなるほどの)制約を課しています。これらは、自分のサーバーを除くすべてのサーバーへのポート25、465、および587への送信SMTPをブロックします。この問題は、スタックオーバーフローに関する多くの苛立たしい質問の対象です。スクリプトがローカルマシンで機能するのに、GoDaddyにアップロードするときに機能しない場合は、これが原因です。ソリューションはGoDaddyによって非常に不十分に文書化されています:サーバーを介して送信し、すべてのセキュリティ機能、ユーザー名とパスワードを無効にする必要があります(すばらしいですよね!)。
$mail->isSMTP(); $mail->Host = 'relay-hosting.secureserver.net'; $mail->Port = 25; $mail->SMTPAuth = false; $mail->SMTPSecure = false;
GoDaddyはまた、aol、gmail、yahoo、hotmail、live、aim、またはmsnドメインに属するFromアドレスでの送信を拒否します(ドキュメントを参照)。これは、これらすべてのドメインがSPFとDKIMの偽造防止対策を導入しており、差出人のアドレスを偽造することが偽造であるためです。
より賢明なホスティングプロバイダーに切り替える方が簡単な場合があります。
問題-発生している2つの無関係な問題-は非常に簡単です:
SMTPエラー:サーバーへの接続に失敗しました:接続がタイムアウトしました(110)SMTP接続()が失敗しました。
サーバーが実際に接続を受け入れていることを確認しました。
Telnetコマンドを使用してSMTPサーバーに接続してみた
_Last login: Fri Sep 16 11:08:06 on ttys000
admin:~ admin$ telnet mail.example.in 25
Trying 111.91.153.112...
Connected to mail.example.in.
_
スクリプトは、運用サーバーから実行すると、SMTPサーバーに接続できません。
考えられる原因は、本番サーバーにファイアウォールがあり、不正使用を回避するために外部への接続を防止することです。サーバーはserve Web要求を行うことができますが、それ以上はできません。
テストで、ポート25が応答していないことが確認された場合、(ホストアドレスが正しいことを確認した後)試行できた可能性がありますtelnet mail.example.in 587代わりに。それが機能する場合、サーバーが安全でない接続(ポート25)を受け入れていないが、安全な接続を受け入れていることを意味している可能性があります。 PHPMailerを使用すると、 安全な接続をアクティブにする を試すことができます。
_$mail->SMTPSecure = 'tls';
_
または
_$mail->SMTPSecure = 'ssl';
_
それでも機能しない場合は、ファイアウォールの問題が残っている可能性があります。または、phpinfo()
を調べて、PHPでOpenSSLがサポートされていることを確認する必要があります。
mail()
関数を使用するか、SMTPサーバーとしてlocalhost
または_127.0.0.1
_を使用する必要があります。その後、メールは本番サーバーのサービスネットワークを介して送信されます。ポート25は許可されていませんが、ポート(たとえば)465または567は許可されていると彼らは言うかもしれません。構成を更新するか、それに応じてTLS/SSLを追加する必要があります(上記を参照)。
250 [email protected] ... Sender OK RCPT to:[email protected] 554リレーがポリシー上の理由で拒否されました
また、不正使用を避けるために、SMTPサーバーは誰もが接続して電子メールを送信できるようにするのではなく、自分の顧客のみに許可します。 PHPMailer構成で、ユーザーとパスワードを指定したことがわかります。 Telnetセッションではしませんでした。そのため、PHPmailerは送信できるが接続できない可能性がありますが、telnetは接続できるが送信できない可能性があります。
接続の問題を解決すると、認証の問題は解決されるか、なくなります(localhost
など、IT担当者から提供された別のサーバーを使用するため)。
サービスを悪用する3つ目の方法はover-use-非常に多くのメールを非常に多くの人に送信することです。 IT担当者に、メールの送信に許容されるポリシーを確認します。
他に調べる必要があるのは、ソースのcredibility(許可された送信者として選択したSMTPサーバーを指定していないドメインに代わってメールを送信する場合がある)とです。機密性データの(TLS/SSL接続を使用している場合でも、SMTPサーバーとしてlocalhost
が指定されている場合、IT担当者は送信するすべての電子メールに完全で束縛されていない、検出できないアクセス権を持っています。またはそうでないかもしれませんが、それで大丈夫です)。
独自のSMTPを使用することはお勧めできません。それをどうするかによっては、メールが何らかの方法でブロックされたり、スパムとしてマークされたりする可能性が非常に高くなります。また、サーバーを最新の状態に保つために数回費やす必要があります。
すべてのプロバイダーのホワイトリストに登録され、APIを公開してトランザクションメールを送信するオンラインサービスを使用します。 https://www.mailjet.com/http://mailchimp.com/ ...
彼らはしばしば、少量(1日あたり2000メール未満)の無料アカウントを提案します。 APIの使用は非常に簡単で、数分で配置できます(例: https://dev.mailjet.com/ )
数ステップでこれを適切に機能させることができると思います。
Godaddy/HostgatorCpanelで> MXレコードを選択>問題のドメインを選択>「Remote Mail Exchanger」を選択
この時点でメール配信をテストできます。問題は解決される可能性があります。
私はそれが正しく設定されていると確信していますが、良いole Cpanel、PhpMailerおよびGodaddy/Hostgatorに関しては私を信頼しています。常識が通じないところです。
replace:
$mail->Host = 'mail.example.in';
with:
$mail->Host = 'localhost';
これにより、ログイン資格情報などが有効であるという前提で問題が解決されると思います。
そのサーバー上ではなくSMTPが有効になっているかどうかをホスティングプロバイダーに問い合わせてください.smtpとcurlの両方で以前に同じ問題がありました。ホスティングプロバイダーにお問い合わせください。
最初の引用(IBMコミュニティから):
[email protected]は、gmail.comの[次のインターネットアドレス宛のメッセージの拒否]フィールド(宛先サーバーのDomino設定文書のルーター/ SMTP、制限と制御)にリストされているグループ(拒否)のメンバーでした。 [SMTPインバウンドコントロール]タブの[インバウンド受信者のコントロール]セクション)。
メアリーの階層名(メアリージョーンズ/ ABC)を拒否(グループ)ドキュメントのメンバーリストから削除すると、メアリーはインターネットからメッセージを受信できます。
2番目の引用:
ほとんどのメールサーバーは、匿名のスパムリレーとして使用されないように、特定のホストからのメールのみをリレーするように構成されています。
Phpmailerのバージョンは何ですか?
この行を追加するのを忘れているかもしれません
$mail->IsSMTP(); // use SMTP
$ mailを開始した後。
やってみてください。
したがって、GoDaddyサーバーがあり、新しく取得したSMTPリレーを介して電子メールを送信したいとします。まあ「できません」は、Googleを突っ込んでいる場合におそらく見つけられるものです。
もう少し調べてみると、GoDaddyの公式ソリューションは内部のメールリレーを使用することでしょう。次のように、彼らが設定した恣意的な障壁があるため、これは理想的ではありません。
専用サーバーの送信メールの上限は1日あたり1000です。 1日に1000通を超えるメールを送信する必要がある場合は、カスタマーサポートに電話するか、サポートチケットを開いて、上限をリクエストしてください。
迅速かつ実用的なソリューション:HTTP APIを使用した電子メールの送信をサポートするSMTPリレーを入手してください。
私の提案:(シンプルで効果的な作業ソリューション、私は個人的に使用しています)
Sendgrid でアカウントにサインアップします。 Sendgridは1か月あたり12,000通のメールを無料で提供しており、基本的なニーズには十分対応できると思います。
最初のステップ:Sendgridは、そのホストに代わってメールを送信するために認証するためにいくつかのDNSレコードを追加するように要求します。だからそうしなさい。
2番目のステップ:ホワイトラベルを設定 https://sendgrid.com/docs/User_Guide/Settings/Whitelabel/index.html =(これは重要ではありませんが、送信するメールにプロの外観を与えます)
第3ステップ:APIキーを生成します
SendGridカスタマーポータルから APIキーを管理 できます。さらに、 API自体を介してAPIキーを管理する を行うことができます。
4番目のステップ:先に進んで、コードを記述します。
PHP sendgridでこれを使用してメールを送信する library githubで利用可能):
// using SendGrid's PHP Library
// https://github.com/sendgrid/sendgrid-php
require 'vendor/autoload.php';
$sendgrid = new SendGrid("SENDGRID_APIKEY");
$email = new SendGrid\Email();
$email->addTo("[email protected]")
->setFrom("[email protected]")
->setSubject("Sending with SendGrid is Fun")
->setHtml("and easy to do anywhere, even with PHP");
$sendgrid->send($email);
これがどのように機能するか
GoDaddyは、SMTPに最適なポートであるポート25、2525、587、485をブロックします。したがって、ポート80/443を使用し、ポート80を使用して代わりにメールを送信するようにsengridのAPIに要求しています。そうです、GoDaddyをだましました。
Php.iniの設定をいくつか変更する必要があります。
upload_max_filesize = 2M
;or whatever size you want
max_execution_time = 60
; also, higher if you must - sets the maximum time in seconds.
PHP.iniは環境に依存していましたか、詳細:reference
[〜#〜]または[〜#〜]
これをPHPスクリプトの上部に配置し、スクリプトを緩めます
ini_set('max_execution_time', 600); //600 seconds = 10 minutes or set your time
私はあなたのポイントを得ました。同じ問題が私でも発生します。1行追加するだけで、機能します。使ってください 、
$mail->SMTPSecure = 'ssl';
そしてsslに従って設定を構成します。また、サーブ側のメール設定を適切に確認してください。
タイムアウトエラーは一般的に破棄されるパケットであるため、WebサーバーとSMTPサーバー間のファイアウォールの問題である可能性があります。サーバーにsshでアクセスできる場合は、次を使用してsmtpに接続してみてください。
telnet <smtp server> 25
Telnetを使用してもタイムアウトエラーが発生する場合は、問題がネットワーク/ファイアウォール側にあることが確実です。