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

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

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

Dovecotとは、POPやIMAPサーバーを提供するMDA(メール配送エージェント)の一つです。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Postfix

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

2回答

6555閲覧

メール受信をトリガーにプログラムを動かしたい

yuki_90453

総合スコア326

Dovecot

Dovecotとは、POPやIMAPサーバーを提供するMDA(メール配送エージェント)の一つです。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Postfix

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

2クリップ

投稿2017/01/24 10:09

編集2017/01/24 13:42

メール受信をトリガーにプログラムを実行したいと考えております。

###設定前の状態
CentOS 6.8
postfix + dovecotでメールサーバーを構築。
この時点で送受信を問題無く行なえます。

###行った事
受信時に実行されるプログラム

ruby

1# -*- encoding: utf-8 -*- 2#------------------------------------------------- 3# Ruby script to get a mail via alias of postfix. 4#------------------------------------------------- 5require 'mail' 6 7class GetMail 8 def initialize 9 dt = Time.now.strftime("%Y%m%d_%H%M%S%L") 10 @out_file = "/home/info/Document/txt.txt" 11 end 12 13 def execute 14 open(@out_file, "w+") do |f| 15 mail = Mail.new($stdin.read) 16 f.puts "From: #{mail.from.first}" 17 f.puts "To: #{mail.to.first}" 18 f.puts "Date: #{mail.date}" 19 f.puts "Subject: #{mail.subject}" 20 f.puts "Body:\n#{mail.body.decoded.encode("UTF-8", mail.charset)}" 21 end 22 rescue => e 23 $stderr.puts "[#{e.class}] #{e.message}" 24 e.backtrace.each{|trace| $stderr.puts "\t#{trace}"} 25 exit 1 26 end 27end 28 29exit unless $0 == __FILE__ 30GetMail.new.execute

postfixの設定

# info: :include:/tmp/TEST info: "| ruby /home/info/mail_trigger.rb"

上記を内容を「/etc/aliases」に追記した所、外部からのメールが受信できなくなりました。
外部からメールを送信すると「Undelivered Mail Returned to Sende」で帰ってきますが、クライアントではソフトではエラーは出ていません。

main.cfの設定

allow_mail_to_commands = alias,forward,include

postfixの設定とaliasesの設定では変更のたびにnewaliasesとrestartを行っています。

受信時のメールログ

Jan 24 19:02:50 v9193 postfix/smtpd[4313]: connect from mail-pf0-f173.google.com[209.85.192.173] Jan 24 19:02:50 v9193 postfix/smtpd[4313]: setting up TLS connection from mail-pf0-f173.google.com[209.85.192.173] Jan 24 19:02:50 v9193 postfix/smtpd[4313]: Anonymous TLS connection established from mail-pf0-f173.google.com[209.85.192.173]: TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits) Jan 24 19:02:51 v9193 postfix/smtpd[4313]: A12D2FC0BEC: client=mail-pf0-f173.google.com[209.85.192.173] Jan 24 19:02:51 v9193 postfix/cleanup[4318]: A12D2FC0BEC: message-id=<E42B1DF2-4293-4A0A-96D7-4142B8650CDB@gmail.com> Jan 24 19:02:51 v9193 postfix/qmgr[3638]: A12D2FC0BEC: from=<example@gmail.com>, size=2736, nrcpt=1 (queue active) Jan 24 19:02:51 v9193 postfix/local[4319]: A12D2FC0BEC: to=<info@server.com>, relay=local, delay=0.77, delays=0.76/0.01/0/0.01, dsn=5.3.0, status=bounced (Command died with status 127: " ruby /home/info/mail_trigger.rb". Command output: sh: ruby: command not found ) Jan 24 19:02:51 v9193 postfix/cleanup[4318]: D5598FC0BFD: message-id=<20170124100251.D5598FC0BFD@mail.server.com> Jan 24 19:02:51 v9193 postfix/bounce[4321]: A12D2FC0BEC: sender non-delivery notification: D5598FC0BFD Jan 24 19:02:51 v9193 postfix/qmgr[3638]: D5598FC0BFD: from=<>, size=4721, nrcpt=1 (queue active) Jan 24 19:02:51 v9193 postfix/qmgr[3638]: A12D2FC0BEC: removed Jan 24 19:02:51 v9193 postfix/smtpd[4313]: disconnect from mail-pf0-f173.google.com[209.85.192.173] Jan 24 19:02:52 v9193 postfix/smtp[4322]: certificate verification failed for gmail-smtp-in.l.google.com[74.125.204.26]:25: untrusted issuer /C=US/O=Equifax/OU=Equifax Secure Certificate Authority Jan 24 19:02:53 v9193 postfix/smtp[4322]: D5598FC0BFD: to=<example@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.204.26]:25, delay=1.7, delays=0/0.01/0.99/0.7, dsn=2.0.0, status=sent (250 2.0.0 OK 1485252173 s5si18562651plj.103 - gsmtp) Jan 24 19:02:53 v9193 postfix/qmgr[3638]: D5598FC0BFD: removed

備考
受信時に実行されるプログラムは実行権限をメールユーザーに与えています。
メールユーザーにログインしてプログラムを実行しても、権限関係のエラーなどは出ません。

##質問
このような状況でどこに問題があるのかわかりません。
メールログにはコマンド見つからないとなっていますが、該当ユーザーにスイッチしてプログラムを動かすと問題なく動きます。

