エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


さくらサーバのmb_send_mailでメール送信時にmalformed header from script ‘xxx.php’: Bad header: xxxのエラーが

      2019/03/02

さくらサーバで PHP「mb_send_mail」関数を使ってメールを送信したときに Internal Server Errorが発生。その原因と解決方法を解説

 

Internal Server Errorが発生した経緯

 
NTT系のサーバからさくらインターネットのレンタルサーバにシステムを移行する作業をしていました。
 
その際の、メールフォームの動作確認中に「Internal Server Error」が発生しました。
その原因を調べ、解決した内容について情報を残しておきます。
 
 

mb_send_mail()関数でエラーが発生していると確認

 
メールフォームは、PHPで作成されており、メールアドレスとタイトル、本文を入力させて、その内容をメールで送信する、という非常にシンプルなお問い合わせフォームでした。
 
元のサーバでは全く問題なく動作していたのですが、さくらインターネットのレンタルサーバに乗せ換えて動作確認をしたところ、「Internal Server Error」が表示されるのです。
(PHPのバージョンの統一や DBの接続などを含め、他に発生していたエラーはおおよそ対応を終わらせていました。)
 
 
そして、エラーの発生個所を調べてみた結果、「mb_send_mail()」関数で実際にメールを送信している処理でエラーが発生していることが分かりました。
 
また、さくらレンタルサーバのサーバコントロールパネルから確認できる「エラーログ」を見ると下記のエラーが出力されていました。
 

 
エラーログを見てもよく分からなかったのですが、ググったら原因が判明しました。
 


 

さくらインターネットで mb_send_mailでメール送信で Internal Server Errorになる原因

 
原因は、利用しているサーバにメールアドレスが設定されていないことでした。
 
今回は、さくらインターネットのレンタルサーバへのサーバ移転でしたので、作業をしている時点ではドメインの引っ越しもしておらず、メールアカウントの設定も行っていませんでした。
 
そのため、サーバの設定としては、以下のような感じでした。
 

  • ドメインをさくらインターネットで運用するを設定
  • でも、まだ DNSを切り替えていないので .hostsを利用して、ドメインでアクセスして検証
  • メールアカウントは未設定

 
この状態でメールを送信すると以下のような流れでエラーが発生していたと考えられます。

  • PHPの「mb_send_mail()」関数でメールを送信しようとすると
  • サーバ内の同一ドメイン内へのメール送信処理のため DNSを見に行かずに内部処理としてメール送信処理を実行する
  • サーバ内に指定のメールアカウントがないので sendmailがエラーを発行
  • その結果、Internal Server Errorが発生

 
 

さくらインターネットのメール送信で Internal Server Errorになった場合の解決方法

 
前項で書いた原因で、メール送信が Internal Server Errorとなった場合の解決方法は、「利用しているサーバにメールアドレスを設定すること」です。
 
同一サーバ内にあるはずのメールアドレスがないことが原因でエラーとなっているわけですので、メールアドレスを設定すれば解決します。
 
DNSがそのサーバに向いていなくても問題ありません。
サーバコントロールパネルから、送信先のメールアドレスを設定すれば解決します。
 
 
今回は、メールアドレスを設定していなかったことが原因ですので、この方法で対応できましたが、メールサーバを外部のサーバを利用する場合は、外部の SMTPサーバを経由してメールを送信する処理に変更する必要がある場合もあるかと思います。

 - プログラミング・Web関連技術

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

Selenium WebDriverでFirefoxをプライベートウィンドウ/Chromeをシークレットモードで起動する方法・言語はpython

Seleniumでは初期状態でブラウザを起動する   Seleniumでブラウザ …

コピーコンテンツ・直リンクの3つの対策Google通報などのまとめ

コピーコンテンツを発見したときにやること!Googleに通報、画像の直リンクを禁止、RSSの全文配信を停止。この対策をしないとあなたのサイトの評価も下がるかも!

So-netのレンタルサーバHSはヤバイ・借りてはいけないレンタルサーバリスト

餅は餅屋。サーバはサーバ屋が提供するサービスを利用するべきという記事で、単独でSo-netを紹介。OEMでサービスの提供を受けているだけなので何とも残念すぎる内容。

PythonでURLの有無、存在をチェックするスクリプト

PythonでURLが存在するか否かのチェックスクリプト。ライブラリ「urllib2」を使い、指定のURLにアクセスしそのレスポンスコードを判別するという仕組み。

chromedriver.exe - ディスクがありませんと出てSeleniumの設定が上手くいかない
chromedriver.exe – ディスクがありませんと出てSeleniumの設定が上手くいかない

Selenium WebDriverを使ってChromeを自動操作する仕組みを作る際、chromedriver.exeを利用しますが、ディスクがありません、というエラーが発生する場合があります。その対処方法を解説します。

.gitignoreで無視フォルダの中の特定のファイルを除外「!(否定文)」を使う場合の注意点
.gitignoreで無視フォルダの中の特定のファイルを除外「!(否定文)」を使う場合の注意点

Gitで管理する対象、対象外のファイル、フォルダの指定は .gitignoreに記述する。その基本的な記述の方法に加え、無視対象にしたフォルダの中の特定のファイルを管理対象にする記述方法を解説。

Webサイト公開時に重複コンテンツを排除する.htaccessのリダイレクトの設定のまとめ

サイトを公開する際にはURLの正規化は必須です。正規化とは何かを解説し、.htaccessに設定すべきリダイレクトの設定を具体的に説明します。

Selenium WebDriver、Pythonをインストールし Chromeの自動操作の環境構築手順のまとめ

Selenium WebDriverを使ってChromeを自動操作する環境を構築する手順のまとめ。使用するPythonのインストールから、サンプルスクリプトの動作確認までを詳細解説。

本当に?GMO系ロリポップ・ヘテムルを無料で運用する方法があった!

ロリポップ、ヘテムルを株主優待を利用して実質無料で運営しよう!という解説記事です。株主優待で提供されるサービスの内容を解説し、無料になる仕組みを解説します。

日本語は2バイト文字?3バイト文字?

日本語は2バイトという理解でしたが、UTF-8では事情が違います。その説明です。