##// END OF EJS Templates
rdm-mailhandler with project-from-subaddress fails (#21531)....
rdm-mailhandler with project-from-subaddress fails (#21531). git-svn-id: http://svn.redmine.org/redmine/trunk@14986 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r14604:cf59a9b62e44
r14604:cf59a9b62e44
Show More
rdm-mailhandler.rb
212 lines | 9.8 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Changes ruby bang path to #!/usr/bin/env ruby (#1876)....
r2015 #!/usr/bin/env ruby
Jean-Philippe Lang
Adds copyright....
r11293 # Redmine - project management software
Jean-Philippe Lang
Copyright update....
r13490 # Copyright (C) 2006-2015 Jean-Philippe Lang
Jean-Philippe Lang
Adds copyright....
r11293 #
# 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.
#
# 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.
#
# 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
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570
require 'net/http'
require 'net/https'
require 'uri'
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467 require 'optparse'
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570
Jean-Philippe Lang
Fixes rdm-mailhandler SSL support (#1724)....
r1714 module Net
class HTTPS < HTTP
Jean-Philippe Lang
Adds an option to rdm-mailhandler to disable server certificate verification (#9496)....
r7833 def self.post_form(url, params, headers, options={})
Jean-Philippe Lang
Fixes rdm-mailhandler SSL support (#1724)....
r1714 request = Post.new(url.path)
request.form_data = params
Jean-Philippe Lang
Adds a User-Agent header to Redmine mailhandler requests (#7318)....
r4605 request.initialize_http_header(headers)
Jean-Philippe Lang
Fixed thatinitialize_http_header overrides basic auth in rdm-mailhandler.rb (#13165)....
r11141 request.basic_auth url.user, url.password if url.user
Jean-Philippe Lang
Fixes rdm-mailhandler SSL support (#1724)....
r1714 http = new(url.host, url.port)
http.use_ssl = (url.scheme == 'https')
Jean-Philippe Lang
Mail Handler: option for specifying a custom CA bundle (#19182)....
r13907 if options[:certificate_bundle]
http.ca_file = options[:certificate_bundle]
end
Jean-Philippe Lang
Adds an option to rdm-mailhandler to disable server certificate verification (#9496)....
r7833 if options[:no_check_certificate]
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
Jean-Philippe Lang
Fixes rdm-mailhandler SSL support (#1724)....
r1714 http.start {|h| h.request(request) }
end
end
end
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 class RedmineMailHandler
Jean-Philippe Lang
Mail handler: adds --no-account-notice option for not sending account information to the created user (#11498)....
r11295 VERSION = '0.2.3'
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158
Jean-Philippe Lang
Mail handler: adds --no-account-notice option for not sending account information to the created user (#11498)....
r11295 attr_accessor :verbose, :issue_attributes, :allow_override, :unknown_user, :default_group, :no_permission_check,
Jean-Philippe Lang
Makes project selection by subaddress optional (#20732)....
r14308 :url, :key, :no_check_certificate, :certificate_bundle, :no_account_notice, :no_notification, :project_from_subaddress
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570
def initialize
Jean-Philippe Lang
Mail handler: more control over issue attributes (#1110)....
r1629 self.issue_attributes = {}
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467 optparse = OptionParser.new do |opts|
opts.banner = "Usage: rdm-mailhandler.rb [options] --url=<Redmine URL> --key=<API key>"
opts.separator("")
Jean-Philippe Lang
Typo and text formatting in rdm-mailhandler usage....
r11294 opts.separator("Reads an email from standard input and forwards it to a Redmine server through a HTTP request.")
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467 opts.separator("")
opts.separator("Required arguments:")
opts.on("-u", "--url URL", "URL of the Redmine server") {|v| self.url = v}
opts.on("-k", "--key KEY", "Redmine API key") {|v| self.key = v}
opts.separator("")
opts.separator("General options:")
Jean-Philippe Lang
Typo and text formatting in rdm-mailhandler usage....
r11294 opts.on("--key-file FILE", "full path to a file that contains your Redmine",
"API key (use this option instead of --key if",
"you don't want the key to appear in the command",
"line)") {|v| read_key_from_file(v)}
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467 opts.on("--no-check-certificate", "do not check server certificate") {self.no_check_certificate = true}
Jean-Philippe Lang
Mail Handler: option for specifying a custom CA bundle (#19182)....
r13907 opts.on("--certificate-bundle FILE", "certificate bundle to use") {|v| self.certificate_bundle = v}
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467 opts.on("-h", "--help", "show this help") {puts opts; exit 1}
opts.on("-v", "--verbose", "show extra information") {self.verbose = true}
opts.on("-V", "--version", "show version information and exit") {puts VERSION; exit}
opts.separator("")
Jean-Philippe Lang
Updates rdm-mailhandler.rb help....
r14306 opts.separator("User and permissions options:")
Jean-Philippe Lang
Mail handler: adds --default-group option to add created user to one or more groups (#13340)....
r11292 opts.on("--unknown-user ACTION", "how to handle emails from an unknown user",
"ACTION can be one of the following values:",
"* ignore: email is ignored (default)",
"* accept: accept as anonymous user",
"* create: create a user account") {|v| self.unknown_user = v}
Jean-Philippe Lang
Updates rdm-mailhandler.rb help....
r14306 opts.on("--no-permission-check", "disable permission checking when receiving",
"the email") {self.no_permission_check = '1'}
Jean-Philippe Lang
Mail handler: adds --default-group option to add created user to one or more groups (#13340)....
r11292 opts.on("--default-group GROUP", "add created user to GROUP (none by default)",
"GROUP can be a comma separated list of groups") { |v| self.default_group = v}
Jean-Philippe Lang
Mail handler: adds --no-account-notice option for not sending account information to the created user (#11498)....
r11295 opts.on("--no-account-notice", "don't send account information to the newly",
"created user") { |v| self.no_account_notice = '1'}
Jean-Philippe Lang
Mail handler: adds --no-notification option to disable notifications to the created user (#13341)....
r11296 opts.on("--no-notification", "disable email notifications for the created",
"user") { |v| self.no_notification = '1'}
Jean-Philippe Lang
Mail handler: adds --default-group option to add created user to one or more groups (#13340)....
r11292 opts.separator("")
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467 opts.separator("Issue attributes control options:")
Jean-Philippe Lang
Makes project selection by subaddress optional (#20732)....
r14308 opts.on( "--project-from-subaddress ADDR", "select project from subadress of ADDR found",
Jean-Philippe Lang
rdm-mailhandler with project-from-subaddress fails (#21531)....
r14604 "in To, Cc, Bcc headers") {|v| self.project_from_subaddress = v}
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467 opts.on("-p", "--project PROJECT", "identifier of the target project") {|v| self.issue_attributes['project'] = v}
opts.on("-s", "--status STATUS", "name of the target status") {|v| self.issue_attributes['status'] = v}
opts.on("-t", "--tracker TRACKER", "name of the target tracker") {|v| self.issue_attributes['tracker'] = v}
opts.on( "--category CATEGORY", "name of the target category") {|v| self.issue_attributes['category'] = v}
opts.on( "--priority PRIORITY", "name of the target priority") {|v| self.issue_attributes['priority'] = v}
Jean-Philippe Lang
Allow a default version to be set on the command line for incoming emails (#7346)....
r14407 opts.on( "--fixed-version VERSION","name of the target version") {|v| self.issue_attributes['fixed_version'] = v}
Jean-Philippe Lang
Adds private issue option to receiving emails (#8424)....
r13880 opts.on( "--private", "create new issues as private") {|v| self.issue_attributes['is_private'] = '1'}
Jean-Philippe Lang
Updates rdm-mailhandler.rb help....
r14307 opts.on("-o", "--allow-override ATTRS", "allow email content to set attributes values",
"ATTRS is a comma separated list of attributes",
"or 'all' to allow all attributes to be",
"overridable (see below for details)") {|v| self.allow_override = v}
opts.separator <<-END_DESC
Overrides:
ATTRS is a comma separated list of attributes among:
* project, tracker, status, priority, category, assigned_to, fixed_version,
start_date, due_date, estimated_hours, done_ratio
* custom fields names with underscores instead of spaces (case insensitive)
Example: --allow_override=project,priority,my_custom_field
If the --project option is not set, project is overridable by default for
emails that create new issues.
You can use --allow_override=all to allow all attributes to be overridable.
Examples:
Jean-Philippe Lang
Makes project selection by subaddress optional (#20732)....
r14308 No project specified, emails MUST contain the 'Project' keyword, otherwise
they will be dropped (not recommanded):
rdm-mailhandler.rb --url http://redmine.domain.foo --key secret
Jean-Philippe Lang
Updates rdm-mailhandler.rb help....
r14307
Fixed project and default tracker specified, but emails can override
both tracker and priority attributes using keywords:
Jean-Philippe Lang
Makes project selection by subaddress optional (#20732)....
r14308
rdm-mailhandler.rb --url https://domain.foo/redmine --key secret \\
--project myproject \\
--tracker bug \\
--allow-override tracker,priority
Project selected by subaddress of redmine@example.net. Sending the email
to redmine+myproject@example.net will add the issue to myproject:
rdm-mailhandler.rb --url http://redmine.domain.foo --key secret \\
--project-from-subaddress redmine@example.net
Jean-Philippe Lang
Updates rdm-mailhandler.rb help....
r14307 END_DESC
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467
opts.summary_width = 27
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 end
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467 optparse.parse!
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467 unless url && key
puts "Some arguments are missing. Use `rdm-mailhandler.rb --help` for getting help."
exit 1
end
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 end
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 def submit(email)
uri = url.gsub(%r{/*$}, '') + '/mail_handler'
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158
Jean-Philippe Lang
Adds a User-Agent header to Redmine mailhandler requests (#7318)....
r4605 headers = { 'User-Agent' => "Redmine mail handler/#{VERSION}" }
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158
data = { 'key' => key, 'email' => email,
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 'allow_override' => allow_override,
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 'unknown_user' => unknown_user,
Jean-Philippe Lang
Mail handler: adds --default-group option to add created user to one or more groups (#13340)....
r11292 'default_group' => default_group,
Jean-Philippe Lang
Mail handler: adds --no-account-notice option for not sending account information to the created user (#11498)....
r11295 'no_account_notice' => no_account_notice,
Jean-Philippe Lang
Mail handler: adds --no-notification option to disable notifications to the created user (#13341)....
r11296 'no_notification' => no_notification,
Jean-Philippe Lang
Makes project selection by subaddress optional (#20732)....
r14308 'no_permission_check' => no_permission_check,
'project_from_subaddress' => project_from_subaddress}
Jean-Philippe Lang
Mail handler: more control over issue attributes (#1110)....
r1629 issue_attributes.each { |attr, value| data["issue[#{attr}]"] = value }
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 debug "Posting to #{uri}..."
Jean-Philippe Lang
MailHandler: exit with 75 when a SystemCallError is raised (#12528)....
r10727 begin
Jean-Philippe Lang
Mail Handler: option for specifying a custom CA bundle (#19182)....
r13907 response = Net::HTTPS.post_form(URI.parse(uri), data, headers, :no_check_certificate => no_check_certificate, :certificate_bundle => certificate_bundle)
Jean-Philippe Lang
rdm-mailhandler.rb should catch EOFError (#18922)....
r13579 rescue SystemCallError, IOError => e # connection refused, etc.
Jean-Philippe Lang
MailHandler: exit with 75 when a SystemCallError is raised (#12528)....
r10727 warn "An error occured while contacting your Redmine server: #{e.message}"
return 75 # temporary failure
end
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 debug "Response received: #{response.code}"
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158
Jean-Philippe Lang
Improve rdm-mailhandler exit status (#4368)....
r3029 case response.code.to_i
when 403
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158 warn "Request was denied by your Redmine server. " +
Jean-Philippe Lang
Improve rdm-mailhandler exit status (#4368)....
r3029 "Make sure that 'WS for incoming emails' is enabled in application settings and that you provided the correct API key."
return 77
when 422
warn "Request was denied by your Redmine server. " +
"Possible reasons: email is sent from an invalid email address or is missing some information."
return 77
when 400..499
warn "Request was denied by your Redmine server (#{response.code})."
return 77
when 500..599
warn "Failed to contact your Redmine server (#{response.code})."
return 75
when 201
debug "Proccessed successfully"
return 0
else
return 1
end
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 end
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 private
Toshi MARUYAMA
remove trailing white-spaces from extra/mail_handler/rdm-mailhandler.rb...
r9158
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 def debug(msg)
puts msg if verbose
end
Jean-Philippe Lang
Use optparse instead rdoc/usage in rdm-mailhandler (#10837)....
r9467
def read_key_from_file(filename)
begin
self.key = File.read(filename).strip
rescue Exception => e
$stderr.puts "Unable to read the key from #{filename}:\n#{e.message}"
exit 1
end
end
Jean-Philippe Lang
Adds a simple API and a standalone script that can be used to forward emails from a local or remote email server to Redmine (#1110)....
r1570 end
handler = RedmineMailHandler.new
Jean-Philippe Lang
Improve rdm-mailhandler exit status (#4368)....
r3029 exit(handler.submit(STDIN.read))