質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Postfix

Postfixは、電子メールサーバソフトウェアで、 メールを配送するシステムMTAの一種です。

Q&A

解決済

2回答

673閲覧

php8でsmtpサーバにメールが送れない

YosiyukiUsijima

総合スコア42

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Postfix

Postfixは、電子メールサーバソフトウェアで、 メールを配送するシステムMTAの一種です。

0グッド

0クリップ

投稿2023/12/28 06:49

実現したいこと

almalinux 9.3 / almalinux 9.3
PHP 8.2.14 / postfix 3.5.9

phpから mb_send_mailを使って、別サーバのSMTPにメールを送信したい。

発生している問題・分からないこと

mb_send_mail でデータを作成してメールをSMTPに送っています。
postfix側のmail.logを見ているのですが、接続した形跡もありません。
telnetを使い接続するとmail.logにも記録が残り、メール送信できました。

下記の処理をさせてみたところ、「送信成功」と表示されたので、phpでは
エラーはないものと思います。

if (mb_send_mail($to, $title, $content, $header)) {
echo "メール送信成功です<br />\n";
} else {
echo "メール送信失敗です<br />\n";
}

ローカル内でやっているので、25番ポートを使っています。
----- php.ini -----
[mail function]
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; https://php.net/sendmail-path
SMTP = 10.10.2.100
smtp_port = 25
;sendmail_path = /usr/sbin/sendmail -t -i
---- EOF ----

エラーメッセージ

error

1エラーメッセージは特にありません。 2なので、原因特定も難しくなっています。 3

該当のソースコード

php

1// mail 文字コード 2mb_language("Japanese"); 3mb_internal_encoding("UTF-8"); 4 5// 送信者 6$from="hoge@example.co.jp"; 7// メールヘッダを作成 8$header = "From: " . $from; 9$header = $header . "\nContent-Type: text/html;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion(); 10// 受信者 11$to = 'watasi@example.co.jp'; 12echo "to = " . $to . "<br />\n"; 13// 件名 14$title = "【TEST】PHP Mail送信"; 15// 本文 16$content = "このメールはテストです<br>"; 17$content=$content."別のサーバからメールを送信しています<br><br>"; 18$content=$content."<br>以上、確認よろしくお願いします。<br><br>"; 19$content=$content."※このメールはシステムより送信しています。返信はできません。"; 20echo "content = " . $content . "<br />\n"; 21 22// メール送信 23if (mb_send_mail($to, $title, $content, $header)) { 24 echo "メール送信成功です<br />\n"; 25} else { 26 echo "メール送信失敗です<br />\n"; 27}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

php.ini を変更した際に、「apacheを再起動する事」とありましたが、変化はありませんでした。
サーバも再起動しましたが、同じく変化はありませんでした。
postfix側のサーバは再起動していません。

補足

ローカル内「10.10.2.0/24」の中でやり取りをしています。
postfix側ですが、telnetが通じたのでFirewallは大丈夫と考えています。
php.ini の「SMTP」項目ですが、最初は名前で書いていたのですが、明示する為にIPアドレスに変えました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

PEAR::Mailをつかうかcurlで接続するとよいです
mail/mb_send_mailコマンドは、昔から形だけ実装されたレベルのもっとも使えないPHPコマンドの一つです

投稿2023/12/28 06:59

編集2023/12/28 07:04
yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YosiyukiUsijima

2024/01/05 02:17

ローカルでは使えていたので、是非ともやってみたかったのですが、残念です。 リリースされているから、シンプルな文章などならいけると踏んだのですが。。。 PEAR::Mailは使ったことが無いので、curlで頑張ってみます。 ありがとうございました。
guest

0

PHP マニュアル > 関数リファレンス > メール関連 > メール > インストール/設定 > 実行時設定 を見ると

SMTP string
Windows 環境のみで使用されます: mail() 関数でメールを送信する際に使用する SMTP サーバーのホスト名または IP アドレス。

とありますのでLinux環境ではこの設定ディレクティブは使えません。sendmail_pathで設定したsendmailコマンドを使ってメールを送信する方法しか使えません。

sendmailコマンドを使って送信できるようにするには、送信元のホストでもPostfixなどを動作させて外部へメールを配送できるようにする必要があります (外部からの配送を受け付ける必要はありません)。

なおこの方法をとる場合、mb_send_mail()は中途半端な実装で使うメリットがあまりありませんので、文字コード変換を自身でやることにしてmail()を使ったほうが素直に書けるかと思います。

sendmailコマンドを使うのではなく、SMTPで自身とは別のメールサーバに接続して送信したいのなら、yambejpさんのおっしゃるような方法を取るべきです。


余談。

php

1// メールヘッダを作成 2$header = "From: " . $from; 3$header = $header . "\nContent-Type: text/html;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion();

mail()の説明にあるように、ここでの改行は本来は"\r\n"であるべきです。sendmailコマンドを使う方法だと"\r\n""\n"のどちらでもうまくいくことが多いかもしれませんが。

投稿2023/12/29 23:28

ikedas

総合スコア4337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YosiyukiUsijima

2024/01/05 02:16

コメントありがとうございました。 SMTP行がWindows用だったのですね。残念です。 yambejpさんの意見を参考に検討します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問