##// END OF EJS Templates
Speeds up rendering of the project list for users who belong to hundreds of projects....
Speeds up rendering of the project list for users who belong to hundreds of projects. git-svn-id: http://svn.redmine.org/redmine/trunk@16123 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r15683:f30462595e83
r15741:f8df935dcada
Show More
mail_handler.rb
584 lines | 20.0 KiB | text/x-ruby | RubyLexer
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590 # Redmine - project management software
Jean-Philippe Lang
Updates copyright for 2016....
r14856 # Copyright (C) 2006-2016 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
Don't use a class variable for mail handler options....
r13846 attr_reader :email, :user, :handler_options
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 def self.receive(raw_mail, options={})
options = options.deep_dup
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 options[:issue] ||= {}
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Mail Handler: add support for allow_override=all (#20543)....
r14299 options[:allow_override] ||= []
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 if options[:allow_override].is_a?(String)
Jean-Philippe Lang
Mail Handler: add support for allow_override=all (#20543)....
r14299 options[:allow_override] = options[:allow_override].split(',')
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 end
Jean-Philippe Lang
Mail Handler: add support for allow_override=all (#20543)....
r14299 options[:allow_override].map! {|s| s.strip.downcase.gsub(/\s+/, '_')}
Jean-Philippe Lang
Mail handler: more control over issue attributes (#1110)....
r1629 # Project needs to be overridable if not specified
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 options[:allow_override] << 'project' unless options[:issue].has_key?(:project)
Toshi MARUYAMA
remove trailing white-spaces from MailHandler model source....
r5590
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 options[:no_account_notice] = (options[:no_account_notice].to_s == '1')
options[:no_notification] = (options[:no_notification].to_s == '1')
options[:no_permission_check] = (options[:no_permission_check].to_s == '1')
Jean-Philippe Lang
Merged rails-3.2 branch....
r9346
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 raw_mail.force_encoding('ASCII-8BIT')
ActiveSupport::Notifications.instrument("receive.action_mailer") do |payload|
mail = Mail.new(raw_mail)
set_payload_for_mail(payload, mail)
new.receive(mail, options)
end
Jean-Philippe Lang
Merged rails-3.2 branch....
r9346 end
Jean-Philippe Lang
Don't abort processing of emails when an email triggers a parsing exception (#16122)....
r12720 # Receives an email and rescues any exception
def self.safe_receive(*args)
receive(*args)
Jean-Philippe Lang
Misc tests....
r13352 rescue Exception => e
Jean-Philippe Lang
Fixed that some mail handler log messages are not prepended with "MailHandler:" (#21226)....
r14498 logger.error "MailHandler: an unexpected error occurred when receiving email: #{e.message}" if logger
Jean-Philippe Lang
Don't abort processing of emails when an email triggers a parsing exception (#16122)....
r12720 return false
end
Jean-Philippe Lang
Adds a method for extracting MailHandler options from ENV....
r11555 # Extracts MailHandler options from environment variables
# Use when receiving emails with rake tasks
def self.extract_options_from_env(env)
options = {:issue => {}}
Jean-Philippe Lang
Ability to define a default assigned_to when receiving emails (#23020)....
r15165 %w(project status tracker category priority assigned_to fixed_version).each do |option|
Jean-Philippe Lang
Adds a method for extracting MailHandler options from ENV....
r11555 options[:issue][option.to_sym] = env[option] if env[option]
end
Jean-Philippe Lang
Makes project selection by subaddress optional (#20732)....
r14308 %w(allow_override unknown_user no_permission_check no_account_notice default_group project_from_subaddress).each do |option|
Jean-Philippe Lang
Adds a method for extracting MailHandler options from ENV....
r11555 options[option.to_sym] = env[option] if env[option]
end
Jean-Philippe Lang
Adds private issue option to receiving emails (#8424)....
r13880 if env['private']
options[:issue][:is_private] = '1'
end
Jean-Philippe Lang
Adds a method for extracting MailHandler options from ENV....
r11555 options
end
Jean-Philippe Lang
Merged rails-3.2 branch....
r9346 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
Jean-Philippe Lang
Use accessor method....
r13847 self.ignored_emails_headers = {
Toshi MARUYAMA
ignore X-Autoreply mails (#15999, #13425)...
r13356 'Auto-Submitted' => /\Aauto-(replied|generated)/,
'X-Autoreply' => 'yes'
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
Don't use a class variable for mail handler options....
r13846 def receive(email, options={})
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 @email = email
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 @handler_options = options
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
Toshi MARUYAMA
use String#casecmp for case insensitive comparison (#20369)...
r14102 if sender_email.casecmp(Setting.mail_from.to_s.strip) == 0
Toshi MARUYAMA
remove ineffective "logger.info" and "logger.error" check from MailHandler model (#14598)...
r11843 if logger
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 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
Toshi MARUYAMA
remove ineffective "logger.info" and "logger.error" check from MailHandler model (#14598)...
r11843 if logger
Jean-Philippe Lang
Ignore emails with "Auto-Submitted: auto-*" header (#11338)....
r9741 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
remove ineffective "logger.info" and "logger.error" check from MailHandler model (#14598)...
r11843 if logger
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 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
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 case handler_options[:unknown_user]
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 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
remove ineffective "logger.info" and "logger.error" check from MailHandler model (#14598)...
r11843 if logger
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 logger.info "MailHandler: [#{@user.login}] account created"
end
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 add_user_to_group(handler_options[:default_group])
unless handler_options[:no_account_notice]
Jean-Philippe Lang
Mail handler: adds --no-account-notice option for not sending account information to the created user (#11498)....
r11295 Mailer.account_information(@user, @user.password).deliver
end
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 else
Toshi MARUYAMA
remove ineffective "logger.info" and "logger.error" check from MailHandler model (#14598)...
r11843 if logger
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 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
remove ineffective "logger.info" and "logger.error" check from MailHandler model (#14598)...
r11843 if logger
Toshi MARUYAMA
remove trailing white-spaces from app/models/mail_handler.rb...
r10897 logger.info "MailHandler: ignoring email from unknown user [#{sender_email}]"
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 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
Role-based issue custom field visibility (#5037)....
r11782 MESSAGE_ID_RE = %r{^<?redmine\.([a-z0-9_]+)\-(\d+)\.\d+(\.[a-f0-9]+)?@}
Jean-Philippe Lang
Ignore bogus issue strings like [some-string#1234] in email subjects (#17705)....
r13211 ISSUE_REPLY_SUBJECT_RE = %r{\[(?:[^\]]*\s+)?#(\d+)\]}
Jean-Philippe Lang
Allow [#id] as subject to reply by email (#3653)....
r2917 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
Jean-Philippe Lang
Fixed that some mail handler log messages are not prepended with "MailHandler:" (#21226)....
r14498 logger.error "MailHandler: #{e.message}" if logger
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 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
Don't use a class variable for mail handler options....
r13846 unless handler_options[:no_permission_check]
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 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)
Jean-Philippe Lang
Adds Issue#allowed_target_trackers (#7839)....
r15048 attributes = issue_attributes_from_keywords(issue)
if handler_options[:no_permission_check]
issue.tracker_id = attributes['tracker_id']
if project
issue.tracker_id ||= project.trackers.first.try(:id)
end
end
issue.safe_attributes = attributes
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 = {'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
Jean-Philippe Lang
Replace Date.today with User.current.today (#22320)....
r14997 issue.start_date ||= User.current.today if Setting.default_issue_start_date_to_creation_date?
Jean-Philippe Lang
Adds private issue option to receiving emails (#8424)....
r13880 issue.is_private = (handler_options[:issue][:is_private] == '1')
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)
Toshi MARUYAMA
remove ineffective "logger.info" and "logger.error" check from MailHandler model (#14598)...
r11843 logger.info "MailHandler: issue ##{issue.id} created by #{user}" if logger
Jean-Philippe Lang
Adds basic support for issue creation via email (#1110)....
r1554 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
Don't use a class variable for mail handler options....
r13846 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
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 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
Add watchers from To and Cc fields in issue replies (#7017)....
r14710
# add To and Cc as watchers before saving so the watchers can reply to Redmine
add_watchers(issue)
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
remove ineffective "logger.info" and "logger.error" check from MailHandler model (#14598)...
r11843 if logger
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 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
Don't use a class variable for mail handler options....
r13846 unless handler_options[:no_permission_check]
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 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
remove ineffective "logger.info" and "logger.error" check from MailHandler model (#14598)...
r11843 if logger
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 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|
Jean-Philippe Lang
Exclude attachments from incoming emails based on file name (#3413)....
r11937 next unless accept_attachment?(attachment)
Jean-Philippe Lang
Fixed: MailHandler does not include JournalDetail for attached files (#7966)....
r6192 obj.attachments << Attachment.create(:container => obj,
Toshi MARUYAMA
fix received mail text attachment does not keep original encoding on Ruby >= 2.1 (#21742)...
r14802 :file => attachment.body.decoded,
Toshi MARUYAMA
fix broken tests on Rails 3.2.13 with Ruby 1.8 (#12399, #12375)...
r11420 :filename => attachment.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
Exclude attachments from incoming emails based on file name (#3413)....
r11937 # Returns false if the +attachment+ of the incoming email should be ignored
def accept_attachment?(attachment)
@excluded ||= Setting.mail_handler_excluded_filenames.to_s.split(',').map(&:strip).reject(&:blank?)
@excluded.each do |pattern|
regexp = %r{\A#{Regexp.escape(pattern).gsub("\\*", ".*")}\z}i
if attachment.filename.to_s =~ regexp
logger.info "MailHandler: ignoring attachment #{attachment.filename} matching #{pattern}"
return false
end
end
true
end
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)
Jean-Philippe Lang
Don't check permission to add watchers if no_permission_check option is set (#7017)....
r14711 if handler_options[:no_permission_check] || user.allowed_to?("add_#{obj.class.name.underscore}_watchers".to_sym, obj.project)
Jean-Philippe Lang
Adds To and Cc as watchers when submitting an issue by email (#2245)....
r2075 addresses = [email.to, email.cc].flatten.compact.uniq.collect {|a| a.strip.downcase}
unless addresses.empty?
Jean-Philippe Lang
Add watchers from To and Cc fields in issue replies (#7017)....
r14710 users = User.active.having_mail(addresses).to_a
users -= obj.watcher_users
users.each do |u|
obj.add_watcher(u)
Toshi MARUYAMA
remove unneeded Relation#all from MailHandler#add_watchers...
r12267 end
Jean-Philippe Lang
Adds To and Cc as watchers when submitting an issue by email (#2245)....
r2075 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
Jean-Philippe Lang
Mail Handler: add support for allow_override=all (#20543)....
r14299 override = options.key?(:override) ?
options[:override] :
(handler_options[:allow_override] & [attr.to_s.downcase.gsub(/\s+/, '_'), 'all']).present?
if override && (v = extract_keyword!(cleaned_up_text_body, attr, options[:format]))
Jean-Philippe Lang
Makes MailHandler accept localized keywords for default or user language (#6112)....
r4281 v
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 elsif !handler_options[:issue][attr].blank?
handler_options[:issue][attr]
Jean-Philippe Lang
Strip keywords from received email body (#2436)....
r2365 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
Jean-Philippe Lang
Ignore email keywords after truncation line (#8758)....
r13050 text.sub!(regexp, '')
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447 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
Jean-Philippe Lang
MailHandler: Select project by subaddress (redmine+project@example.com) (#20732)....
r14305 def get_project_from_receiver_addresses
Jean-Philippe Lang
Makes project selection by subaddress optional (#20732)....
r14308 local, domain = handler_options[:project_from_subaddress].to_s.split("@")
return nil unless local && domain
local = Regexp.escape(local)
Jean-Philippe Lang
MailHandler: Select project by subaddress (redmine+project@example.com) (#20732)....
r14305 [:to, :cc, :bcc].each do |field|
header = @email[field]
next if header.blank? || header.field.blank? || !header.field.respond_to?(:addrs)
header.field.addrs.each do |addr|
Jean-Philippe Lang
Makes project selection by subaddress optional (#20732)....
r14308 if addr.domain.to_s.casecmp(domain)==0 && addr.local.to_s =~ /\A#{local}\+([^+]+)\z/
Jean-Philippe Lang
MailHandler: Select project by subaddress (redmine+project@example.com) (#20732)....
r14305 if project = Project.find_by_identifier($1)
return project
end
end
end
end
nil
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)
Jean-Philippe Lang
MailHandler: Select project by subaddress (redmine+project@example.com) (#20732)....
r14305 target = get_project_from_receiver_addresses
target ||= Project.find_by_identifier(get_keyword(:project))
Jean-Philippe Lang
Use the default project when receiving an email with an invalid project keyword (#14491)....
r11837 if target.nil?
# Invalid project keyword, use the project specified as the default one
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 default_project = handler_options[:issue][:project]
Jean-Philippe Lang
Use the default project when receiving an email with an invalid project keyword (#14491)....
r11837 if default_project.present?
target = Project.find_by_identifier(default_project)
end
end
Jean-Philippe Lang
Makes MailHandler accept all issue attributes and custom fields that can be set/updated (#4071, #4807, #5622, #6110)....
r4280 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
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
Mail handler: no attributes overridable by default (#20543)....
r14298 'assigned_to_id' => (k = get_keyword(:assigned_to)) && find_assignee_from_keyword(k, issue).try(:id),
'fixed_version_id' => (k = get_keyword(:fixed_version)) && issue.project.shared_versions.named(k).first.try(:id),
'start_date' => get_keyword(:start_date, :format => '\d{4}-\d{2}-\d{2}'),
'due_date' => get_keyword(:due_date, :format => '\d{4}-\d{2}-\d{2}'),
'estimated_hours' => get_keyword(:estimated_hours),
'done_ratio' => get_keyword(:done_ratio, :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 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
Mail handler: no attributes overridable by default (#20543)....
r14298 if keyword = get_keyword(v.custom_field.name)
Jean-Philippe Lang
Fixed: Custom fields of type version not proper handled in receiving e-mails (#11571)....
r9974 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
Jean-Philippe Lang
Fix handling multiple text parts in email (#13646)....
r11604 parts = if (text_parts = email.all_parts.select {|p| p.mime_type == 'text/plain'}).present?
text_parts
elsif (html_parts = email.all_parts.select {|p| p.mime_type == 'text/html'}).present?
html_parts
else
[email]
end
Jean-Philippe Lang
Fixed that text/plain attachments are added to issue description (#15684)....
r12145
parts.reject! do |part|
Jean-Philippe Lang
Merged rails-4.1 branch (#14534)....
r13100 part.attachment?
Jean-Philippe Lang
Fixed that text/plain attachments are added to issue description (#15684)....
r12145 end
Toshi MARUYAMA
support more character encoding in incoming emails (#15785)...
r12199 @plain_text_body = parts.map do |p|
Toshi MARUYAMA
MailHandler: Don't use String#respond_to?(:force_encoding) (#18047)...
r13067 body_charset = Mail::RubyVer.respond_to?(:pick_encoding) ?
Toshi MARUYAMA
support more character encoding in incoming emails (#15785)...
r12199 Mail::RubyVer.pick_encoding(p.charset).to_s : p.charset
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447
Jean-Philippe Lang
Better handle html-only emails (#16962)....
r13931 body = Redmine::CodesetUtil.to_utf8(p.body.decoded, body_charset)
# convert html parts to text
Jean-Philippe Lang
Strip leading spaces to prevent lines from being rendered as pre tags....
r13936 p.mime_type == 'text/html' ? self.class.html_body_to_text(body) : self.class.plain_text_body_to_text(body)
Jean-Philippe Lang
Better handle html-only emails (#16962)....
r13931 end.join("\r\n")
Jean-Philippe Lang
Fix handling multiple text parts in email (#13646)....
r11604
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
Jean-Philippe Lang
Ignore email keywords after truncation line (#8758)....
r13050 @cleaned_up_text_body ||= cleanup_body(plain_text_body)
Jean-Philippe Lang
Adds a setting to remove incoming emails body after a delimiter (#4409)....
r3112 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
subject.strip[0,255]
end
Jean-Philippe Lang
Better handle html-only emails (#16962)....
r13931 # Converts a HTML email body to text
def self.html_body_to_text(html)
Redmine::WikiFormatting.html_parser.to_text(html)
end
Jean-Philippe Lang
Strip leading spaces to prevent lines from being rendered as pre tags....
r13936 # Converts a plain/text email body to text
def self.plain_text_body_to_text(text)
# Removes leading spaces that would cause the line to be rendered as
# preformatted text with textile
text.gsub(/^ +(?![*#])/, '')
end
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
Jean-Philippe Lang
Test broken by r11392 (#13174)....
r11165 assign_string_attribute_with_limit(user, 'firstname', names.shift, 30)
assign_string_attribute_with_limit(user, 'lastname', names.join(' '), 30)
Jean-Philippe Lang
Improved user creation from incoming email....
r7832 user.lastname = '-' if user.lastname.blank?
user.language = Setting.default_language
Jean-Philippe Lang
Use User#generate_password in MailHandler....
r11227 user.generate_password = true
Jean-Philippe Lang
Mail handler: set mail_notification to only_my_events when creating a new user (#13341)....
r11360 user.mail_notification = 'only_my_events'
Jean-Philippe Lang
Improved user creation from incoming email....
r7832
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?
Jean-Philippe Lang
Test broken by r11392 (#13174)....
r11165 (puts user.errors[:lastname];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
Don't use a class variable for mail handler options....
r13846 if handler_options[:no_notification]
Jean-Philippe Lang
Mail handler: adds --no-notification option to disable notifications to the created user (#13341)....
r11296 user.mail_notification = 'none'
end
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
Toshi MARUYAMA
replace tab to space at app/models/mail_handler.rb...
r11413 # Adds the newly created user to default group
Jean-Philippe Lang
Mail handler: adds --default-group option to add created user to one or more groups (#13340)....
r11292 def add_user_to_group(default_group)
if default_group.present?
default_group.split(',').each do |group_name|
if group = Group.named(group_name).first
group.users << @user
elsif logger
logger.warn "MailHandler: could not add user to [#{group_name}], group not found"
end
end
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)
Jean-Philippe Lang
Optional Regex delimiters to truncate incoming emails (#5864)....
r15683 delimiters = Setting.mail_handler_body_delimiters.to_s.split(/[\r\n]+/).reject(&:blank?)
if Setting.mail_handler_enable_regex_delimiters?
begin
delimiters = delimiters.map {|s| Regexp.new(s)}
rescue RegexpError => e
logger.error "MailHandler: invalid regexp delimiter found in mail_handler_body_delimiters setting (#{e.message})" if logger
end
end
Jean-Philippe Lang
Adds a setting to remove incoming emails body after a delimiter (#4409)....
r3112 unless delimiters.empty?
Jean-Philippe Lang
Optional Regex delimiters to truncate incoming emails (#5864)....
r15683 regex = Regexp.new("^[> ]*(#{ Regexp.union(delimiters) })\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)
Jean-Philippe Lang
Moved implementation to Principal....
r14118 Principal.detect_by_keyword(issue.assignable_users, keyword)
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