From bd434427e61edbac03d273a308dcfffe72096ae0 Mon Sep 17 00:00:00 2001
From: Jean-Philippe Lang <jp_lang@yahoo.fr>
Date: Sun, 4 Nov 2007 10:43:39 +0000
Subject: [PATCH] Mailer: * added an application setting to specify the
 application protocol (http or https) used to generate urls * added layouts
 for text and html emails * no more language specific templates * urls are now
 generated using UrlWriter * the mailer now uses AdvAttrAccessor code style to
 set email parameters

git-svn-id: http://redmine.rubyforge.org/svn/trunk@877 e93f8b46-1217-0410-a6f0-8f06a7374b81
---
 app/models/mailer.rb                          | 134 ++++++++++--------
 app/views/mailer/_issue_text_html.rhtml       |   3 +-
 app/views/mailer/_issue_text_plain.rhtml      |   2 +-
 app/views/mailer/account_information.rhtml    |  12 --
 .../account_information.text.html.rhtml       |  11 ++
 .../account_information.text.plain.rhtml      |   6 +
 app/views/mailer/account_information_fr.rhtml |  12 --
 app/views/mailer/account_information_pl.rhtml |  12 --
 app/views/mailer/account_information_sr.rhtml |   9 --
 .../mailer/attachments_added.text.html.rhtml  |   4 +-
 .../mailer/attachments_added.text.plain.rhtml |   4 +-
 .../mailer/document_added.text.html.rhtml     |   5 +-
 .../mailer/document_added.text.plain.rhtml    |   4 +-
 app/views/mailer/issue_add.text.html.rhtml    |   4 +-
 app/views/mailer/issue_add.text.plain.rhtml   |   4 +-
 app/views/mailer/issue_edit.text.html.rhtml   |   4 +-
 app/views/mailer/issue_edit.text.plain.rhtml  |   4 +-
 app/views/mailer/layout.text.html.rhtml       |  17 +++
 app/views/mailer/layout.text.plain.rhtml      |   3 +
 app/views/mailer/lost_password.rhtml          |   5 -
 .../mailer/lost_password.text.html.rhtml      |   2 +
 .../mailer/lost_password.text.plain.rhtml     |   2 +
 .../mailer/message_posted.text.html.rhtml     |   4 +-
 .../mailer/message_posted.text.plain.rhtml    |   4 +-
 app/views/mailer/news_added.text.html.rhtml   |   4 +-
 app/views/mailer/news_added.text.plain.rhtml  |   4 +-
 app/views/mailer/register.rhtml               |   5 -
 app/views/mailer/register.text.html.rhtml     |   2 +
 app/views/mailer/register.text.plain.rhtml    |   2 +
 app/views/mailer/test.text.html.rhtml         |   5 +-
 app/views/mailer/test.text.plain.rhtml        |   5 +-
 app/views/settings/edit.rhtml                 |   5 +-
 config/settings.yml                           |   2 +
 lang/bg.yml                                   |   3 +
 lang/cs.yml                                   |   3 +
 lang/de.yml                                   |   3 +
 lang/en.yml                                   |   3 +
 lang/es.yml                                   |   3 +
 lang/fr.yml                                   |   3 +
 lang/he.yml                                   |   3 +
 lang/it.yml                                   |   3 +
 lang/ja.yml                                   |   3 +
 lang/nl.yml                                   |   3 +
 lang/pl.yml                                   |   3 +
 lang/pt-br.yml                                |   3 +
 lang/pt.yml                                   |   3 +
 lang/ro.yml                                   |   3 +
 lang/sr.yml                                   |   3 +
 lang/sv.yml                                   |   3 +
 lang/zh.yml                                   |   3 +
 test/fixtures/attachments.yml                 |  13 ++
 test/unit/mailer_test.rb                      |  43 +++++-
 52 files changed, 244 insertions(+), 168 deletions(-)
 delete mode 100644 app/views/mailer/account_information.rhtml
 create mode 100644 app/views/mailer/account_information.text.html.rhtml
 create mode 100644 app/views/mailer/account_information.text.plain.rhtml
 delete mode 100644 app/views/mailer/account_information_fr.rhtml
 delete mode 100644 app/views/mailer/account_information_pl.rhtml
 delete mode 100644 app/views/mailer/account_information_sr.rhtml
 create mode 100644 app/views/mailer/layout.text.html.rhtml
 create mode 100644 app/views/mailer/layout.text.plain.rhtml
 delete mode 100644 app/views/mailer/lost_password.rhtml
 create mode 100644 app/views/mailer/lost_password.text.html.rhtml
 create mode 100644 app/views/mailer/lost_password.text.plain.rhtml
 delete mode 100644 app/views/mailer/register.rhtml
 create mode 100644 app/views/mailer/register.text.html.rhtml
 create mode 100644 app/views/mailer/register.text.plain.rhtml

diff --git a/app/models/mailer.rb b/app/models/mailer.rb
index da7937404..c17e2aa19 100644
--- a/app/models/mailer.rb
+++ b/app/models/mailer.rb
@@ -20,99 +20,111 @@ class Mailer < ActionMailer::Base
   helper IssuesHelper
   helper CustomFieldsHelper
   
