メールによるチケット登録でunknown-userオプションが機能しない

1,103 views
Skip to first unread message

kotomina

unread,
Mar 21, 2011, 10:33:14 PM3/21/11
to Redmine Users (japanese)
Redmine v1.0.4を使用して、メールから匿名ユーザによるチケット登録を行いたいのですが、
どうも上手く機能いたしません。
設定は以下の通りです。

連携ユーザ名: "|/usr/bin/ruby /var/lib/redmine/extra/mail_handler/rdm-
mailhandler.rb --url http://localhost/redmine/ --key Redmineのキー --
project=prj01 --allow-override project,tracker,category,priority --
unknown-user=accept"

ロールのAnonymousの権限
チケットの閲覧
チケットの追加
チケットの編集
チケットの管理

チケットを登録したいプロジェクトのprj01は非公開にしています。
連携ユーザはこのプロジェクトに所属しているのですが、
fromに当たるメールを送信するユーザはプロジェクトに所属どころかRedmine上に
登録すらしていません。

表示されるエラーは
permission denied. Command output: Request was denied by your Redmine
server. Possible reasons: email is sent from an invalid email address
or is missing some information.
なので、メールアドレスが不正で権限を持たないエラーだと思われます。
過去のディスカッションを閲覧し、
v0.9.xでは--unknown-user=acceptを指定する事で、
Redmineに登録していない匿名ユーザからチケットが登録出来たという事例を拝見してますのですが、
一体何が悪いのでしょうか?

また、匿名メールでチケット登録した場合、ちゃんとその匿名メール宛にチケット登録通知って飛ぶのでしょうか?

申し訳ありませんが、分かる方おられましたらお教え下さい。

nobu_toyofuku

unread,
Mar 23, 2011, 4:35:54 AM3/23/11
to Redmine Users (japanese)
豊福です。

> 表示されるエラーは
> permission denied. Command output: Request was denied by your Redmine
> server. Possible reasons: email is sent from an invalid email address
> or is missing some information.
> なので、メールアドレスが不正で権限を持たないエラーだと思われます。

バージョン 1.1.2 ですが同じ状況にしてデバッグ出力しながらコードを追ってみました。
app/models/mail_handler.rb の receive -> dispatch -> issue_receive を通っ
て、
app/models/user.rb の allowed_to? のメソッド定義の中の
roles.detect {|role| (context.is_public? || role.member?) &&
role.allowed_to?(action)}
の結果が nil になってはじかれていました。
このときの roles は
[#<Role id: 2, name: "Anonymous", position: 2, assignable: true,
builtin: 2,
permissions:
[:view_calendar, :view_documents, :view_files, :view_gantt, :view_issues,
:add_issues, :edit_issues, :manage_issue_relations, :browse_repository,
:view_changesets, :view_time_entries, :view_wiki_pages, :view_wiki_edits]>]
で role.member? は false になっています。

コードをいじらないとするとプロジェクトを公開に(context.is_public? を true に)
するしかなさそうに思います。あくまでもプロジェクトを公開したくなければ
role.member? のところをいじることになるのでしょう。
ちなみに app/models/role.rb では
def member?; !self.builtin?; end
def built-in?; self.builtin != 0; end
と定義されていて Anonyumous の builtin は 2 なので role.member? は
false になります。

> また、匿名メールでチケット登録した場合、ちゃんとその匿名メール宛にチケット登録通知って飛ぶのでしょうか?

app/models/mail_handler.rb の receiveメソッドを見る限りメール送信者
(コード中の sender_email)は匿名メールのときはその後の処理に使われて
いないのでチケット登録通知メールは飛ばないようです。実際私が試した
ときも通知メールはきませんでした。
---

kotomina

unread,
Mar 23, 2011, 7:22:07 AM3/23/11
to Redmine Users (japanese)
豊福さん、
ご回答ありがとうございました。

デバックの結果まで教えて頂き、とても助かります。
お教え頂いたようにプロジェクトを公開にした途端に、
unknown-userを受付け、ちゃんとチケットが登録されるようになりました。

