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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Postfix

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

Q&A

解決済

1回答

1262閲覧

postfixでMySQLのselect文の結果を取得したい

entaro12345

総合スコア75

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Postfix

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

0グッド

0クリップ

投稿2020/10/02 09:49

前提・実現したいこと

postfixでMySQLの操作を行いたいです。
前質問で一気に質問させていただきましたが、
一つ一つ進めようと思い質問させていただきます。

Postfixを構築し、MySQLへの接続用の設定等もしたつもりですが、
実際のselect文の戻り値はどこにどのようにして取得できるか不明でしたので、ご教示いただけますと幸いです。
送信元のメールアドレスが登録されているか確認するためのselect文になります。

該当のソースコード

maincf

1※main.cfのファイルになります。 2alias_maps = mysql:/etc/postfix/alias.mysql, hash:/etc/aliases

aliasmysql

1※alias.mysqlのファイルになります。 2hosts = mysql_server 3user = mysql_user 4password = user_password 5dbname = some_db 6query = select user_id from table where mail='%s'

試したこと

下記のページを参考に構築しました
参考先

補足情報(FW/ツールのバージョンなど)

Postfix 2.10.1
PHP7.3
MySQL8

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

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

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

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

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

guest

回答1

0

ベストアンサー

実際のselect文の戻り値はどこにどのようにして取得できるか不明でしたので、ご教示いただけますと幸いです。

alias_maps で設定しているので、hash ファイルの場合と同じように、「key=転送元メールアドレスのローカルパート」で検索し、「value=転送先メールアドレス」を得ることになります。

例えば、受信したメールの宛先が user1234@example.com の場合、「key=user1234」→「select user_id from table where mail='user1234'」で検索して、「value=user_idカラムの値」を得ます。

user_id カラムの値が「転送先メールアドレス(複数の場合は「,」区切り)」だったら、そのメールアドレスに転送しますし、「|コマンド」であれば、コマンドを実行します。

投稿2020/10/02 13:19

TaichiYanagiya

総合スコア12173

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

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

entaro12345

2020/10/04 08:28

ご回答ありがとうございます。 また、コメントが遅くなりすみません。 selectした結果(user_id)をコマンド実行時に渡すことも可能ということでしょうか?
TaichiYanagiya

2020/10/04 08:40

具体的にどういうことをしたいのでしょうか?
entaro12345

2020/10/04 09:01

言葉足らずですみません。 具体的には、 ①メールを受信したらそのメールアドレスがDBに格納されているか確認します。(Select user_id) ②格納されていなければDBに格納します。(Insert) ③格納されているかいないかの結果を戻り値[Bool型]を返します。 ④受信メールアドレスに対してメールを送信します。  ⇒その際に、DBに格納されているかいないかで文面(本文)を分けます。 以上のことを実装したいです。
TaichiYanagiya

2020/10/04 14:49

alias_maps (→local_recipient_maps) でメールアドレスの存在確認はできますが、存在しない場合、postfix は受け取りを拒否しますので、この方法(alias_maps から DB を参照する方法)では②以降は処理できません。 postfix を 2段構成にして、前段ではすべてのメールアドレスを受け入れ、①〜④の処理を行なうコマンドに渡し、後段で実際のメールを受け取る(スプールする)ようにするといいのではないでしょうか。
entaro12345

2020/10/04 23:59 編集

ありがとうございます。 何度も質問ばかりですみません。 現状ですと、postfixですべてのメールドレスを受け入れ、「Mail/mimeDecode.php」を使用し解析して MySQL接続しようとしたところ(正しくは、dboインスタンス生成)でエラーが発生しうまく処理できない状況です。 その接続さえ正常に出来さえすれば問題なく解決の気がしてます。 postfixで設定したパイプラインでの処理(PHP呼び出し)だとMySQLへの接続はできないのですかね? それとも、単純に接続の仕方の問題なのですかね?
TaichiYanagiya

2020/10/05 00:46

「Mail/mimeDecode.php」がどういう入出力なのかわかりませんが、単体で動くのであれば postfix 経由に原因がありそうですし、そうでなく単体でも動かないのであれば、入出力やプログラム自体に原因があると思います。
entaro12345

2020/10/05 00:56

ありがとうございます。 失礼しました。 「Mail/mimeDecode.php」は受信メールを解析するものになります。 (受信メールアドレスや件名等を取得するものです。) 単体での動作検証はできているので、postfix経由の問題っぽいですね。
TaichiYanagiya

2020/10/05 01:22

最初の質問からは離れてしまっていますが、単純に aliases ファイルから「Mail/mimeDecode.php」を実行するようにして切り分けするといいと思います。 main.cf ファイルでは「alias_maps = hash:/etc/aliases」として DB を参照しないようにし、/etc/aliases ファイルに「testuser: |(Mail/mimeDecode.php の絶対パス)」と設定して newaliases コマンドで /etc/aliases.db ファイルを更新します。 「testuser@ドメイン」宛のメールを受信したときに「Mail/mimeDecode.php」が実行されるかどうか、DB への接続など、所望の動作をするかどうか。
entaro12345

2020/10/05 01:34

ありがとうございます! そもそも当初の質問から離れてしまいすみません。 いただいた内容で確認してみます!
entaro12345

2020/10/05 01:47

main.cf ファイルは「alias_maps = hash:/etc/aliases」と修正 /etc/aliases ファイルに「testuser: |(Mail/mimeDecode.php の絶対パス)」と設定して newaliases コマンドで /etc/aliases.db ファイルを更新し「testuser@ドメイン」宛のメールを受信したときに「Mail/mimeDecode.php」は実行されました。 (最初の行にログ出力のソースを入れておき、ログが出力されていることを確認しました) が、その後のDB接続(インスタンス生成)時にエラーとなり接続は不可でした。 ちなみに、エラー内容は下記でした。 「SQLSTATE[HY000] [2054] Server sent charset unknown to the client. Please, report to the developers」 ※単独実行(コマンドにてファイル実行)では、DB接続ができております。
TaichiYanagiya

2020/10/05 02:01

locale (環境変数 LANG など)に違いがあるのかもしれません。 PHP プログラム側でなんとかするか、my.cnf 側で charset を指定するといいかもしれません。
entaro12345

2020/10/05 02:14

ありがとうございます。 my.cnfでは、下記のように指定しております。 =============== [mysqld] collation-server=utf8_unicode_ci character-set-server=utf8 default_authentication_plugin=mysql_native_password [client] default-character-set=utf8 [mysql] default-character-set=utf8 =============== 恐れいりますが、アドバイスあればいただけますと幸いです。
TaichiYanagiya

2020/10/05 02:23

すみませんが、MySQL についてはわかりません。 別の質問にした方がいいと思います。
entaro12345

2020/10/05 02:24

かしこまりました! ここまで何度もご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問