-  def account_information(user, password)
-    set_language_if_valid user.language
-    recipients user.mail
-    from Setting.mail_from
-    subject l(:mail_subject_register)
-    body :user => user, :password => password
-  end
-
-  def issue_add(issue)
-    set_language_if_valid(Setting.default_language)
-    @recipients     = issue.recipients
-    @from           = Setting.mail_from
-    @subject        = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] #{issue.status.name} - #{issue.subject}"
-    @body['issue']  = issue
+  include ActionController::UrlWriter
+  
+  def issue_add(issue)    
+    recipients issue.recipients    
+    subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] #{issue.status.name} - #{issue.subject}"
+    body :issue => issue,
+         :issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue)
   end
 
   def issue_edit(journal)
-    set_language_if_valid(Setting.default_language)
     issue = journal.journalized
-    @recipients     = issue.recipients
+    recipients issue.recipients
     # Watchers in cc
-    @cc             = issue.watcher_recipients - @recipients
-    @from           = Setting.mail_from
-    @subject        = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] #{issue.status.name} - #{issue.subject}"
-    @body['issue']  = issue
-    @body['journal']= journal
+    cc(issue.watcher_recipients - @recipients)
+    subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] #{issue.status.name} - #{issue.subject}"
+    body :issue => issue,
+         :journal => journal,
+         :issue_url => url_for(:controller => 'issues', :action => 'show', :id => issue)
   end
   
   def document_added(document)
-    set_language_if_valid(Setting.default_language)
-    @recipients     = document.project.recipients
-    @from           = Setting.mail_from
-    @subject        = "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}"
-    @body['document'] = document
+    recipients document.project.recipients
+    subject "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}"
+    body :document => document,
+         :document_url => url_for(:controller => 'documents', :action => 'show', :id => document)
   end
   
   def attachments_added(attachments)
-    set_language_if_valid(Setting.default_language)
     container = attachments.first.container
-    url = ''
     added_to = ''
+    added_to_url = ''
     case container.class.name
     when 'Version'
-      url = {:only_path => false, :host => Setting.host_name, :controller => 'projects', :action => 'list_files', :id => container.project_id}
+      added_to_url = url_for(:controller => 'projects', :action => 'list_files', :id => container.project_id)
       added_to = "#{l(:label_version)}: #{container.name}"
     when 'Document'
-      url = {:only_path => false, :host => Setting.host_name, :controller => 'documents', :action => 'show', :id => container.id}
+      added_to_url = url_for(:controller => 'documents', :action => 'show', :id => container.id)
       added_to = "#{l(:label_document)}: #{container.title}"
     end
-    @recipients     = container.project.recipients
-    @from           = Setting.mail_from
-    @subject        = "[#{container.project.name}] #{l(:label_attachment_new)}"
-    @body['attachments'] = attachments
-    @body['url']    = url
-    @body['added_to'] = added_to
+    recipients container.project.recipients
+    subject "[#{container.project.name}] #{l(:label_attachment_new)}"
+    body :attachments => attachments,
+         :added_to => added_to,
+         :added_to_url => added_to_url
   end
 
   def news_added(news)
-    set_language_if_valid(Setting.default_language)
-    @recipients     = news.project.recipients
-    @from           = Setting.mail_from
-    @subject        = "[#{news.project.name}] #{l(:label_news)}: #{news.title}"
-    @body['news'] = news
+    recipients news.project.recipients
+    subject "[#{news.project.name}] #{l(:label_news)}: #{news.title}"
+    body :news => news,
+         :news_url => url_for(:controller => 'news', :action => 'show', :id => news)
   end
-  
+
+  def message_posted(message, recipients)
+    recipients(recipients)
+    subject "[#{message.board.project.name} - #{message.board.name}] #{message.subject}"
+    body :message => message,
+         :message_url => url_for(:controller => 'messages', :action => 'show', :board_id => message.board_id, :id => message.root)
+  end
+   
+  def account_information(user, password)
+    set_language_if_valid user.language
+    recipients user.mail
+    subject l(:mail_subject_register)
+    body :user => user,
+         :password => password,
+         :login_url => url_for(:controller => 'account', :action => 'login')
+  end
+
   def lost_password(token)
     set_language_if_valid(token.user.language)
-    @recipients     = token.user.mail
-    @from           = Setting.mail_from
-    @subject        = l(:mail_subject_lost_password)
-    @body['token']  = token
+    recipients token.user.mail
+    subject l(:mail_subject_lost_password)
+    body :token => token,
+         :url => url_for(:controller => 'account', :action => 'lost_password', :token => token.value)
   end  
 
   def register(token)
     set_language_if_valid(token.user.language)
-    @recipients     = token.user.mail
-    @from           = Setting.mail_from
-    @subject        = l(:mail_subject_register)
-    @body['token']  = token
-  end
-  
-  def message_posted(message, recipients)
-    set_language_if_valid(Setting.default_language)
-    @recipients     = recipients
-    @from           = Setting.mail_from
-    @subject        = "[#{message.board.project.name} - #{message.board.name}] #{message.subject}"
-    @body['message'] = message
+    recipients token.user.mail
+    subject l(:mail_subject_register)
+    body :token => token,
+         :url => url_for(:controller => 'account', :action => 'register', :token => token.value)
   end
   
   def test(user)
     set_language_if_valid(user.language)
