##// END OF EJS Templates
Update the issue subject when choosing an issue from the drop down menu....
Update the issue subject when choosing an issue from the drop down menu. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11083 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r10701:31c33f462d92
r10853:6be315c1ff8e
Show More
mail_handler.rb
498 lines | 17.3 KiB | text/x-ruby | RubyLexer
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590 # Redmine - project management software
Jean-Philippe Lang
Copyright update....
r9453 # Copyright (C) 2006-2012 Jean-Philippe Lang
Jean-Philippe Lang
Added a simple mail handler....
r520 #
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
Toshi MARUYAMA
remove trailing white-spaces from mail handler model source....
r5695 #
Jean-Philippe Lang
Added a simple mail handler....
r520 # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
Toshi MARUYAMA
remove trailing white-spaces from mail handler model source....
r5695 #
Jean-Philippe Lang
Added a simple mail handler....
r520 # You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447 class MailHandler < ActionMailer::Base
Jean-Philippe Lang
Mail handler: strip tags when receiving a html-only email (#2312)....
r2134 include ActionView::Helpers::SanitizeHelper
Jean-Philippe Lang
Makes MailHandler accept localized keywords for default or user language (#6112)....
r4281 include Redmine::I18n
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554
class UnauthorizedAction < StandardError; end
class MissingInformation < StandardError; end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 attr_reader :email, :user
def self.receive(email, options={})
Jean-Philippe Lang
Mail handler: more control over issue attributes (#1110)....
r1629 @@handler_options = options.dup
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Mail handler: more control over issue attributes (#1110)....
r1629 @@handler_options[:issue] ||= {}
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 if @@handler_options[:allow_override].is_a?(String)
@@handler_options[:allow_override] = @@handler_options[:allow_override].split(',').collect(&:strip)
end
Jean-Philippe Lang
Mail handler: more control over issue attributes (#1110)....
r1629 @@handler_options[:allow_override] ||= []
# Project needs to be overridable if not specified
@@handler_options[:allow_override] << 'project' unless @@handler_options[:issue].has_key?(:project)
Jean-Philippe Lang
Mail handler: check workflow for status set/change....
r2072 # Status overridable by default
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590 @@handler_options[:allow_override] << 'status' unless @@handler_options[:issue].has_key?(:status)
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 @@handler_options[:no_permission_check] = (@@handler_options[:no_permission_check].to_s == '1' ? true : false)
Jean-Philippe Lang
Merged rails-3.2 branch....
r9346
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447 email.force_encoding('ASCII-8BIT') if email.respond_to?(:force_encoding)
super(email)
Jean-Philippe Lang
Merged rails-3.2 branch....
r9346 end
def logger
Rails.logger
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Ignore emails with Auto-Submitted: auto-replied header (#10607)....
r9256 cattr_accessor :ignored_emails_headers
@@ignored_emails_headers = {
Jean-Philippe Lang
Ignore emails with "Auto-Submitted: auto-*" header (#11338)....
r9741 'X-Auto-Response-Suppress' => 'oof',
'Auto-Submitted' => /^auto-/
Jean-Philippe Lang
Ignore emails with Auto-Submitted: auto-replied header (#10607)....
r9256 }
Jean-Philippe Lang
Added a simple mail handler....
r520 # Processes incoming emails
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 # Returns the created object (eg. an issue, a message) or false
Jean-Philippe Lang
Added a simple mail handler....
r520 def receive(email)
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 @email = email
Jean-Philippe Lang
Ignore emails received from the application emission address to avoid hell cycles (#4139)....
r2908 sender_email = email.from.to_a.first.to_s.strip
# Ignore emails received from the application emission address to avoid hell cycles
if sender_email.downcase == Setting.mail_from.to_s.strip.downcase
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 if logger && logger.info
logger.info "MailHandler: ignoring email from Redmine emission address [#{sender_email}]"
end
Jean-Philippe Lang
Ignore emails received from the application emission address to avoid hell cycles (#4139)....
r2908 return false
end
Jean-Philippe Lang
Ignore emails with Auto-Submitted: auto-replied header (#10607)....
r9256 # Ignore auto generated emails
self.class.ignored_emails_headers.each do |key, ignored_value|
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447 value = email.header[key]
Jean-Philippe Lang
Ignore emails with "Auto-Submitted: auto-*" header (#11338)....
r9741 if value
value = value.to_s.downcase
if (ignored_value.is_a?(Regexp) && value.match(ignored_value)) || value == ignored_value
if logger && logger.info
logger.info "MailHandler: ignoring email with #{key}:#{value} header"
end
return false
Jean-Philippe Lang
Ignore emails with Auto-Submitted: auto-replied header (#10607)....
r9256 end
Jean-Philippe Lang
Makes the mail handler ignore out-of-office emails (#10607)....
r9224 end
end
Eric Davis
Accept email from anonymous users with an empty from address. #5604...
r3669 @user = User.find_by_mail(sender_email) if sender_email.present?
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 if @user && !@user.active?
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 if logger && logger.info
logger.info "MailHandler: ignoring email from non-active user [#{@user.login}]"
end
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 return false
end
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 if @user.nil?
# Email was submitted by an unknown user
case @@handler_options[:unknown_user]
when 'accept'
@user = User.anonymous
when 'create'
Toshi MARUYAMA
remove redundant "email" parameter from MailHandler#create_user_from_email...
r8401 @user = create_user_from_email
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 if @user
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 if logger && logger.info
logger.info "MailHandler: [#{@user.login}] account created"
end
Toshi MARUYAMA
replace Mailer deliver syntax to Rails3 style...
r9455 Mailer.account_information(@user, @user.password).deliver
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 else
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 if logger && logger.error
logger.error "MailHandler: could not create account for [#{sender_email}]"
end
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 return false
end
else
# Default behaviour, emails from unknown users are ignored
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 if logger && logger.info
logger.info "MailHandler: ignoring email from unknown user [#{sender_email}]"
end
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 return false
end
end
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 User.current = @user
dispatch
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 private
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447 MESSAGE_ID_RE = %r{^<?redmine\.([a-z0-9_]+)\-(\d+)\.\d+@}
Jean-Philippe Lang
Allow [#id] as subject to reply by email (#3653)....
r2917 ISSUE_REPLY_SUBJECT_RE = %r{\[[^\]]*#(\d+)\]}
MESSAGE_REPLY_SUBJECT_RE = %r{\[[^\]]*msg(\d+)\]}
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 def dispatch
Jean-Philippe Lang
Use In-Reply-To and References headers to handle replies by email....
r2286 headers = [email.in_reply_to, email.references].flatten.compact
Jean-Philippe Lang
Fixed that MailHandler raises an error when email has no subject header (#12396)....
r10623 subject = email.subject.to_s
Jean-Philippe Lang
Use In-Reply-To and References headers to handle replies by email....
r2286 if headers.detect {|h| h.to_s =~ MESSAGE_ID_RE}
klass, object_id = $1, $2.to_i
method_name = "receive_#{klass}_reply"
Jean-Philippe Lang
Fixes MailHandler for ruby1.9....
r2801 if self.class.private_instance_methods.collect(&:to_s).include?(method_name)
Jean-Philippe Lang
Use In-Reply-To and References headers to handle replies by email....
r2286 send method_name, object_id
else
# ignoring it
end
Jean-Philippe Lang
Fixed that MailHandler raises an error when email has no subject header (#12396)....
r10623 elsif m = subject.match(ISSUE_REPLY_SUBJECT_RE)
Jean-Philippe Lang
Use In-Reply-To and References headers to handle replies by email....
r2286 receive_issue_reply(m[1].to_i)
Jean-Philippe Lang
Fixed that MailHandler raises an error when email has no subject header (#12396)....
r10623 elsif m = subject.match(MESSAGE_REPLY_SUBJECT_RE)
Jean-Philippe Lang
Accept replies to forum messages by subject recognition (#1616)....
r2292 receive_message_reply(m[1].to_i)
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 else
Jean-Baptiste Barth
Introduced MailHandler#dispatch_to_default method to make MailHandler more extensible. #7598...
r4700 dispatch_to_default
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 end
rescue ActiveRecord::RecordInvalid => e
# TODO: send a email to the user
logger.error e.message if logger
false
rescue MissingInformation => e
logger.error "MailHandler: missing information from #{user}: #{e.message}" if logger
false
rescue UnauthorizedAction => e
logger.error "MailHandler: unauthorized attempt from #{user}" if logger
false
end
Jean-Baptiste Barth
Introduced MailHandler#dispatch_to_default method to make MailHandler more extensible. #7598...
r4700
def dispatch_to_default
receive_issue
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 # Creates a new issue
def receive_issue
project = target_project
# check permission
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 unless @@handler_options[:no_permission_check]
raise UnauthorizedAction unless user.allowed_to?(:add_issues, project)
end
Eric Davis
Add 'Start date' and 'End date' keywords for incoming email. #5595...
r3649
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280 issue = Issue.new(:author => user, :project => project)
issue.safe_attributes = issue_attributes_from_keywords(issue)
issue.safe_attributes = {'custom_field_values' => custom_field_values_from_keywords(issue)}
Jean-Philippe Lang
Fixed: German umlauts in Subject get striped with ruby1.8 (#11065)....
r9613 issue.subject = cleaned_up_subject
Jean-Philippe Lang
Email handler: set a default issue subject if the email subject is blank (#3850)....
r2759 if issue.subject.blank?
issue.subject = '(no subject)'
end
Jean-Philippe Lang
Adds a setting to remove incoming emails body after a delimiter (#4409)....
r3112 issue.description = cleaned_up_text_body
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Eric Davis
Added observers to watch model objects for mail delivery instead of calling Mailer....
r2548 # add To and Cc as watchers before saving so the watchers can reply to Redmine
add_watchers(issue)
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 issue.save!
add_attachments(issue)
logger.info "MailHandler: issue ##{issue.id} created by #{user}" if logger && logger.info
issue
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 # Adds a note to an existing issue
Jean-Philippe Lang
Private issue notes (#1554)....
r10336 def receive_issue_reply(issue_id, from_journal=nil)
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 issue = Issue.find_by_id(issue_id)
Jean-Philippe Lang
Added a simple mail handler....
r520 return unless issue
# check permission
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 unless @@handler_options[:no_permission_check]
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 unless user.allowed_to?(:add_issue_notes, issue.project) ||
user.allowed_to?(:edit_issues, issue.project)
raise UnauthorizedAction
end
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Fixed: CLI-supplied defaults should not be applied when replying to an issue (#7195)....
r4462 # ignore CLI-supplied defaults for new issues
@@handler_options[:issue].clear
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Fixed: mail handler keywords are not removed when updating issues (#7785)....
r4985 journal = issue.init_journal(user)
Jean-Philippe Lang
Private issue notes (#1554)....
r10336 if from_journal && from_journal.private_notes?
# If the received email was a reply to a private note, make the added note private
issue.private_notes = true
end
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280 issue.safe_attributes = issue_attributes_from_keywords(issue)
issue.safe_attributes = {'custom_field_values' => custom_field_values_from_keywords(issue)}
Jean-Philippe Lang
Fixed: mail handler keywords are not removed when updating issues (#7785)....
r4985 journal.notes = cleaned_up_text_body
Jean-Philippe Lang
Fixes reply attachments handling....
r1556 add_attachments(issue)
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 issue.save!
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 if logger && logger.info
logger.info "MailHandler: issue ##{issue.id} updated by #{user}"
end
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 journal
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Use In-Reply-To and References headers to handle replies by email....
r2286 # Reply will be added to the issue
def receive_journal_reply(journal_id)
journal = Journal.find_by_id(journal_id)
if journal && journal.journalized_type == 'Issue'
Jean-Philippe Lang
Private issue notes (#1554)....
r10336 receive_issue_reply(journal.journalized_id, journal)
Jean-Philippe Lang
Use In-Reply-To and References headers to handle replies by email....
r2286 end
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Allow email to reply to a forum message (#1616)....
r2287 # Receives a reply to a forum message
def receive_message_reply(message_id)
message = Message.find_by_id(message_id)
if message
message = message.root
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 unless @@handler_options[:no_permission_check]
raise UnauthorizedAction unless user.allowed_to?(:add_messages, message.project)
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 if !message.locked?
Jean-Philippe Lang
Fixed: German umlauts in Subject get striped with ruby1.8 (#11065)....
r9613 reply = Message.new(:subject => cleaned_up_subject.gsub(%r{^.*msg\d+\]}, '').strip,
Jean-Philippe Lang
Adds a setting to remove incoming emails body after a delimiter (#4409)....
r3112 :content => cleaned_up_text_body)
Jean-Philippe Lang
Allow email to reply to a forum message (#1616)....
r2287 reply.author = user
reply.board = message.board
message.children << reply
add_attachments(reply)
reply
else
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 if logger && logger.info
logger.info "MailHandler: ignoring reply from [#{sender_email}] to a locked topic"
end
Jean-Philippe Lang
Allow email to reply to a forum message (#1616)....
r2287 end
end
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 def add_attachments(obj)
Jean-Philippe Lang
Fixes mail handler for when there's no attachments (#8651)....
r6205 if email.attachments && email.attachments.any?
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 email.attachments.each do |attachment|
Toshi MARUYAMA
fix non ASCII attachment filename encoding broken (MOJIBAKE) in receiving mail on Ruby 1.8 (#12399)...
r10625 filename = attachment.filename
unless filename.respond_to?(:encoding)
# try to reencode to utf8 manually with ruby1.8
h = attachment.header['Content-Disposition']
unless h.nil?
begin
if m = h.value.match(/filename\*[0-9\*]*=([^=']+)'/)
filename = Redmine::CodesetUtil.to_utf8(filename, m[1])
elsif m = h.value.match(/filename=.*=\?([^\?]+)\?[BbQq]\?/)
# http://tools.ietf.org/html/rfc2047#section-4
filename = Redmine::CodesetUtil.to_utf8(filename, m[1])
end
rescue
# nop
end
end
end
Jean-Philippe Lang
Fixed: MailHandler does not include JournalDetail for attached files (#7966)....
r6192 obj.attachments << Attachment.create(:container => obj,
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447 :file => attachment.decoded,
Toshi MARUYAMA
fix non ASCII attachment filename encoding broken (MOJIBAKE) in receiving mail on Ruby 1.8 (#12399)...
r10625 :filename => filename,
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 :author => user,
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447 :content_type => attachment.mime_type)
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 end
end
Jean-Philippe Lang
Added a simple mail handler....
r520 end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Adds To and Cc as watchers when submitting an issue by email (#2245)....
r2075 # Adds To and Cc as watchers of the given object if the sender has the
# appropriate permission
def add_watchers(obj)
if user.allowed_to?("add_#{obj.class.name.underscore}_watchers".to_sym, obj.project)
addresses = [email.to, email.cc].flatten.compact.uniq.collect {|a| a.strip.downcase}
unless addresses.empty?
Jean-Philippe Lang
Replaces find(:all) calls....
r10690 watchers = User.active.where('LOWER(mail) IN (?)', addresses).all
Jean-Philippe Lang
Adds To and Cc as watchers when submitting an issue by email (#2245)....
r2075 watchers.each {|w| obj.add_watcher(w)}
end
end
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Import custom fields values from emails (#2413)....
r2209 def get_keyword(attr, options={})
Jean-Philippe Lang
Strip keywords from received email body (#2436)....
r2365 @keywords ||= {}
if @keywords.has_key?(attr)
@keywords[attr]
else
@keywords[attr] = begin
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8624 if (options[:override] || @@handler_options[:allow_override].include?(attr.to_s)) &&
(v = extract_keyword!(plain_text_body, attr, options[:format]))
Jean-Philippe Lang
Makes MailHandler accept localized keywords for default or user language (#6112)....
r4281 v
Jean-Philippe Lang
Strip keywords from received email body (#2436)....
r2365 elsif !@@handler_options[:issue][attr].blank?
@@handler_options[:issue][attr]
end
end
Jean-Philippe Lang
Mail handler: more control over issue attributes (#1110)....
r1629 end
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Makes MailHandler accept localized keywords for default or user language (#6112)....
r4281 # Destructively extracts the value for +attr+ in +text+
# Returns nil if no matching keyword found
Jean-Philippe Lang
Makes MailHandler ignore invalid keyword values to avoid validation failures....
r4282 def extract_keyword!(text, attr, format=nil)
Jean-Philippe Lang
Makes MailHandler accept localized keywords for default or user language (#6112)....
r4281 keys = [attr.to_s.humanize]
if attr.is_a?(Symbol)
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 if user && user.language.present?
keys << l("field_#{attr}", :default => '', :locale => user.language)
end
if Setting.default_language.present?
keys << l("field_#{attr}", :default => '', :locale => Setting.default_language)
end
Jean-Philippe Lang
Makes MailHandler accept localized keywords for default or user language (#6112)....
r4281 end
keys.reject! {|k| k.blank?}
keys.collect! {|k| Regexp.escape(k)}
Jean-Philippe Lang
Makes MailHandler ignore invalid keyword values to avoid validation failures....
r4282 format ||= '.+'
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447 keyword = nil
regexp = /^(#{keys.join('|')})[ \t]*:[ \t]*(#{format})\s*$/i
if m = text.match(regexp)
keyword = m[2].strip
text.gsub!(regexp, '')
end
keyword
Jean-Philippe Lang
Makes MailHandler accept localized keywords for default or user language (#6112)....
r4281 end
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280
def target_project
# TODO: other ways to specify project:
# * parse the email To field
# * specific project (eg. Setting.mail_handler_target_project)
target = Project.find_by_identifier(get_keyword(:project))
raise MissingInformation.new('Unable to determine target project') if target.nil?
target
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280 # Returns a Hash of issue attributes extracted from keywords in the email body
def issue_attributes_from_keywords(issue)
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 assigned_to = (k = get_keyword(:assigned_to, :override => true)) && find_assignee_from_keyword(k, issue)
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Fixed: Tracker reset to default when replying to an issue email (#7197)....
r4461 attrs = {
Jean-Philippe Lang
Fixed: Setting issue attributes from mail should be case-insensitive (#8759)....
r6079 'tracker_id' => (k = get_keyword(:tracker)) && issue.project.trackers.named(k).first.try(:id),
'status_id' => (k = get_keyword(:status)) && IssueStatus.named(k).first.try(:id),
'priority_id' => (k = get_keyword(:priority)) && IssuePriority.named(k).first.try(:id),
'category_id' => (k = get_keyword(:category)) && issue.project.issue_categories.named(k).first.try(:id),
Jean-Philippe Lang
MailHandler: ignore assignee if invalid....
r4290 'assigned_to_id' => assigned_to.try(:id),
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8624 'fixed_version_id' => (k = get_keyword(:fixed_version, :override => true)) &&
issue.project.shared_versions.named(k).first.try(:id),
Jean-Philippe Lang
Makes MailHandler ignore invalid keyword values to avoid validation failures....
r4282 'start_date' => get_keyword(:start_date, :override => true, :format => '\d{4}-\d{2}-\d{2}'),
'due_date' => get_keyword(:due_date, :override => true, :format => '\d{4}-\d{2}-\d{2}'),
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280 'estimated_hours' => get_keyword(:estimated_hours, :override => true),
Jean-Philippe Lang
Makes MailHandler ignore invalid keyword values to avoid validation failures....
r4282 'done_ratio' => get_keyword(:done_ratio, :override => true, :format => '(\d|10)?0')
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280 }.delete_if {|k, v| v.blank? }
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Fixed: Tracker reset to default when replying to an issue email (#7197)....
r4461 if issue.new_record? && attrs['tracker_id'].nil?
Jean-Philippe Lang
Replaces find(:first) calls....
r10701 attrs['tracker_id'] = issue.project.trackers.first.try(:id)
Jean-Philippe Lang
Fixed: Tracker reset to default when replying to an issue email (#7197)....
r4461 end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Fixed: Tracker reset to default when replying to an issue email (#7197)....
r4461 attrs
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280 end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280 # Returns a Hash of issue custom field values extracted from keywords in the email body
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590 def custom_field_values_from_keywords(customized)
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280 customized.custom_field_values.inject({}) do |h, v|
Jean-Philippe Lang
Fixed: Custom fields of type version not proper handled in receiving e-mails (#11571)....
r9974 if keyword = get_keyword(v.custom_field.name, :override => true)
h[v.custom_field.id.to_s] = v.custom_field.value_from_keyword(keyword, customized)
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280 end
h
end
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Mail handler: strip tags when receiving a html-only email (#2312)....
r2134 # Returns the text/plain part of the email
# If not found (eg. HTML-only email), returns the body with tags removed
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 def plain_text_body
return @plain_text_body unless @plain_text_body.nil?
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447
part = email.text_part || email.html_part || email
@plain_text_body = Redmine::CodesetUtil.to_utf8(part.body.decoded, part.charset)
# strip html tags and remove doctype directive
@plain_text_body = strip_tags(@plain_text_body.strip)
@plain_text_body.sub! %r{^<!DOCTYPE .*$}, ''
Jean-Philippe Lang
Fixed that MailHandler#plain_text_body was returning nil if there was nothing to strip (#2814)....
r2456 @plain_text_body
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Adds a setting to remove incoming emails body after a delimiter (#4409)....
r3112 def cleaned_up_text_body
cleanup_body(plain_text_body)
end
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430
Jean-Philippe Lang
Fixed: German umlauts in Subject get striped with ruby1.8 (#11065)....
r9613 def cleaned_up_subject
subject = email.subject.to_s
unless subject.respond_to?(:encoding)
# try to reencode to utf8 manually with ruby1.8
begin
if h = email.header[:subject]
Toshi MARUYAMA
fix receiving mail subject broken which does not begin with encoding name (#12375)...
r10585 # http://tools.ietf.org/html/rfc2047#section-4
if m = h.value.match(/=\?([^\?]+)\?[BbQq]\?/)
Jean-Philippe Lang
Fixed: German umlauts in Subject get striped with ruby1.8 (#11065)....
r9613 subject = Redmine::CodesetUtil.to_utf8(subject, m[1])
end
end
rescue
# nop
end
end
subject.strip[0,255]
end
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430 def self.full_sanitizer
@full_sanitizer ||= HTML::FullSanitizer.new
end
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Increase username length limit from 30 to 60 (#2719)....
r8658 def self.assign_string_attribute_with_limit(object, attribute, value, limit=nil)
limit ||= object.class.columns_hash[attribute.to_s].limit || 255
Jean-Philippe Lang
Improved user creation from incoming email....
r7832 value = value.to_s.slice(0, limit)
object.send("#{attribute}=", value)
end
# Returns a User from an email address and a full name
def self.new_user_from_attributes(email_address, fullname=nil)
user = User.new
# Truncating the email address would result in an invalid format
user.mail = email_address
Jean-Philippe Lang
Increase username length limit from 30 to 60 (#2719)....
r8658 assign_string_attribute_with_limit(user, 'login', email_address, User::LOGIN_LENGTH_LIMIT)
Jean-Philippe Lang
Improved user creation from incoming email....
r7832
names = fullname.blank? ? email_address.gsub(/@.*$/, '').split('.') : fullname.split
assign_string_attribute_with_limit(user, 'firstname', names.shift)
assign_string_attribute_with_limit(user, 'lastname', names.join(' '))
user.lastname = '-' if user.lastname.blank?
password_length = [Setting.password_min_length.to_i, 10].max
Jean-Philippe Lang
Adds Redmine::Utils.random_hex for generating a random hex string....
r8951 user.password = Redmine::Utils.random_hex(password_length / 2 + 1)
Jean-Philippe Lang
Improved user creation from incoming email....
r7832 user.language = Setting.default_language
unless user.valid?
Jean-Philippe Lang
Adds Redmine::Utils.random_hex for generating a random hex string....
r8951 user.login = "user#{Redmine::Utils.random_hex(6)}" unless user.errors[:login].blank?
Toshi MARUYAMA
Rails3: replace deprecated Errors#on to Errors#[] at app/models/mail_handler.rb...
r8400 user.firstname = "-" unless user.errors[:firstname].blank?
user.lastname = "-" unless user.errors[:lastname].blank?
Jean-Philippe Lang
Improved user creation from incoming email....
r7832 end
user
end
# Creates a User for the +email+ sender
# Returns the user or nil if it could not be created
Toshi MARUYAMA
remove redundant "email" parameter from MailHandler#create_user_from_email...
r8401 def create_user_from_email
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447 from = email.header['from'].to_s
addr, name = from, nil
if m = from.match(/^"?(.+?)"?\s+<(.+@.+)>$/)
addr, name = m[2], m[1]
end
if addr.present?
user = self.class.new_user_from_attributes(addr, name)
Jean-Philippe Lang
Improved user creation from incoming email....
r7832 if user.save
user
else
logger.error "MailHandler: failed to create User: #{user.errors.full_messages}" if logger
nil
end
else
logger.error "MailHandler: failed to create User: no FROM address found" if logger
nil
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 end
end
Jean-Philippe Lang
Adds a setting to remove incoming emails body after a delimiter (#4409)....
r3112
# Removes the email body of text after the truncation configurations.
def cleanup_body(body)
delimiters = Setting.mail_handler_body_delimiters.to_s.split(/[\r\n]+/).reject(&:blank?).map {|s| Regexp.escape(s)}
unless delimiters.empty?
Eric Davis
Remove email quotes (>) when searching for incoming email delimiters. #2852 #6628...
r4247 regex = Regexp.new("^[> ]*(#{ delimiters.join('|') })\s*[\r\n].*", Regexp::MULTILINE)
Jean-Philippe Lang
Adds a setting to remove incoming emails body after a delimiter (#4409)....
r3112 body = body.gsub(regex, '')
end
body.strip
end
Toshi MARUYAMA
remove trailing white-spaces from app/models/mail_handler.rb....
r6757
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 def find_assignee_from_keyword(keyword, issue)
keyword = keyword.to_s.downcase
assignable = issue.assignable_users
assignee = nil
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 assignee ||= assignable.detect {|a|
a.mail.to_s.downcase == keyword ||
a.login.to_s.downcase == keyword
}
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 if assignee.nil? && keyword.match(/ /)
Eric Davis
Add an "Assigned To" keyword to receiving email. #5594...
r3650 firstname, lastname = *(keyword.split) # "First Last Throwaway"
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 assignee ||= assignable.detect {|a|
a.is_a?(User) && a.firstname.to_s.downcase == firstname &&
a.lastname.to_s.downcase == lastname
}
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 end
if assignee.nil?
Jean-Philippe Lang
MailHandler: Match assignee on the full display name (#11552)....
r10053 assignee ||= assignable.detect {|a| a.name.downcase == keyword}
Eric Davis
Add an "Assigned To" keyword to receiving email. #5594...
r3650 end
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 assignee
Eric Davis
Add an "Assigned To" keyword to receiving email. #5594...
r3650 end
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 end