Project

General

Profile

Actions

Feature #11530

open

Support hooks in mailer

Added by Kouhei Sutou over 11 years ago. Updated almost 2 years ago.

Status:
New
Priority:
Normal
Assignee:
-
Category:
Email notifications
Start date:
Due date:
% Done:

0%

Estimated time:
Resolution:

Description

Could you support hooks in mailer?

Views can be extended by plugin. I want to extend mail content by plugin.

I want to add newly added Wiki content to Wiki added notification mails.
I also want to add changed Wiki content diff to Wiki updated notification mails.

If Redmine supports hooks in mailer, I can write a plugin to do them.


Files


Related issues

Related to Redmine - Feature #12508: Add diff to wiki change notificationNew

Actions
Related to Redmine - Feature #26839: Inline Email Diff For Issue 'Description' ChangesNew

Actions
Actions #1

Updated by Kouhei Sutou over 11 years ago

I attach a patch to support hooks in mailer.

We need to do two things to support hooks in mailer.

  1. Add view path of plugins to ActionView::Base
  2. Call call_hook in template

Here is the change for view path:

diff --git a/lib/redmine/plugin.rb b/lib/redmine/plugin.rb
index c3f4150..dae51ee 100644
--- a/lib/redmine/plugin.rb
+++ b/lib/redmine/plugin.rb
@@ -82,6 +82,7 @@ module Redmine #:nodoc:
       view_path = File.join(p.directory, 'app', 'views')
       if File.directory?(view_path)
         ActionController::Base.prepend_view_path(view_path)
+        ActionMailer::Base.prepend_view_path(view_path)
       end

       # Adds the app/{controllers,helpers,models} directories of the plugin to the autoload path

In the patch, just two call_hook are only added. We need more call_hook to make mailer more extensible.

Actions #2

Updated by Kouhei Sutou over 11 years ago

Here is a plugin that uses hooks in mailer:
https://github.com/kou/redmine-plugin-wiki-change-notifier

If this feature request is accepted, the plugin works.

For now, the plugin works with the attached patch.

Actions #3

Updated by Kouhei Sutou over 11 years ago

I've updated the patch because #11776 adds the following change:

diff --git a/lib/redmine/plugin.rb b/lib/redmine/plugin.rb
index c3f4150..dae51ee 100644
--- a/lib/redmine/plugin.rb
+++ b/lib/redmine/plugin.rb
@@ -82,6 +82,7 @@ module Redmine #:nodoc:
       view_path = File.join(p.directory, 'app', 'views')
       if File.directory?(view_path)
         ActionController::Base.prepend_view_path(view_path)
+        ActionMailer::Base.prepend_view_path(view_path)
       end

       # Adds the app/{controllers,helpers,models} directories of the plugin to the autoload path
Actions #4

Updated by Toshi MARUYAMA almost 10 years ago

  • Related to Feature #12508: Add diff to wiki change notification added
Actions #6

Updated by Go MAEDA over 8 years ago

