PHP_エラー備忘録

## はじめに
PHP学習中に起こった、解決まで時間がかかったエラーをどう解決したかまとめる

## Uncaught Error: Call to undefined function ○○(mb関数)
##### 試したこと
1. 独習PHPのセットアップ順を再度試した
    1. XAMMP再インストール
        1. php.ini
        1. <font color="red">**環境変数PATH再設定＆最も上に設置**</font>
    2. <font color="red">**学習用コードファイルをhtdocsディレクトリにコピー**</font>
2. VSCode
    1. settings.json確認
    1. 拡張機能確認
3. ネット検索

👆環境PATH設定確認した所、指定先が間違っていた
　 学習用コードファイルをhtdocsディレクトリにコピーし、そこからファイルを実行したときに上手くいった
※原因はわからん

## mb_send_mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\○○

▼和訳
mb_send_mail()： php.iniの "SMTP "と "smtp_port "の設定を確認するか、ini_set()を使用してください。

▼試したこと（１／３）
資料：[知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1351593848)

・設定でSMTPサーバにlocalhostを指定しているため、自分のPC上にSMTPサーバが動いていなければエラーになる
　・対策
　　1. 自身の契約しているISPのアドレスまたは利用できるSMTPサーバーの情報を書く
　　2. [「実際にはメールが飛んで行かない」ダミーのメールサーバ](http://www.vector.co.jp/soft/win95/net/se255028.html)を使う
👆使い方わからんから別の方法を探す

▼試したこと（２／３）
資料：[独習PHP 第4版](https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92PHP-%E7%AC%AC4%E7%89%88-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4798168491)
１）php.iniの設定を変更する（Windows版）

**＜変更前＞**
１）メール送信に利用する文字コードの変更設定
`;mbstring.language = Japanese`
２）sendmail.exeを有効化
`;sendmail_path = `

**＜変更後＞**
１）
`mbstring.language = "Japanese"`
２）
`sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"`

<hr />

２）sendmail.iniの設定を変更する（Windows版）

**＜変更前＞**
１）SMTPサーバーのホスト名を変更
`smtp_server=mail.mydomain.com`
２）SMTPサーバーのポート番号
`smtp_port=25`
３）認証ユーザー名
`auth_username=`
４）認証パスワード
`auth_password=`
５）送信元アドレス
`force_sender=`

**＜変更後＞**
１）
`smtp_server=smtp.example.com`
２）
`smtp_port=587`
３）
`auth_username=user01`
４）
`auth_password=passwd01`
５）
`force_sender=user01@example.com`

<hr />

３）Apacheを再起動
・サンプルを実行した結果、送信されたメールを指定の宛先で受け取ることができれば成功

👆参考書に書かれている内容のまま変更した状態で以下のコードを実行すると以下のようなエラーメッセージが来た

```コード内容.php
<?php
$to = 'wings@example.com';
$subject = '独習PHP 改訂版';
$body = "こんにちは、mb_send_mail関数！\nどうですか？";
$headers  = "From : user01@example.com\n";
$headers .= "Cc : yamada@example.com\n";
$headers .= "X-Mailer : PHP 8\n";

if (mb_send_mail($to, $subject, $body, $headers)) {
  print 'メール送信に成功しました。';
} else {
  print 'メール送信に失敗しました。';
}

```

```;エラーメッセージ.
You must configure the smtp_server and default_domain in:
  C:\xampp\sendmail\sendmail.ini
  or
  HKLM\Software\Sendmail

/// 和訳
smtp_serverとdefault_domainを設定する必要があります。
```

👆書籍にある事をそのまま実行していた為、自身の環境に合わせていない。各変更項目の確認を再度行う必要がありそう。

▼試したこと（３／３）
「▼試したこと（２／２）」で変更した設定項目の確認
目的：自身のGmailを使って自分あてにメールを送りたい

資料：[GmailのSMTPサーバーを使って無料でメールを送信する方法](https://kinsta.com/jp/blog/gmail-smtp-server/)

・Gmailに合わせた変更を行う

**＜変更前(sendmail.ini)＞**
１）
`smtp_server=smtp.example.com`
２）
`smtp_port=587`
３）
`auth_username=user01`
４）
`auth_password=passwd01`
５）
`force_sender=user01@example.com`

**＜変更前後＞**
１）Gmailのデフォルトのサーバーアドレス
`smtp_server=smtp.gmail.com`
２）GmailのSMTPポート
`smtp_port=587`
３）メールアドレス
`auth_username=you@gmail.com`
４）ログインパスワード or アプリパスワード
`auth_password=passwd01`
👆ログインパスワードでやったら、「配信中にエラーが発生しました： アプリケーション固有のパスワードが必要です。」とエラーメッセージが来た。そのため[**アプリパスワード**](https://support.google.com/accounts/answer/185833?visit_id=638304483553530777-2001057973&p=InvalidSecondFactor&rd=1)を設定して代わりに張り付けた
５）メールアドレス
`force_sender=you@gmail.com`

👆<font color="red">**再設定して実行したら正しく処理された！**</font>

```コード内容.php
<?php
$to = 'you@gmail.com';
$subject = '独習PHP 改訂版';
$body = "こんにちは、mb_send_mail関数！\nどうですか？";
$headers  = "From : you@gmail.com";

if (mb_send_mail($to, $subject, $body, $headers)) {
  print 'メール送信に成功しました。';
} else {
  print 'メール送信に失敗しました。';
}


// 結果
//メール送信に成功しました。
```