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

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

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

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

Q&A

2回答

620閲覧

php8でs-nailにメッセージを送れない

YosiyukiUsijima

総合スコア42

PHP

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

0グッド

0クリップ

投稿2024/05/15 06:52

編集2024/05/20 01:56

実現したいこと

linux環境でphp8を使っています。

メールで処理情報を送ろうと考えているのですが、メールサーバが別にある為
linuxのs-nailを使うことにしました。

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

exec や system。popen を使ってみたのですが、execとpopenは無反応で終わり、
system は試行錯誤しても、メールは送れるのですが、本文が無いものが送信されます。

本文が送信できない理由として、exec等がパイプに反応して別の動きをしているかもしれないと思い、パイプの前に「\」を置いてみましたが、効果はありませんでした。

該当のソースコード

php

1$msg="/usr/bin/echo このメールはphpから送信しています | /usr/bin/s-nail -v -s 'Test Mail by php8 Part53' -S v15-compat -S mta=smtp\://test:testpw@mailserver.co.jp:25 -S from=msg@mailserver.co.jp -S smtp-auth=none myaddress@mailserver.co.jp"; 2 3exec($msg,$opt,$return_ver); 4 5system($msg); 6 7popen($msg,"r"); 8

試したこと・調べたこと

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

exec($msg,$opt,$return_ver);
結果:メールは送信されません。retrun_ver には「array」となります。

system($msg);
結果:メールは送信されません。echo のパイプの前に「\」を置くと、メール送信しますが本文が送信されません。

popen($msg,"r");
結果:メールは送信されません。エラー表示などはありません。

補足

OS:Almalinux9.4
PHP 8.2.19

ご指摘をお願いいたします。

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

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

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

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

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

ikedas

2024/05/19 21:48

「echo のパイプの前に「\」を置く」というのは具体的にどのようなコードですか。具体的に記してください。 (このコメント欄に書くのではありません。質問文を編集して書いてください。)
ikedas

2024/05/20 03:00

> 「echo のパイプの前に「\」を置く」というのは具体的にどのようなコードですか。具体的に記してください。 理由ではなく、具体的なコードを記してください。
YosiyukiUsijima

2024/05/20 04:10

申し訳ございません。お尋ねの「コード」を解説したいのですが、私がどう返答すればよいか理解できていないようです。 「コマンドプロンプトでエコーした文字列をパイプで s-nail に渡しているだけなのですが、パイプの記号をphpが誤認識してしまわず、system で実行できるように「\」を置いている。コマンドプロンプトではうまく動作するのですが、php で実行すると渡せない」という内容です。 「コード」というものはどういったものなのでしょうか?
ikedas

2024/05/20 09:46

①私の理解では、現在「該当のソースコード」に掲載されているコードは「パイプの前に「\」を置いて」いないコードだと思います。私の理解は正しいですか。 もしも正しいのなら、「該当のソースコード」に上記のコードと並べて「パイプの前に「\」を置いて」あるコードを掲載してください。 ②それと、両者のコードで本当に動作が違うのかどうか、今一度確認いただけませんか。 (正直なところ、私はおっしゃっているようなことが起きると思わないのです。ですから万が一、「パイプの前に「\」を置」くというのが私の想像しているようなこととは違うことである可能性も考えて、コードを「具体的に」示してほしいと言っています。) 他にも聞きたいことはありますが、ひとまず上記①、②の情報をお願いします。
YosiyukiUsijima

2024/05/21 00:52

1について 参考にしているソースコードは確かにパイプの前に「¥」はありませんでした。exec 等が思ったように動作しないときに「¥」を付けると php 上では動作せず、exec 上で動作するという経験をを何度もしているので習慣的につけて試していました。コロンやスラッシュなどでよく起こりますので、パイプも同じと予想しつけてみました。 2について コマンドプロンプトで両者を試してみるとメッセージ付きのメールが届きます。 なのでそのまま php で動作すると思ったのですが、どれもメールが送信できず、唯一メッセージなしで届いたのが system コマンドでした。 ------- あれからいろいろ試しているのですが、質問に書いたことが再現できず、パイプをつけると送信できなくなりました。ikedasさんのおっしゃったとおり不要と思われます。 少し進展したことがあります。 echo で送っている文字を 半角英数にするとメッセージが届きますし、メールログもあります。しかし、全角文字を入れると送信できないようで、メールログもありません。 成功例 /usr/bin/echo test message | /usr/bin/s-nail -v -s 'Test Mail by php8 Part61' ・・・後略 失敗例 /usr/bin/echo テストです | /usr/bin/s-nail -v -s 'Test Mail by php8 Part61' ・・・後略 system・exec どちらも同じ結果でした
ikedas

2024/05/21 03:18

「\」をつける必要がある場合について混乱があるように思います。が、さしあたり今回のケースではつけてもつけなくても変わらないということが確認できたということで、先へ行きましょうか。 で、全角英数だとだめだということは、文字コードの問題のようですね。s-nailのマニュアルページをみると、本文の文字コードの設定ができるようですから、それを調べてやってみたらどうでしょう。 マニュアルページはコマンドプロンプトで「man s-nail」を実行すると表示されます (表示を止めるには「Q」のキーを押します)。マニュアルページを表示できないときは、ネット上にあるものをみてもらってもいいです。 https://manpages.debian.org/stretch/s-nail/s-nail.1.en.html (DebianのものですがAlma Linuxでも内容は同じはずです)。 この中の「Character sets」という節を読んで調べてみてください。
guest

回答2

0

ご質問のコードのうち exec() と popen() は使いかたを間違っています。

system() は新しいシェルを起動してその中で指定されたコードを実行します。パイプ (|) はシェルの機能ですから exec()popen() で実行するプログラムの中で使うことはできません。

投稿2024/05/19 22:07

ikedas

総合スコア4443

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

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

YosiyukiUsijima

2024/05/20 02:05

回答ありがとうございます。 popenは今回初めて触ったので、あまり理解できていませんでした。 system と exec は返り値が異なる方法の違いと思っていたのですが、それだけではないのですね。 シェルの違いについては、全く理解できていませんでした。サイトを漁ってみたのですが、よくわからない状況なので、良ければ参考サイトなどをお教えいただければ助かります。
ikedas

2024/05/20 04:07

すぐによい解説が見つからないのですが、「system exec popen」でウェブ検索してみるといろいろ見つかります。C言語を使った解説が多いですが、これはもともとC言語に備わっていたOS機能の操作のための関数を他の言語が取り入れたためです。私が見たところ、PHPを使った解説ははっきり言っていい加減なものが多いので、Cを使ったものを探して読んでみてください。 きちんと勉強するのなら、「Unix (またはLinux) オペレーティングシステムの仕組み」と言った感じの本を買って、読むのがいいです。
YosiyukiUsijima

2024/05/20 08:10

回答ありがとうございます。 C言語は使ったことが無いのですが、そちらの方から調べていきます。 ありがとうございました。
guest

0

シェル(コマンドライン)から PHP スクリプトを実行してメール送信できますか?
シェルからできるのであれば、Webサーバーのログや /var/log/messages に何かエラーが出ていないでしょうか?
例えば、RHEL 系で Webサーバーが Apache httpd であれば、SELinux で許可されていないなど。

# setsebool httpd_can_network_connect on # setsebool -P httpd_can_network_connect on

投稿2024/05/19 12:11

TaichiYanagiya

総合スコア12193

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

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

YosiyukiUsijima

2024/05/20 02:34

回答をありがとうございました。 SELinuxは利用していませんので、setseboolコマンドは使えませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問