LoginSignup
57
55

More than 3 years have passed since last update.

PHPMailerを使ってGmailのSMTP経由でメールを送信する際にSMTP connect() failed.と出て困った

Last updated at Posted at 2015-12-17

経緯

PHPを使って、メールを送信したかったのですが、PHPで実装されているメーラー?を使うとよく迷惑メールに入れられてしまいます。

そこで調べたところ、GmailのSMTP経由で送ると大丈夫っぽかったので、新規でGmailアカウントを作成し、そのアカウントを経由して送信することにしました。

外部のSMTPを使って送れるライブラリを調べた

下記の二つが見つかりました。

・qdmail
・PHPMailer

初めはqdmailを使おうと思いましたが、下記の理由によりPHPMailerを使うことにしました。

  1. 随分前に更新が止まっていた
  2. PHP5.5だと警告が出るという情報があった
  3. 軽く試した結果いろいろエラーが出た(詳細はメモし忘れました)

参考にした情報

Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説 | エス技研
PHPMailer で GMail 送信 – Airwhite Memo

直面した問題

上記サイトのソースを参考に動かしてみたのですが、SMTP connect() failed.と表示され、送信できませんでした。

上記のサイトを見比べてもらえるとわかるのですが

・ポートが465だったり587だったり
・SSLだったりTLSだったり

この組み合わせを間違っているのが原因なのかなと推測したのですが、違ったようです。

ちなみに

公式サイトには

ポート 465(SSL)とポート 587(TLS)

と書いてあるので、

・SSLを選択する場合はポート465を
・TLSを選択する場合は587を

選択するべきなようです。

解決方法

Gmailにはセキュリティの関係上、外部のサービスを使えないようにするような対策?がされていたようです。

こちらにアクセスして安全性の低いアプリのアクセスをオンにするを選択してください。

反映されるまで時間がかかる可能性も?

これは推測なのですが、この設定が反映されるまで時間がかかるかもしれません。

というのも、動かなかったソースが上記の設定変更してすぐは相変わらず動かなかったのに、半日ほど放置して再度確認すると動くようになっていたからです。

この設定が反映まで時間がかかるものなのか、それとも新規で作成したアカウントだったからなのか…
原因はわかりませんが…参考情報として記載しておきます。

最後に動作したソースを貼っておきます

準備

この三つを同一フォルダに入れておきます。

・PHPMailerAutoload.php
・class.smtp.php
・class.phpmailer.php

ソース

<?php
require_once ( 'PHPMailerAutoload.php' );
$subject = "タイトル";
$body = "メール本文";
$fromname = "誰から";
$from = "from@from.com";
$smtp_user = "gmailアカウント@gmail.com";
$smtp_password = "gmailのパス";
$fromaddress = "fromのアドレス";
$to = "宛先のアドレス";

$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true;
$mail->CharSet = 'utf-8';
$mail->SMTPSecure = 'tls';
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
$mail->IsHTML(false);
$mail->Username = $smtp_user;
$mail->Password = $smtp_password; 
$mail->SetFrom($smtp_user);
$mail->From     = $fromaddress;
$mail->Subject = $subject;
$mail->Body = $body;
$mail->AddAddress($to);

if( !$mail -> Send() ){
    $message  = "Message was not sent<br/ >";
    $message .= "Mailer Error: " . $mail->ErrorInfo;
} else {
    $message  = "Message has been sent";
}

echo $message;

?>
57
55
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
57
55