-    @recipients     = user.mail
-    @from           = Setting.mail_from
-    @subject        = 'Redmine'
+    recipients user.mail
+    subject 'Redmine test'
+    body :url => url_for(:controller => 'welcome')
+  end
+  
+  private
+  def initialize_defaults(method_name)
+    super
+    set_language_if_valid Setting.default_language
+    from Setting.mail_from
+    default_url_options[:host] = Setting.host_name
+    default_url_options[:protocol] = Setting.protocol
+  end
+  
+  # Renders a message with the corresponding layout
+  def render_message(method_name, body)
+    layout = method_name.match(%r{text\.html\.(rhtml|rxml)}) ? 'layout.text.html.rhtml' : 'layout.text.plain.rhtml'
+    body[:content_for_layout] = render(:file => method_name, :body => body)
+    ActionView::Base.new(File.join(template_root, 'mailer'), body, self).render(:file => layout)
   end
 end
diff --git a/app/views/mailer/_issue_text_html.rhtml b/app/views/mailer/_issue_text_html.rhtml
index 80885ebab..a3eb05b01 100644
--- a/app/views/mailer/_issue_text_html.rhtml
+++ b/app/views/mailer/_issue_text_html.rhtml
@@ -1,5 +1,4 @@
-<%= link_to "#{issue.tracker.name} ##{issue.id}",  :only_path => false, :host => Setting.host_name, :controller => 'issues', :action => 'show', :id => issue %>:
-<%= issue.subject %>
+<h1><%= link_to "#{issue.tracker.name} ##{issue.id}: #{issue.subject}", issue_url %></h1>
 
 <ul>
 <li><%=l(:field_author)%>: <%= issue.author %></li>
diff --git a/app/views/mailer/_issue_text_plain.rhtml b/app/views/mailer/_issue_text_plain.rhtml
index 5e211f9af..6b87c1808 100644
--- a/app/views/mailer/_issue_text_plain.rhtml
+++ b/app/views/mailer/_issue_text_plain.rhtml
@@ -1,5 +1,5 @@
 <%= "#{issue.tracker.name} ##{issue.id}: #{issue.subject}" %>
-<%= url_for :only_path => false, :host => Setting.host_name, :controller => 'issues', :action => 'show', :id => issue %>
+<%= issue_url %>
 
 <%=l(:field_author)%>: <%= issue.author %>
 <%=l(:field_status)%>: <%= issue.status %>
diff --git a/app/views/mailer/account_information.rhtml b/app/views/mailer/account_information.rhtml
deleted file mode 100644
index 98b2916a7..000000000
--- a/app/views/mailer/account_information.rhtml
+++ /dev/null
@@ -1,12 +0,0 @@
-<% if @user.auth_source %>You can use your "<%= @user.auth_source.name %>" account to log into Redmine.
-<% else %>Your Redmine account information:
-* Login:    <%= @user.login %>
-* Password: <%= @password %>
-<% end %>
-Log in: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'account', :action => 'login' %>
-<% unless @user.auth_source %>
-You can change your password here: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'my', :action => 'account' %>
-<% end %>
-
-----------------------------------------
-<%= Setting.emails_footer %>
diff --git a/app/views/mailer/account_information.text.html.rhtml b/app/views/mailer/account_information.text.html.rhtml
new file mode 100644
index 000000000..3b6ab6a9d
--- /dev/null
+++ b/app/views/mailer/account_information.text.html.rhtml
@@ -0,0 +1,11 @@
+<% if @user.auth_source %>
+<p><%= l(:mail_body_account_information_external, @user.auth_source.name) %></p>
+<% else %>
+<p><%= l(:mail_body_account_information) %>:</p>
+<ul>
+    <li><%= l(:field_login) %>: <%= @user.login %></li>
+    <li><%= l(:field_password) %>: <%= @password %></li>
+</ul>
+<% end %>
+
+<p><%= l(:label_login) %>: <%= auto_link(@login_url) %></p>
diff --git a/app/views/mailer/account_information.text.plain.rhtml b/app/views/mailer/account_information.text.plain.rhtml
new file mode 100644
index 000000000..0a02566d9
--- /dev/null
+++ b/app/views/mailer/account_information.text.plain.rhtml
@@ -0,0 +1,6 @@
+<% if @user.auth_source %><%= l(:mail_body_account_information_external, @user.auth_source.name) %>
+<% else %><%= l(:mail_body_account_information) %>:
+* <%= l(:field_login) %>: <%= @user.login %>
+* <%= l(:field_password) %>: <%= @password %>
+<% end %>
+<%= l(:label_login) %>: <%= @login_url %>
diff --git a/app/views/mailer/account_information_fr.rhtml b/app/views/mailer/account_information_fr.rhtml
deleted file mode 100644
index 71df34532..000000000
--- a/app/views/mailer/account_information_fr.rhtml
+++ /dev/null
@@ -1,12 +0,0 @@
-<% if @user.auth_source %>Vous pouvez utiliser votre compte "<%= @user.auth_source.name %>" pour vous connecter à Redmine.
-<% else %>Paramètres de connexion de votre compte Redmine:
-* Identifiant:  <%= @user.login %>
-* Mot de passe: <%= @password %>
-<% end %>
-Pour se connecter à l'application: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'account', :action => 'login' %>
-<% unless @user.auth_source %>
-Vous pouvez changer votre mot de passe à l'adresse: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'my', :action => 'account' %>
-<% end %>
-
-----------------------------------------
-<%= Setting.emails_footer %>
diff --git a/app/views/mailer/account_information_pl.rhtml b/app/views/mailer/account_information_pl.rhtml
deleted file mode 100644
index 7f9060b2d..000000000
--- a/app/views/mailer/account_information_pl.rhtml
+++ /dev/null
@@ -1,12 +0,0 @@
-<% if @user.auth_source %>Możesz użyć twojego "<%= @user.auth_source.name %>" konta do zalogowania do Redmine.
-<% else %>Twoje konto w Redmine:
-* Login:    <%= @user.login %>
-* Hasło: <%= @password %>
-<% end %>
-Zaloguj: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'account', :action => 'login' %>
-<% unless @user.auth_source %>
-Możesz zmienić swoje hasło tutaj: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'my', :action => 'account' %>
-<% end %>
-
-----------------------------------------
-<%= Setting.emails_footer %>
diff --git a/app/views/mailer/account_information_sr.rhtml b/app/views/mailer/account_information_sr.rhtml
deleted file mode 100644
index 0acd87d8d..000000000
--- a/app/views/mailer/account_information_sr.rhtml
+++ /dev/null
@@ -1,9 +0,0 @@
-<% if @user.auth_source %>Mozete koristiti vas "<%= @user.auth_source.name %>" nalog da bi ste se prikljucili na Redmine.
-<% else %>Informacije o vasem Redmine nalogu:
-* Login:    <%= @user.login %>
-* Password: <%= @password %>
-<% end %>
-Log in: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'account', :action => 'login' %>
-<% unless @user.auth_source %>
-Ovde mozete izmeniti svoju lozinku: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'my', :action => 'account' %>
-<% end %>
diff --git a/app/views/mailer/attachments_added.text.html.rhtml b/app/views/mailer/attachments_added.text.html.rhtml
index 9bb30db1d..d2355b1c4 100644
--- a/app/views/mailer/attachments_added.text.html.rhtml
+++ b/app/views/mailer/attachments_added.text.html.rhtml
@@ -1,7 +1,5 @@
-<%= link_to @added_to, @url %><br />
+<%= link_to @added_to, @added_to_url %><br />
 
 <ul><% @attachments.each do |attachment | %>
 <li><%= attachment.filename %></li>
 <% end %></ul>