どの辺りを見ればいいか教えて頂けないでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

「Undelivered Mail Returned to Sende」は何かが原因でメールの配送に失敗し、メールが返ってきたことを意味します。原因はたいていPostfixのログに記載されています。そこでログを見るのですが、注目すべきは下記の行です。

Jan 24 19:02:51 v9193 postfix/local[4319]: A12D2FC0BEC: to=<info@server.com>, relay=local, delay=0.77, delays=0.76/0.01/0/0.01, dsn=5.3.0, status=bounced (Command died with status 127: " ruby /home/info/mail_trigger.rb". Command output: sh: ruby: command not found )

このように、送られてきたメールについて、最終的にどのような処理を行ったのかがログには記録されており、statusの部分がその処理結果ですstatus=bouncedというのは何かしらが原因でメールの配送自体が失敗したことを意味し、続く()の中にその理由が書いています。

Command died with status 127: " ruby /home/info/mail_trigger.rb". Command output: sh: ruby: command not found

これは、パイプで実行されるコマンドが、"command not found"(コマンドが見つからない)が原因でエラーになったという意味です。つまり、"ruby"のコマンドが見つからないからエラーとなっています。コマンドについて"ruby"というコマンド名だけでは書かずに、フルパス"/usr/local/bin/ruby"(実際の場所に合わせてください)等に書き直してください。そうすれば、コマンドが見つかり、実行されるはずです。それでもエラーになる場合は、別のエラーメッセージが表示されるはずですので、それを確認してみてください。

【なぜ、フルパスが必要なのか?】
aliasesの中やcronの中でコマンドを指定するとき、ログインしたときのようなシェルの初期設定(~/.bashrc等に書かれている内容のこと)が行われません。特にPATHに関しては最低限の"/bin"と"/usr/bin"のみ設定されている場合があります(OSなどによってなにが設定されているかは異なります)。"ruby"が"/usr/local/bin/ruby"としてインストールされている場合、PATHには含まれていないため、"ruby"だけでは見つからず、エラーになります。このように、"/bin"と"/usr/bin"以外のコマンドを実行する場合は、"/usr/local/bin/ruby"等のフルパスでコマンドを指定する必要があります。

投稿2017/01/24 10:57

raccy

総合スコア21735

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

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

yuki_90453

2017/01/24 12:46 編集

なるほど、丁寧な回答ありがとうございます。 さっそく gem environmentでパスを確認し下記のように記述致しました。 info: "| /usr/local/rbenv/versions/2.3.1/bin/ruby /home/info/mail_trigger.rb" newaliasesとchmodで 770で与え実行。メール送信してみると下記の内容がログに残り、プログラムは動いていませんでした。 Jan 24 21:40:51 v9193 postfix/local[4796]: 38BAAFC0BF8: to=<info@aky-corporation.com>, relay=local, delay=0.68, delays=0.66/0.01/0/0.01, dsn=4.3.0, status=deferred (temporary failure. Command output: local: fatal: execvp /usr/local/rbenv/versions/2.3.1/bin/ruby: Permission denied ) 権限問題だと思うのですが、下記のような権限を付与していますがこれでは駄目なんでしょうか? -rwxrwx--- 1 root root 22280960 1月 5 15:02 2017 /usr/local/rbenv/versions/2.3.1/bin/ruby
yuki_90453

2017/01/24 23:24

頂いたURLの内容が難しく検索しながら設定したので合っているかわかりませんが、「default_privs = info」に変更してみました。 しかしメールログには相変わらずpermision denidと記述されてしまいます。 このinfoというユーザーは、特権ユーザーやpostfixの所有権を持っていないと思います。 またこのユーザーは、nologinで作成したユーザーなのですがそれが権限がないなどの可能性はありますでしょうか?
yuki_90453

2017/01/25 04:54

お世話になっております。rubyの権限を777に変更するとプログラムが動きました。しかしメールその物はユーザーのメールボックスに保存されないのですが、これは仕様なんでしょうか?
raccy

2017/01/25 20:23

権限は755などでもできると思います。ここら辺はLinuxのファイルパーミッションについて一度学ぶことをお勧めします。 aliasは代替、つまり、代わりにするという意味です。本来のメールボックスへ送るという操作の「代わりに」コマンドを実行するというのがその設定になります。メールボックスにも送って、かつ、コマンドも実行するとなると、書き方を変える必要があります。 もし、メールボックスにも送って、かつ、コマンドも実行する書き方について、調べてもわからなかったときは、別枠で質問してみてください。
guest

0

さしあたり、Rubyスクリプトの1行目は

Ruby

1! /usr/local/bin/ruby 2

ではなく

Ruby

1#! /usr/local/bin/ruby

かと思いますが(転記ミスかな?)


失礼しました。やはり転記ミスでしたね。
スクリプトを動かしてみましたが、起動はされました。
ただ、txt.txtを書き込む際にPermission deniedのエラーになっていたので、/tmp/txt.txtに書き込むようにしたところ、ファイルは書き込まれましたが、ファイルオーナーは nobodyになっていました(Ubuntu15.10にて実行)。
ご参考までに。

投稿2017/01/24 13:36

編集2017/01/24 15:03
ockeghem

総合スコア11701

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

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

yuki_90453

2017/01/24 13:41

転記ミスですね。削除しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問