##// END OF EJS Templates
[#20288] Update styles to match CodeRay 1.1.0 (preserving changes of r10132)....
[#20288] Update styles to match CodeRay 1.1.0 (preserving changes of r10132). This commit updates the CSS styles to match with CodeRay 1.1.0, while it preserves the custom changes applied in r10132. The CSS styles were still based on CodeRay 1.0.6 (included since Redmine 1.4.0) with the custom changes from r10132 (included since Redmine 2.1.0). Redmine 2.3.2 till 2.3.4 came with CodeRay 1.0.9, an upgrade that didn't needed changes in the CSS styles. Starting with 2.4.0 Redmine comes with CodeRay 1.1.0, a minor upgrade that came with new/changed token_kinds and lots of changes in the alpha stylesheet, that in turn is used as a base for Redmine's own CodeRay CSS styles. As such, this upgrade needed CSS stylesheet changes like done before in r7618 and r7623 (for 1.0.0 upgrade) and r9389 (for 1.0.6 upgrade). But these changes, plus an update of the Redmine core documentation that is shipped along the core (wiki_syntax_detailed_[markdown|textile].html), aren't integrated up untill today. Contributed by Mischa The Evil. git-svn-id: http://svn.redmine.org/redmine/trunk@14488 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r14102:918a412fd4c8
r14106:6fbb56e55735
Show More
mail_handler.rb
566 lines | 19.5 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....
r13490 # Copyright (C) 2006-2015 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
Don't use a class variable for mail handler options....
r13846 if options[:allow_override].is_a?(String)
options[:allow_override] = options[:allow_override].split(',').collect(&:strip)
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 end
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 options[:allow_override] ||= []
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)
Jean-Philippe Lang
Mail handler: check workflow for status set/change....
r2072 # Status overridable by default
Jean-Philippe Lang
Don't use a class variable for mail handler options....
r13846 options[:allow_override] << 'status' unless options[:issue].has_key?(:status)
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
Don't abort processing of emails when an email triggers a parsing exception (#16122)....
r12720 logger.error "An unexpected error occurred when receiving email: #{e.message}" if logger
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 => {}}
%w(project status tracker category priority).each do |option|
options[:issue][option.to_sym] = env[option] if env[option]
end
%w(allow_override unknown_user no_permission_check no_account_notice default_group).each do |option|
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
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
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)
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
Jean-Philippe Lang
Set default start date on issues created by email if default_issue_start_date_to_creation_date is set (#16655)....
r12829 issue.start_date ||= Date.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
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,
Jean-Philippe Lang
Use Mail instead of TMail in MailHandler....
r9447 :file => attachment.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)
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
Add support for multiple email addresses per user (#4244)....
r13504 User.active.having_mail(addresses).each do |w|
Toshi MARUYAMA
remove unneeded Relation#all from MailHandler#add_watchers...
r12267 obj.add_watcher(w)
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
Don't use a class variable for mail handler options....
r13846 if (options[:override] || handler_options[:allow_override].include?(attr.to_s)) &&
Jean-Philippe Lang
Ignore email keywords after truncation line (#8758)....
r13050 (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
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))
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
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
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)
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|
Toshi MARUYAMA
use String#casecmp for case insensitive comparison (#20369)...
r14102 keyword.casecmp(a.mail.to_s) == 0 ||
keyword.casecmp(a.login.to_s) == 0
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 }
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
remove trailing white-spaces from app/models/mail_handler.rb...
r10897 assignee ||= assignable.detect {|a|
Toshi MARUYAMA
use String#casecmp for case insensitive comparison (#20369)...
r14102 a.is_a?(User) &&
firstname.casecmp(a.firstname.to_s) == 0 &&
lastname.casecmp(a.lastname.to_s) == 0
Toshi MARUYAMA
code layout cleanup app/models/mail_handler.rb...
r8625 }
Jean-Philippe Lang
Ability to assign issues to groups (#2964)....
r6186 end
if assignee.nil?
Toshi MARUYAMA
use String#casecmp for case insensitive comparison (#20369)...
r14102 assignee ||= assignable.detect {|a| keyword.casecmp(a.name) == 0}
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