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

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

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

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

PHP

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

Q&A

解決済

2回答

2750閲覧

sendmailに書き込んだ転送メールのエラーを取得する方法

u-sukesan

総合スコア156

Sendmail

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

PHP

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

0グッド

1クリップ

投稿2017/07/09 01:28

あるメールに送信されたメールをphpで受け取り、そのまま複数のメールアドレスに転送するプログラムを作っています。

php7.x

現状のソース

mb_language("japanese"); mb_internal_encoding("UTF-8"); $input = file_get_contents("php://stdin"); // 標準入力 //転送先 $dest=array('123@hoge.com','456@hoge.jp','789@hoge.jp'); $sendmail = popen("/usr/sbin/sendmail ".implode(" ",$dest), "w"); fwrite($sendmail, $input); fclose($sendmail);

これを実行した際、3つの転送先($dest)のうち、どれが送れてどれが送れていないのかを調べたい

お尋ねしたいことは

⑴sendmailのメールキューを調べればそれはわかるのでしょうか?
その場合PHPで確認する方法はありますでしょうか?

⑵3つの転送先($dest)をwhileなどで1つずつ回してfwrite($sendmail, $input)し、エラーを拾った方がいいのでしょうか?

よろしくお願いします

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

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

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

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

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

zico_teratail

2017/07/10 15:34

「送れた」の定義が謎です。「キューが実行されたかどうか」という意味なのか、それとも「相手に届いた(≒エラーリターンが無い)」という意味なのか。
u-sukesan

2017/07/11 02:16

エラーリターンがないかどうかを取得できればと思っています
guest

回答2

0

メーリングリストと同様とのことでしたら、From: ヘッダは変更せず、envelope from を bounce@yourdomain などにしてメールを送信する方法はどうでしょうか。
エラーメールは bounce@yourdomain 宛に送られますので、それを受けてメール本文を解析し、元メールの宛先を抽出するようなプログラムが別途必要になります。

投稿2017/07/12 02:31

TaichiYanagiya

総合スコア12146

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

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

0

ベストアンサー

エラーリターンの有無を調べたいならば、
Return-Pathを設定しておいて、
その返送先のメールボックスをcronなどで定期的にチェックすればいいのでは?

投稿2017/07/11 03:27

zico_teratail

総合スコア907

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

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

u-sukesan

2017/07/11 04:48

ありがとうございます。 現状受け取ったメールをそのまま転送しており $input = file_get_contents("php://stdin"); // 標準入力 中略 fwrite($sendmail, $input); できればメールをバラして Return-Pathを追記するとこをせず とは思っていたのですが ご指摘通りエラーリターンを取得するにはReturn-Pathが不可欠ですよね では「キューが実行されたかどうか」の場合、手段はありますでしょうか
zico_teratail

2017/07/11 05:11

>受け取ったメールをそのまま転送 >$input = file_get_contents("php://stdin"); // 標準入力 受け取ったメール??? エラーメールは必ずしも送信直後に一瞬で返ってくるとは限らないので、その方法は無理があるのでは。 数分~数時間後にエラーメールとして返ってくることもよくありますよ。 >メールをバラして これの意味がわかりません。 「バラす」とは? >Return-Pathを追記するとこをせず なぜ? リターンパスを設定すると何が問題なのでしょうか? >「キューが実行されたかどうか」 Postfixで未配信メールの確認 | OpenGroove こういうのとかでしょうか。
u-sukesan

2017/07/11 05:43

不特定多数の人→1つのメールアドレスに送信→当プログラム起動→複数の転送先に転送 という機能になります。 この場合、受信したメールを分解して、Return-Pathの部分を当方で確認できるアドレスにする必要がありますよね? そうでない場合、Return-Pathは送信者になっているとおもますので、こちらでエラーメールを確認することはできないと思ったのですが
zico_teratail

2017/07/11 06:28

そもそも「あるメールに送信されたメールをphpで受け取り、そのまま複数のメールアドレスに転送するプログラム」というのが具体的にどういうものなのかよく分からないんですが、これって要するに古来からあるメーリングリストと同じなのでは??? あと最終的に何がしたいのかイメージがちょっとよく分からないんですが・・・ PHP部分でReturn-Pathを書き換えればいいんじゃないですかね? 既に誰かが作って公開しているメーリングリストのスクリプトを拾って来たほうが早い気もしますが。
u-sukesan

2017/07/11 09:22

いわゆるメーリングリストですね しかしよく見るメーリングリストの場合、差出人が変わってしまうので自作しました。 やりたいこととしては、1つのメールアドレスにメールを送信すると複数のブログに転送され、ブログ側では受け取ったメールを記事として反映します。また受け取ったメールの送信元メールアドレスで投稿者としてDBから投稿者名を判断します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問