Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

PHP7 composerを使わずにPHPMailerをセットアップ (メモ)

More than 1 year has passed since last update.

まえがき

PHPをXAMPP環境で構築してなかったり、composerをインストールできない環境だったりで
PHPMailerを手作業でセットアップしないといけない人へ…
ぐぐっても近しいものがないし、なんだか手間取ってしまったので
まとめておきます。参考程度で…。
※PHPMailer公式ではcomposerでのインストールが推奨されてます。

【環境】


OS: Windows系
Apache: 2.4.33(Win32)
PHP: ver 7.2.5
PHPMailer: PHPMailer-6.0.5
メールの踏台:Gmail

PHPMailerのダウンロード

公式より本体をダウンロード。
Zip形式でダウンロードしてください。

PHPMailer公式

PHPMailer_001.jpg

PHPMailer本体のインストール

先ほどダウンロードした中身を設置します。
場所は公開フォルダ上ならどこでもいいような気がしますが、
自分は公開しているフォルダと同じ場所に「PHPMailer」という名前のフォルダを作りました。
PHPMailerフォルダ内は本体を丸ごと入れておく。
キャプチャ2.JPG

php.iniの確認

OPENSSLが有効か確認する。
下記のオプションを例のごとく「;」を外しApache再起動する。
これをしないとエラーはいて怒られます。
;extension=php_openssl.dll

再起動後PHPinfo()を実行してOPENSSLの項目あるか確認。
キャプチャ.PNG

フォームの作成


見た目がダサいとか、ソースがきたねぇとかは全力で無視して、
とりあえず適当なメール送信フォームを作成。

「send.php」にPOSTします。

【mail_form.html】

<!-- mail_form.html -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; UTF-8" />
<title>sample</title>
</head>
<body>
メールを送信します<br>
<!-- send.phpにPOSTします -->
<form action="send.php" method="post">
宛先メール:<input type="TEXT" name="to" id="to" placeholder="メールアドレス" ><br>
<br>
件名:<input type="TEXT" name="subject" id="subject" Placeholder="件名"><br>
<br>
本文<br>
<textarea name="message01" id="message01" cols="40" rows="10" placeholder="本文"></textarea>
<br>
<input type="submit" value="送信" />
</form>
</body>
</html>

送信部分を作成

肝心のPHPMailer送信部分を作成します。
ここでもソースが…とかいわない
ソース内のコメントに各パラメーターとか書いときました。

<?php

mb_language("japanese");
mb_internal_encoding("UTF-8");

//ソースを全部読み込ませる
//パスは自分がPHPMailerをインストールした場所で
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
require 'PHPMailer/src/POP3.php';
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/OAuth.php';
require 'PHPMailer/language/phpmailer.lang-ja.php';

//公式通り
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

//autoloderはcomposerでのインストールじゃないとないので
//あえて記述しません。

//SMTPの設定
$mailer = new PHPMailer();//インスタンス生成
$mailer->IsSMTP();//SMTPを作成
$mailer->Host = 'smtp.gmail.com';//Gmailを使うのでメールの環境に合わせてね
$mailer->CharSet = 'utf-8';//文字セットこれでOK
$mailer->SMTPAuth = TRUE;//SMTP認証を有効にする
$mailer->Username = '*********@gmail.com'; // Gmailのユーザー名
$mailer->Password = 'パスワードだよ!'; // Gmailのパスワード
$mailer->SMTPSecure = 'tls';//SSLも使えると公式で言ってます
$mailer->Port = 587;//tlsは587でOK
$mailer->SMTPDebug = 2;//2は詳細デバッグ1は簡易デバッグ本番はコメントアウトして

//メール本体
$message="フォームで送ったよ!"."\n".$_POST['message01'];//メール本文
$mailer->From     = '******@gmail.com'; //差出人の設定
$mailer->FromName = mb_convert_encoding("表示名だよ","UTF-8","AUTO");//表示名おまじない付…
$mailer->Subject  = mb_convert_encoding($_POST['subject'],"UTF-8","AUTO");//件名の設定
$mailer->Body     = mb_convert_encoding($message,"UTF-8","AUTO");//メッセージ本体
$mailer->AddAddress($_POST['to']); // To宛先

//送信する
if($mailer->Send()){}
else{
    echo "送信に失敗しました" . $mailer->ErrorInfo;
}

?>

SSLで怒られる

SSL系のエラーが出る場合はPHP.iniとApacheの設定を見直してみてください。
ソースの記述ミスの可能性は低い類のエラーです。
エラーをググってみて、近しい所を修正してみてください。

SMTP connect() failed.で怒られる

ここまでくるとソースはほぼOKだと思います。
文字通りSMTPの接続に失敗しているので、Gmailだとセキュリティーがかかっている可能性大です。

安全性の低いアプリを解除してみてください。
gm_sec.JPG

安全性の低いアプリ

Gmailの仕様?PHPMailerの仕様?

それでもなかなか送信できないでSMTP connect() failedで怒られ続ける。。。
泣かないでください、なぜかわかりませんがしばらく放置すると接続できるようになったりします。

キャッシュのクリアや再起動やら色々試したのですが、2~3時間放置したら接続できるようになりました。

Gmailの許可に時間がかかっているのか、SMTPにアクセスしすぎたのか、原因はわかりません。
それでもダメなら、PHPMailerをあきらめるか、踏台を変えた方がよいかもしれません。

あとがき

ハマるときはハマっちゃいますので、デバッグしながらエラーを取っていくのが一番です。
Connectのエラーだけはどうにもなりません。頑張ってください。

この記事で涙を拭ける人が増えることを祈ります。

takamat444
覚書です。誰かの役に立てれば幸いです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away