> コードをいじらないとするとプロジェクトを公開に(context.is_public? を true に)
> するしかなさそうに思います。あくまでもプロジェクトを公開したくなければ
> role.member? のところをいじることになるのでしょう。
実はプロジェクトを非公開にしたのは、
0.9のCHANGE LOGに、
Accept emails from anyone on a private project (非公開プロジェクトにおいて任意のメールアドレス
からのチケット登録 ※rdm-mailhandler.rbのオプションで ―unknown-user=acceptを指定)
の文面があったからなのです。
よってunknown-userさえ機能すれば、特に非公開プロジェクトにする必要はありませんでした。
本当にありがとうございます。

> > また、匿名メールでチケット登録した場合、ちゃんとその匿名メール宛にチケット登録通知って飛ぶのでしょうか?
> app/models/mail_handler.rb の receiveメソッドを見る限りメール送信者
> (コード中の sender_email)は匿名メールのときはその後の処理に使われて
> いないのでチケット登録通知メールは飛ばないようです。実際私が試した
> ときも通知メールはきませんでした。
こちらも試してみたのですが、私の方でも駄目でした…。
出来れば、ちゃんとFromアドレスを見て通知を投げてくれると有り難いんですけどね…。
sender_emailはもうこの時点では破棄してしまっているようで、
その後のメール通知先は全て登録ユーザのDB情報にあるメールアドレスを使ってるように見受けられます。
こちらはしょうがないので諦める事にしました。

情報を頂き本当にありがとうございました。

nobu_toyofuku

unread,
Mar 23, 2011, 12:08:22 PM3/23/11
to Redmine Users (japanese)
豊福です。

> 実はプロジェクトを非公開にしたのは、
> 0.9のCHANGE LOGに、
> Accept emails from anyone on a private project (非公開プロジェクトにおいて任意のメールアドレス
> からのチケット登録 ※rdm-mailhandler.rbのオプションで ―unknown-user=acceptを指定)
> の文面があったからなのです。

この修正は
http://www.redmine.org/issues/4407
「You can now use a 'no_permission_check' option.」
ということで ―unknown-user=accept(このオプションは 0.8系でも
あった)にさらに --no-permission-check をつければいいよ、
ということみたいです。
日本語版の補足についている
「 ※rdm-mailhandler.rbのオプションで ―unknown-user=acceptを指定」
がまずいですね。
---

kotomina

unread,
Mar 23, 2011, 8:41:31 PM3/23/11
to Redmine Users (japanese)
--no-permission-checkとプロジェクト非公開の組み合わせ、
実施してみました。

--no-permission-checkの使い方に少し迷いましたが、
見事に非公開の状態でunknown-userの受付に成功しました。
(--no-permission-check=1としたり--no-permission-check=trueとしたりしてエラー何度か出した
後、
rdm-mailhandler.rbの中身みて、ようやくただ--no-permission-checkを付与すればいい事に気付きました。)

> この修正はhttp://www.redmine.org/issues/4407
> 「You can now use a 'no_permission_check' option.」
> ということで ―unknown-user=accept(このオプションは 0.8系でも
> あった)にさらに --no-permission-check をつければいいよ、
> ということみたいです。
チケットの、更に履歴コメントの中に記述されてますね…。
CHANGELOGにもこの情報載せて欲しかった…。
あの補足事項は本当にチケットの本文のみしか汲み取って訳してないのかもしれません。

CHANGELOG上に記されてる英字タイトル
「Accept emails from anyone on a private project」の文面を使って、
Redmineのオフィシャルサイトで検索を掛ければリリースチケットに辿り着く事を
今回覚える事が出来ました。
今度からはちゃんとリリースチケットの方も調べるよう心掛けます。
(あまり英語は明るくない為、苦心しそうですが)

何度もお教え頂き、ありがとうございました。
プロジェクトを非公開に出来るならそれに越した事はない為、
本当に助かりました。

nobu_toyofuku

unread,
Mar 24, 2011, 5:09:42 AM3/24/11
to Redmine Users (japanese)
豊福です。

> Redmineのオフィシャルサイトで検索を掛ければリリースチケットに辿り着く事を
> 今回覚える事が出来ました。