-<hr />
-<small><em><%= textilizable Setting.emails_footer %></em></small>
diff --git a/app/views/mailer/attachments_added.text.plain.rhtml b/app/views/mailer/attachments_added.text.plain.rhtml
index 7e4245ef2..28cb8285e 100644
--- a/app/views/mailer/attachments_added.text.plain.rhtml
+++ b/app/views/mailer/attachments_added.text.plain.rhtml
@@ -1,6 +1,4 @@
 <%= @added_to %><% @attachments.each do |attachment | %>
 - <%= attachment.filename %><% end %>
 
-<%= url_for @url %>
-----------------------------------------
-<%= Setting.emails_footer %>
+<%= @added_to_url %>
diff --git a/app/views/mailer/document_added.text.html.rhtml b/app/views/mailer/document_added.text.html.rhtml
index d7d6558b8..2ef63012b 100644
--- a/app/views/mailer/document_added.text.html.rhtml
+++ b/app/views/mailer/document_added.text.html.rhtml
@@ -1,6 +1,3 @@
-<%= link_to @document.title, :only_path => false, :host => Setting.host_name, :controller => 'documents', :action => 'show', :id => @document %>
-(<%= @document.category.name %>)<br />
+<%= link_to @document.title, @document_url %> (<%= @document.category.name %>)<br />
 <br />
 <%= textilizable(@document.description) %>
-<hr />
-<small><em><%= textilizable Setting.emails_footer %></em></small>
diff --git a/app/views/mailer/document_added.text.plain.rhtml b/app/views/mailer/document_added.text.plain.rhtml
index bb42758f7..a6a72829e 100644
--- a/app/views/mailer/document_added.text.plain.rhtml
+++ b/app/views/mailer/document_added.text.plain.rhtml
@@ -1,6 +1,4 @@
 <%= @document.title %> (<%= @document.category.name %>)
-<%= url_for :only_path => false, :host => Setting.host_name, :controller => 'documents', :action => 'show', :id => @document %>
+<%= @document_url %>
 
 <%= @document.description %>
-----------------------------------------
-<%= Setting.emails_footer %>
diff --git a/app/views/mailer/issue_add.text.html.rhtml b/app/views/mailer/issue_add.text.html.rhtml
index 7a0712c36..adcb4c9fe 100644
--- a/app/views/mailer/issue_add.text.html.rhtml
+++ b/app/views/mailer/issue_add.text.html.rhtml
@@ -1,5 +1,3 @@
 <%= l(:text_issue_added, "##{@issue.id}") %>
 <hr />
-<%= render :file => "_issue_text_html", :use_full_path => true, :locals => { :issue => @issue } %>
-<hr />
-<small><em><%= textilizable Setting.emails_footer %></em></small>
+<%= render :file => "_issue_text_html", :use_full_path => true, :locals => { :issue => @issue, :issue_url => @issue_url } %>
diff --git a/app/views/mailer/issue_add.text.plain.rhtml b/app/views/mailer/issue_add.text.plain.rhtml
index a5740ad89..797fb11b6 100644
--- a/app/views/mailer/issue_add.text.plain.rhtml
+++ b/app/views/mailer/issue_add.text.plain.rhtml
@@ -1,5 +1,3 @@
 <%= l(:text_issue_added, "##{@issue.id}") %>
 ----------------------------------------
