Feature #11530
openSupport hooks in mailer
0%
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
       Updated by Kouhei Sutou over 13 years ago
      Updated by Kouhei Sutou over 13 years ago
      
    
    
    I attach a patch to support hooks in mailer.
We need to do two things to support hooks in mailer.
- Add view path of plugins to ActionView::Base
- Call call_hookin 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.
       Updated by Kouhei Sutou over 13 years ago
      Updated by Kouhei Sutou over 13 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.
       Updated by Kouhei Sutou about 13 years ago
      Updated by Kouhei Sutou about 13 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
       Updated by Toshi MARUYAMA over 11 years ago
      Updated by Toshi MARUYAMA over 11 years ago
      
    
    - Related to Feature #12508: Add diff to wiki change notification added
       Updated by Kouhei Sutou about 10 years ago
      Updated by Kouhei Sutou about 10 years ago
      
    
    
    I've updated the patch for r14648.
       Updated by Go MAEDA about 10 years ago
      Updated by Go MAEDA about 10 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.
       Updated by Kouhei Sutou about 10 years ago
      Updated by Kouhei Sutou about 10 years ago
      
    
    Thanks for your response.
I'll also update other files when a developer accepts this request.
       Updated by okkez _ about 8 years ago
      Updated by okkez _ about 8 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.
       Updated by Go MAEDA about 8 years ago
      Updated by Go MAEDA about 8 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.
       Updated by Toshi MARUYAMA about 8 years ago
      Updated by Toshi MARUYAMA about 8 years ago
      
    
    - Related to Feature #26839: Inline Email Diff For Issue 'Description' Changes added
       Updated by Jean-Philippe Lang over 6 years ago
      Updated by Jean-Philippe Lang over 6 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.
       Updated by Kouhei Sutou over 6 years ago
      Updated by Kouhei Sutou over 6 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.
       Updated by Jean-Philippe Lang over 6 years ago
      Updated by Jean-Philippe Lang over 6 years ago
      
    
    Kouhei Sutou wrote:
It's already provided.
If we're rendering a HTML email,XXX.html.erbis used.
If we're rendering a plain text email,XXX.text.erbis used.
Sure, but how does the hook that is called know about this?
       Updated by Kouhei Sutou over 6 years ago
      Updated by Kouhei Sutou over 6 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.
       Updated by Kouhei Sutou almost 6 years ago
      Updated by Kouhei Sutou almost 6 years ago
      
    
    
    I've updated the patch for r18899.
       Updated by Kouhei Sutou almost 6 years ago
      Updated by Kouhei Sutou almost 6 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)
       Updated by Kouhei Sutou almost 6 years ago
      Updated by Kouhei Sutou almost 6 years ago
      
    
    
    Sorry... I added one more cosmetic fix...
       Updated by Kouhei Sutou about 4 years ago
      Updated by Kouhei Sutou about 4 years ago
      
    
    
    I've updated the patch for r21217.
       Updated by Kouhei Sutou over 3 years ago
      Updated by Kouhei Sutou over 3 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.