私も今まで知らなかったのですが今回
Redmine 0.9.0 のロードマップ
http://www.redmine.org/projects/redmine/versions/6
をたまたま見つけてそこに並んでいる関連するチケットのリンクから
今回のチケットにたどり着きました。

> その後のメール通知先は全て登録ユーザのDB情報にあるメールアドレスを使ってるように見受けられます。
> こちらはしょうがないので諦める事にしました。

セキュリティのことを気にしなければ、

例えば notify_members というカスタムフィールドを作って、
登録チケットに
notify_members: fo...@bar.jp fo...@bar.jp
のように通知メールを送りたいメールアドレスリストを書いて

app/models/mailer.rb の issue_addメソッドなどに
message_id issue
- recipients issue.recipients
+ recips = issue.recipients.dup
+ issue.custom_values.each {|c| if c.custom_field.name ==
'notify_members'; recips.concat(c.value.split(' ')); break; end }
+ recipients recips
cc(issue.watcher_recipients - @recipients)

という修正を加える、という方法を思いつきました。
---

kotomina

unread,
Mar 24, 2011, 9:52:37 PM3/24/11
to Redmine Users (japanese)
豊福さん
通知アドレスの件、ありがとうございました。

お教え頂いた処理、実装してみました。
1点苦心した所があり、
> + issue.custom_values.each {|c| if c.custom_field.name ==
> 'notify_members'; recips.concat(c.value.split(' ')); break; end }
この部分でなぜかnameで引き当てる事が出来ず、
結局カスタムフィールドIDの方で引き当てるように変更してしまいました。
> + issue.custom_values.each {|c| if c.custom_field.id == 4;
> recips.concat(c.value.split(' ')); break; end }
(上記の'4'が私の環境における'notify_members'のカスタムフィールドIDの番号です。)
カスタムフィールド名は全て英字で、日本語名のエンコードが~云々というワケでもなさそうですし、
なぜ引当られなかったのかは結局分からなかったのですが、
とりあえずIDの方で引当られたので良しとしてしまいました。

おかげでようやく先のunknown-userと合わせて、
Redmine未登録の使用者からのメールによる問合せチケット登録に対し、
チケット登録通知を返せるようになりました。
正直、全て実現出来るとは思ってなかった為、驚いています。

様々な情報をお教え頂き、感謝の念に堪えません。
本当にありがとうございました。

nobu_toyofuku

unread,
Mar 25, 2011, 5:39:21 AM3/25/11
to Redmine Users (japanese)
豊福です。

>> + issue.custom_values.each {|c| if c.custom_field.name ==
>> 'notify_members'; recips.concat(c.value.split(' ')); break; end }
> この部分でなぜかnameで引き当てる事が出来ず、
> 結局カスタムフィールドIDの方で引き当てるように変更してしまいました。

ごめんなさい。実は notify_members という名前のカスタムフィールド
では試していませんでした。こちらでも notify_members という名前では
うまくいかないことを確認しました。ただ v1.0.4 と v1.1.2 との違いか
上記の name で引き当てるところはうまくいくのですがチケットに登録
するときにカスタムフィールドを抽出するところで失敗していました。

app/models/mail_handler.rb でカスタムフィールドのチェックをする
際に名前に humanize をかけられており "notify_members" が
"Notify members" に変換されてからチェックにかかっていました。
なのでこちらではチケットに
Notify members: fo...@bar.jp fo...@bar.jp
と書けばうまくいきました。(最初の N は小文字でもOK)
v1.0.4 ではここらへんは事情が違うのかもしれません。

ともかくカスタムフィールド名中にアンダーバーを使うと混乱のもと
になるようですのでアンダーバーなしの「notifymembers」とか humanize
で変換されない日本語での「通知者リスト」などにすれば大丈夫だと思います。

> 正直、全て実現出来るとは思ってなかった為、驚いています。

お役に立てて嬉しゅうございます。
通知メールのところはセキュリティチェックをまったく入れていない
ので十分にご注意して運用してください。
---
Reply all
Reply to author
Forward
0 new messages