-<%= render :file => "_issue_text_plain", :use_full_path => true, :locals => { :issue => @issue } %>
-----------------------------------------
-<%= Setting.emails_footer %>
+<%= render :file => "_issue_text_plain", :use_full_path => true, :locals => { :issue => @issue, :issue_url => @issue_url } %>
diff --git a/app/views/mailer/issue_edit.text.html.rhtml b/app/views/mailer/issue_edit.text.html.rhtml
index fddd19431..40d34968e 100644
--- a/app/views/mailer/issue_edit.text.html.rhtml
+++ b/app/views/mailer/issue_edit.text.html.rhtml
@@ -7,6 +7,4 @@
 </ul>
 <%= textilizable(@journal.notes) %>
 <hr />
-<%= render :file => "_issue_text_html", :use_full_path => true, :locals => { :issue => @issue } %>
-<hr />
-<small><em><%= textilizable Setting.emails_footer %></em></small>
+<%= render :file => "_issue_text_html", :use_full_path => true, :locals => { :issue => @issue, :issue_url => @issue_url } %>
diff --git a/app/views/mailer/issue_edit.text.plain.rhtml b/app/views/mailer/issue_edit.text.plain.rhtml
index 4ecc37549..32019eaea 100644
--- a/app/views/mailer/issue_edit.text.plain.rhtml
+++ b/app/views/mailer/issue_edit.text.plain.rhtml
@@ -5,6 +5,4 @@
 <% end %>
 <%= @journal.notes if @journal.notes? %>
 ----------------------------------------