Thank you for submitting patches.
Although the patch updates app/views/mailer/wiki_content_*.erb, I think other app/views/mailer/*.erb files should also have hooks for consistency.

Actions #7

Updated by Kouhei Sutou over 8 years ago

Thanks for your response.
I'll also update other files when a developer accepts this request.

Actions #8

Updated by okkez _ over 6 years ago

I've updated the patch for r16963.
This patch also includes changes for adding hooks to app/views/mailer/*.erb same as app/views/mailer/wiki_content_*.erb.

I hope that next major release includes this patch.

Actions #9

Updated by Go MAEDA over 6 years ago

  • Target version set to 4.1.0

okkez _ wrote:

I've updated the patch for r16963.
This patch also includes changes for adding hooks to app/views/mailer/*.erb same as app/views/mailer/wiki_content_*.erb.

It looks good to me. I am setting target version to 4.1.0.
Thank you for posting the patch.

Actions #10

Updated by Toshi MARUYAMA over 6 years ago

  • Related to Feature #26839: Inline Email Diff For Issue 'Description' Changes added
Actions #11

Updated by Jean-Philippe Lang over 4 years ago

  • Target version changed from 4.1.0 to Candidate for next major release

We need to provide a way for the hook to know if we're rendering a html or plain text email.

Actions #12

Updated by Kouhei Sutou over 4 years ago

It's already provided.
If we're rendering a HTML email, XXX.html.erb is used.
If we're rendering a plain text email, XXX.text.erb is used.

Actions #13

Updated by Jean-Philippe Lang over 4 years ago

Kouhei Sutou wrote:

It's already provided.
If we're rendering a HTML email, XXX.html.erb is used.
If we're rendering a plain text email, XXX.text.erb is used.

Sure, but how does the hook that is called know about this?

Actions #14

Updated by Kouhei Sutou over 4 years ago

We can get :text in XXX.text.erb and :html in XXX.html.erb by calling lookup_context.rendered_format.
We can also get [:text] in XXX.text.erb and [:html] in XXX.html.erb by calling formats.

Actions #16

Updated by Kouhei Sutou over 4 years ago

I added more hooks to `app/views/mailer/issue_edit*`:

--- support-hooks-in-mailer-for-r18899.patch    2019-11-05 16:44:11.906980336 +0900
+++ support-hooks-in-mailer-for-r18899-2.patch    2019-11-05 18:46:16.355343392 +0900
@@ -132,28 +132,68 @@
 ===================================================================
 --- app/views/mailer/issue_edit.html.erb    (revision 18899)
 +++ app/views/mailer/issue_edit.html.erb    (working copy)
-@@ -13,3 +13,8 @@
+@@ -10,6 +10,28 @@
+ <% end %>
+ </ul>
+ 
++<%= call_hook(:view_mailer_issue_edit_after_details,
++              :issue => @issue,
++              :journal => @journal,
++              :journal_details => @journal_details,
++              :users => @users,
++              :issue_url => @issue_url) %>
++
  <%= textilizable(@journal, :notes, :only_path => false) %>
++
++<%= call_hook(:view_mailer_issue_edit_after_notes,
++              :issue => @issue,
++              :journal => @journal,
++              :journal_details => @journal_details,
++              :users => @users,
++              :issue_url => @issue_url) %>
++
  <hr />
  <%= render :partial => 'issue', :formats => [:html], :locals => { :issue => @issue, :user => @user, :issue_url => @issue_url } %>
 +
 +<%= call_hook(:view_mailer_issue_edit_bottom,
 +              :issue => @issue,
++              :journal => @journal,
++              :journal_details => @journal_details,
 +              :users => @users,
 +              :issue_url => @issue_url) %>
 Index: app/views/mailer/issue_edit.text.erb
 ===================================================================
 --- app/views/mailer/issue_edit.text.erb    (revision 18899)
 +++ app/views/mailer/issue_edit.text.erb    (working copy)
-@@ -10,3 +10,8 @@
+@@ -3,10 +3,27 @@
+ <% details_to_strings(@journal_details, true).each do |string| -%>
+ <%= string %>
+ <% end -%>
+-
++<%= call_hook(:view_mailer_issue_edit_after_details,
++              :issue => @issue,
++              :journal => @journal,
++              :journal_details => @journal_details,
++              :users => @users,
++              :issue_url => @issue_url) -%>
+ <% if @journal.notes? -%>
+ <%= @journal.notes %>
+ 
  <% end -%>
++<%= call_hook(:view_mailer_issue_edit_after_notes,
++              :issue => @issue,
++              :journal => @journal,
++              :journal_details => @journal_details,
++              :users => @users,
++              :issue_url => @issue_url) -%>
  ----------------------------------------
  <%= render :partial => 'issue', :formats => [:text], :locals => { :issue => @issue, :user => @user, :issue_url => @issue_url } %>
-+
 +<%= call_hook(:view_mailer_issue_edit_bottom,
 +              :issue => @issue,
++              :journal => @journal,
++              :journal_details => @journal_details,
 +              :users => @users,
-+              :issue_url => @issue_url) %>
++              :issue_url => @issue_url) -%>
 Index: app/views/mailer/lost_password.html.erb
 ===================================================================
 --- app/views/mailer/lost_password.html.erb    (revision 18899)
Actions #17

Updated by Kouhei Sutou over 4 years ago

Sorry... I added one more cosmetic fix...

Actions #19

Updated by Kouhei Sutou almost 2 years ago

Could someone take a look at this?
We use this maintained patch in almost 10 years. We use this patch with Redmine 5.0.0 now.

Actions

Also available in: Atom PDF