-<%= render :file => "_issue_text_plain", :use_full_path => true, :locals => { :issue => @issue } %>
-----------------------------------------
-<%= Setting.emails_footer %>
+<%= render :file => "_issue_text_plain", :use_full_path => true, :locals => { :issue => @issue, :issue_url => @issue_url } %>
diff --git a/app/views/mailer/layout.text.html.rhtml b/app/views/mailer/layout.text.html.rhtml
new file mode 100644
index 000000000..b78e92bdd
--- /dev/null
+++ b/app/views/mailer/layout.text.html.rhtml
@@ -0,0 +1,17 @@
+<html>
+<head>
+<style>
+body { font-family: Verdana, sans-serif; font-size: 0.8em; color:#484848; }
+body h1 { font-family: "Trebuchet MS", Verdana, sans-serif; font-size: 1.2em; margin: 0;}
+a, a:link, a:visited{ color: #2A5685; }
+a:hover, a:active{ color: #c61a1a; }
+hr { width: 100%; height: 1px; background: #ccc; border: 0; }
+.footer { font-size: 0.8em; font-style: italic; }
+</style>
+</head>
+<body>
+<%= yield %>
+<hr />
+<span class="footer"><%= Redmine::WikiFormatting.to_html(Setting.emails_footer) %></span>
+</body>
+</html>
diff --git a/app/views/mailer/layout.text.plain.rhtml b/app/views/mailer/layout.text.plain.rhtml
new file mode 100644
index 000000000..ec3e1bfa0
--- /dev/null
+++ b/app/views/mailer/layout.text.plain.rhtml
@@ -0,0 +1,3 @@
+<%= yield %>
+----------------------------------------
+<%= Setting.emails_footer %>
diff --git a/app/views/mailer/lost_password.rhtml b/app/views/mailer/lost_password.rhtml
deleted file mode 100644
index 5b5bb3b90..000000000
--- a/app/views/mailer/lost_password.rhtml
+++ /dev/null
@@ -1,5 +0,0 @@
-<%= l(:mail_body_lost_password) %>
-<%= url_for :only_path => false, :host => Setting.host_name, :controller => 'account', :action => 'lost_password', :token => @token.value %>
-
-----------------------------------------
-<%= Setting.emails_footer %>
diff --git a/app/views/mailer/lost_password.text.html.rhtml b/app/views/mailer/lost_password.text.html.rhtml
new file mode 100644
index 000000000..26eacfa92
--- /dev/null
+++ b/app/views/mailer/lost_password.text.html.rhtml
@@ -0,0 +1,2 @@
+<p><%= l(:mail_body_lost_password) %><br />
+<%= auto_link(@url) %></p>
diff --git a/app/views/mailer/lost_password.text.plain.rhtml b/app/views/mailer/lost_password.text.plain.rhtml
new file mode 100644
index 000000000..aec1b5b86
--- /dev/null
+++ b/app/views/mailer/lost_password.text.plain.rhtml
@@ -0,0 +1,2 @@
+<%= l(:mail_body_lost_password) %>
+<%= @url %>
diff --git a/app/views/mailer/message_posted.text.html.rhtml b/app/views/mailer/message_posted.text.html.rhtml
index 89346e724..558a6e52a 100644
--- a/app/views/mailer/message_posted.text.html.rhtml
+++ b/app/views/mailer/message_posted.text.html.rhtml
@@ -1,6 +1,4 @@
-<%=h @message.board.project.name %> - <%=h @message.board.name %>: <%= link_to @message.subject, :only_path => false, :host => Setting.host_name, :controller => 'messages', :action => 'show', :board_id => @message.board_id, :id => @message.root %><br />
+<h1><%=h @message.board.project.name %> - <%=h @message.board.name %>: <%= link_to @message.subject, @message_url %></h1>
 <em><%= @message.author.name %></em>
 
 <%= textilizable @message.content %>
-<hr />
-<small><em><%= textilizable Setting.emails_footer %></em></small>
diff --git a/app/views/mailer/message_posted.text.plain.rhtml b/app/views/mailer/message_posted.text.plain.rhtml
index 97539fd01..cc1120567 100644
--- a/app/views/mailer/message_posted.text.plain.rhtml
+++ b/app/views/mailer/message_posted.text.plain.rhtml
@@ -1,6 +1,4 @@
-<%= url_for :only_path => false, :host => Setting.host_name, :controller => 'messages', :action => 'show', :board_id => @message.board_id, :id => @message.root %>
+<%= @message_url %>
 <%= @message.author.name %>
 
 <%= @message.content %>
-----------------------------------------
-<%= Setting.emails_footer %>
diff --git a/app/views/mailer/news_added.text.html.rhtml b/app/views/mailer/news_added.text.html.rhtml
index e99dfd5bc..010ef8ee1 100644
--- a/app/views/mailer/news_added.text.html.rhtml
+++ b/app/views/mailer/news_added.text.html.rhtml
@@ -1,6 +1,4 @@
-<%= link_to @news.title, :only_path => false, :host => Setting.host_name, :controller => 'news', :action => 'show', :id => @news %><br />
+<h1><%= link_to @news.title, @news_url %></h1>
 <em><%= @news.author.name %></em>
 
 <%= textilizable(@news.description) %>
-<hr />
-<small><em><%= textilizable Setting.emails_footer %></em></small>
diff --git a/app/views/mailer/news_added.text.plain.rhtml b/app/views/mailer/news_added.text.plain.rhtml
index 1a04af9ca..c8ae3035f 100644
--- a/app/views/mailer/news_added.text.plain.rhtml
+++ b/app/views/mailer/news_added.text.plain.rhtml
@@ -1,7 +1,5 @@
 <%= @news.title %>
-<%= url_for :only_path => false, :host => Setting.host_name, :controller => 'news', :action => 'show', :id => @news %>
+<%= @news_url %>
 <%= @news.author.name %>
 
 <%= @news.description %>
-----------------------------------------
-<%= Setting.emails_footer %>
diff --git a/app/views/mailer/register.rhtml b/app/views/mailer/register.rhtml
deleted file mode 100644
index 55fcf1e10..000000000
--- a/app/views/mailer/register.rhtml
+++ /dev/null
@@ -1,5 +0,0 @@
-<%= l(:mail_body_register) %>
-<%= url_for :only_path => false, :host => Setting.host_name, :controller => 'account', :action => 'register', :token => @token.value %>
-
-----------------------------------------
-<%= Setting.emails_footer %>
diff --git a/app/views/mailer/register.text.html.rhtml b/app/views/mailer/register.text.html.rhtml
new file mode 100644
index 000000000..145c3d7c9
--- /dev/null
+++ b/app/views/mailer/register.text.html.rhtml
@@ -0,0 +1,2 @@
+<p><%= l(:mail_body_register) %><br />
+<%= auto_link(@url) %></p>
diff --git a/app/views/mailer/register.text.plain.rhtml b/app/views/mailer/register.text.plain.rhtml
new file mode 100644
index 000000000..102a15ee3
--- /dev/null
+++ b/app/views/mailer/register.text.plain.rhtml
@@ -0,0 +1,2 @@
+<%= l(:mail_body_register) %>
+<%= @url %>
diff --git a/app/views/mailer/test.text.html.rhtml b/app/views/mailer/test.text.html.rhtml
index f1cb1881a..25ad20c51 100644
--- a/app/views/mailer/test.text.html.rhtml
+++ b/app/views/mailer/test.text.html.rhtml
@@ -1,5 +1,2 @@
 <p>This is a test email sent by Redmine.<br />
-Redmine URL: <%= link_to url_for(:only_path => false, :host => Setting.host_name, :controller => 'welcome'),
-                         url_for(:only_path => false, :host => Setting.host_name, :controller => 'welcome') %></p>
-<hr />
-<small><em><%= textilizable Setting.emails_footer %></em></small>
+Redmine URL: <%= auto_link(@url) %></p>
diff --git a/app/views/mailer/test.text.plain.rhtml b/app/views/mailer/test.text.plain.rhtml
index 0519caab5..790d6ab22 100644
--- a/app/views/mailer/test.text.plain.rhtml
+++ b/app/views/mailer/test.text.plain.rhtml
@@ -1,5 +1,2 @@
 This is a test email sent by Redmine.
-Redmine URL: <%= url_for :only_path => false, :host => Setting.host_name, :controller => 'welcome' %>
-
-----------------------------------------
-<%= Setting.emails_footer %>
+Redmine URL: <%= @url %>
diff --git a/app/views/settings/edit.rhtml b/app/views/settings/edit.rhtml
index 503339884..d3f994d4f 100644
--- a/app/views/settings/edit.rhtml
+++ b/app/views/settings/edit.rhtml
@@ -37,6 +37,9 @@
 <p><label><%= l(:setting_host_name) %></label>
 <%= text_field_tag 'settings[host_name]', Setting.host_name, :size => 60 %></p>
 
+<p><label><%= l(:setting_protocol) %></label>
+<%= select_tag 'settings[protocol]', options_for_select(['http', 'https'], Setting.protocol) %></p>
+
 <p><label><%= l(:setting_text_formatting) %></label>
 <%= select_tag 'settings[text_formatting]', options_for_select([[l(:label_none), "0"], ["textile", "textile"]], Setting.text_formatting) %></p>
 
@@ -91,4 +94,4 @@
 
 <%= submit_tag l(:button_save) %>
 </div>
-<% end %>
\ No newline at end of file
+<% end %>
diff --git a/config/settings.yml b/config/settings.yml
index ff695cc7c..333203f03 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -47,6 +47,8 @@ default_language:
   default: en
 host_name:
   default: localhost:3000
+protocol:
+  default: http
 feeds_limit:
   format: int
   default: 15
diff --git a/lang/bg.yml b/lang/bg.yml
index 366aa94a3..469792535 100644
--- a/lang/bg.yml
+++ b/lang/bg.yml
@@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/cs.yml b/lang/cs.yml
index 4f35c8a3b..d62746633 100644
--- a/lang/cs.yml
+++ b/lang/cs.yml
@@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/de.yml b/lang/de.yml
index 350a86e4c..9a5fcee2b 100644
--- a/lang/de.yml
+++ b/lang/de.yml
@@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/en.yml b/lang/en.yml
index 4a52d281b..2ab4c11a2 100644
--- a/lang/en.yml
+++ b/lang/en.yml
@@ -80,6 +80,8 @@ mail_subject_lost_password: Your Redmine password
 mail_body_lost_password: 'To change your Redmine password, click on the following link:'
 mail_subject_register: Redmine account activation
 mail_body_register: 'To activate your Redmine account, click on the following link:'
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
 
 gui_validation_error: 1 error
 gui_validation_error_plural: %d errors
@@ -189,6 +191,7 @@ setting_cross_project_issue_relations: Allow cross-project issue relations
 setting_issue_list_default_columns: Default columns displayed on the issue list
 setting_repositories_encodings: Repositories encodings
 setting_emails_footer: Emails footer
+setting_protocol: Protocol
 
 label_user: User
 label_user_plural: Users
diff --git a/lang/es.yml b/lang/es.yml
index 5d1f806c7..e93fb5bd8 100644
--- a/lang/es.yml
+++ b/lang/es.yml
@@ -537,3 +537,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/fr.yml b/lang/fr.yml
index e5a2b843f..1f35272c1 100644
--- a/lang/fr.yml
+++ b/lang/fr.yml
@@ -80,6 +80,8 @@ mail_subject_lost_password: Votre mot de passe redMine
 mail_body_lost_password: 'Pour changer votre mot de passe Redmine, cliquez sur le lien suivant:'
 mail_subject_register: Activation de votre compte redMine
 mail_body_register: 'Pour activer votre compte Redmine, cliquez sur le lien suivant:'
+mail_body_account_information_external: Vous pouvez utiliser votre compte "%s" pour vous connecter à Redmine.
+mail_body_account_information: Paramètres de connexion de votre compte Redmine
 
 gui_validation_error: 1 erreur
 gui_validation_error_plural: %d erreurs
@@ -189,6 +191,7 @@ setting_cross_project_issue_relations: Autoriser les relations entre demandes de
 setting_issue_list_default_columns: Colonnes affichées par défaut sur la liste des demandes
 setting_repositories_encodings: Encodages des dépôts
 setting_emails_footer: Pied-de-page des emails
+setting_protocol: Protocole
 
 label_user: Utilisateur
 label_user_plural: Utilisateurs
diff --git a/lang/he.yml b/lang/he.yml
index 206d33093..73f72d5bb 100644
--- a/lang/he.yml
+++ b/lang/he.yml
@@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/it.yml b/lang/it.yml
index 36475e678..224843e0e 100644
--- a/lang/it.yml
+++ b/lang/it.yml
@@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/ja.yml b/lang/ja.yml
index 5a3362c21..4ff45f5fb 100644
--- a/lang/ja.yml
+++ b/lang/ja.yml
@@ -535,3 +535,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/nl.yml b/lang/nl.yml
index 4d9479f32..f43f5a5b9 100644
--- a/lang/nl.yml
+++ b/lang/nl.yml
@@ -535,3 +535,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/pl.yml b/lang/pl.yml
index 6f8d7f2fc..e636afe5b 100644
--- a/lang/pl.yml
+++ b/lang/pl.yml
@@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: Możesz użyć twojego "%s" konta do zalogowania do Redmine.
+mail_body_account_information: Twoje konto w Redmine
+setting_protocol: Protocol
diff --git a/lang/pt-br.yml b/lang/pt-br.yml
index a01793979..707baffcd 100644
--- a/lang/pt-br.yml
+++ b/lang/pt-br.yml
@@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/pt.yml b/lang/pt.yml
index da919938d..687ab512b 100644
--- a/lang/pt.yml
+++ b/lang/pt.yml
@@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/ro.yml b/lang/ro.yml
index 732809334..f31bd6f84 100644
--- a/lang/ro.yml
+++ b/lang/ro.yml
@@ -534,3 +534,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/sr.yml b/lang/sr.yml
index 96cd92734..d95855731 100644
--- a/lang/sr.yml
+++ b/lang/sr.yml
@@ -80,6 +80,8 @@ mail_subject_lost_password: Vaša redMine lozinka
 mail_body_lost_password: 'Da biste izmenili vašu Redmine lozinku, kliknite na sledeći link:'
 mail_subject_register: aktivacija redMine naloga
 mail_body_register: 'Da biste aktivirali vaš Redmine nalog, kliknite na sledeći link:'
+mail_body_account_information_external: Mozete koristiti vas "%s" nalog da bi ste se prikljucili na Redmine.
+mail_body_account_information: Informacije o vasem Redmine nalogu
 
 gui_validation_error: 1 greška
 gui_validation_error_plural: %d grešaka
@@ -535,3 +537,4 @@ enumeration_doc_categories: Kategorija dokumenata
 enumeration_activities: Aktivnosti (praćenje vremena))
 label_float: Float
 button_copy: Copy
+setting_protocol: Protocol
diff --git a/lang/sv.yml b/lang/sv.yml
index ae1329db5..0cd4f1a1f 100644
--- a/lang/sv.yml
+++ b/lang/sv.yml
@@ -535,3 +535,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/lang/zh.yml b/lang/zh.yml
index a7ce17e19..715010922 100644
--- a/lang/zh.yml
+++ b/lang/zh.yml
@@ -537,3 +537,6 @@ label_user_mail_option_none: "Only for things I watch or I'm involved in"
 setting_emails_footer: Emails footer
 label_float: Float
 button_copy: Copy
+mail_body_account_information_external: You can use your "%s" account to log into Redmine.
+mail_body_account_information: Your Redmine account information
+setting_protocol: Protocol
diff --git a/test/fixtures/attachments.yml b/test/fixtures/attachments.yml
index 6c352e1e3..764948755 100644
--- a/test/fixtures/attachments.yml
+++ b/test/fixtures/attachments.yml
@@ -11,3 +11,16 @@ attachments_001:
   filesize: 28
   filename: error281.txt
   author_id: 2
+attachments_002: 
+  created_on: 2006-07-19 21:07:27 +02:00
+  downloads: 0
+  content_type: text/plain
+  disk_filename: 060719210727_document.txt
+  container_id: 1
+  digest: b91e08d0cf966d5c6ff411bd8c4cc3a2
+  id: 2
+  container_type: Document
+  filesize: 28
+  filename: document.txt
+  author_id: 2
+  
\ No newline at end of file
diff --git a/test/unit/mailer_test.rb b/test/unit/mailer_test.rb
index d92c5837b..096551ee5 100644
--- a/test/unit/mailer_test.rb
+++ b/test/unit/mailer_test.rb
@@ -18,7 +18,7 @@
 require File.dirname(__FILE__) + '/../test_helper'
 
 class MailerTest < Test::Unit::TestCase
-  fixtures :projects, :issues, :users, :members, :documents, :attachments, :tokens, :journals, :journal_details, :trackers, :issue_statuses, :enumerations
+  fixtures :projects, :issues, :users, :members, :documents, :attachments, :news, :tokens, :journals, :journal_details, :trackers, :issue_statuses, :enumerations
   
   # test mailer methods for each language
   def test_issue_add
@@ -37,18 +37,54 @@ class MailerTest < Test::Unit::TestCase
     end
   end
   
-  def test_document_add
+  def test_document_added
     document = Document.find(1)
     GLoc.valid_languages.each do |lang|
       Setting.default_language = lang.to_s
       assert Mailer.deliver_document_added(document)
     end
   end
+  
+  def test_attachments_added
+    attachements = [ Attachment.find_by_container_type('Document') ]
+    GLoc.valid_languages.each do |lang|
+      Setting.default_language = lang.to_s
+      assert Mailer.deliver_attachments_added(attachements)
+    end
+  end
+  
+  def test_news_added
+    news = News.find(:first)
+    GLoc.valid_languages.each do |lang|
+      Setting.default_language = lang.to_s
+      assert Mailer.deliver_news_added(news)
+    end
+  end
+  
+  def test_message_posted
+    message = Message.find(:first)
+    recipients = ([message.root] + message.root.children).collect {|m| m.author.mail if m.author}
+    recipients = recipients.compact.uniq
+    GLoc.valid_languages.each do |lang|
+      Setting.default_language = lang.to_s
+      assert Mailer.deliver_message_posted(message, recipients)
+    end
+  end
+  
+  def test_account_information
+    user = User.find(:first)
+    GLoc.valid_languages.each do |lang|
+      user.update_attribute :language, lang.to_s
+      user.reload
+      assert Mailer.deliver_account_information(user, 'pAsswORd')
+    end
+  end
 
   def test_lost_password
     token = Token.find(2)
     GLoc.valid_languages.each do |lang|
       token.user.update_attribute :language, lang.to_s
+      token.reload
       assert Mailer.deliver_lost_password(token)
     end
   end
@@ -57,7 +93,8 @@ class MailerTest < Test::Unit::TestCase
     token = Token.find(1)
     GLoc.valid_languages.each do |lang|
       token.user.update_attribute :language, lang.to_s
+      token.reload
       assert Mailer.deliver_register(token)
     end
   end
-end
\ No newline at end of file
+end
-- 
GitLab