##// END OF EJS Templates
Tagging 1.0.2...
Tagging 1.0.2 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/tags/1.0.2@4213 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r3081:06ca18b04225
r4099:b5cfe790446f 1.0.2
Show More
rdm-mailhandler.rb
165 lines | 5.6 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 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
Use RDoc.usage...
r1865 # == Synopsis
#
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 # Reads an email from standard input and forward it to a Redmine server
Jean-Philippe Lang
Use RDoc.usage...
r1865 # through a HTTP request.
#
# == Usage
#
# rdm-mailhandler [options] --url=<Redmine URL> --key=<API key>
#
# == Arguments
#
# -u, --url URL of the Redmine server
# -k, --key Redmine API key
#
# General options:
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 # --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
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 # --no-permission-check disable permission checking when receiving
# the email
Jean-Philippe Lang
Use RDoc.usage...
r1865 # -h, --help show this help
# -v, --verbose show extra information
# -V, --version show version information and exit
#
# Issue attributes control options:
# -p, --project=PROJECT identifier of the target project
Jean-Philippe Lang
Adds --status option to rdm-mailhandler....
r2074 # -s, --status=STATUS name of the target status
Jean-Philippe Lang
Use RDoc.usage...
r1865 # -t, --tracker=TRACKER name of the target tracker
# --category=CATEGORY name of the target category
# --priority=PRIORITY name of the target priority
# -o, --allow-override=ATTRS allow email content to override attributes
# specified by previous options
# ATTRS is a comma separated list of attributes
#
# == Examples
# No project specified. Emails MUST contain the 'Project' keyword:
#
# rdm-mailhandler --url http://redmine.domain.foo --key secret
#
# Fixed project and default tracker specified, but emails can override
# both tracker and priority attributes using keywords:
#
# rdm-mailhandler --url https://domain.foo/redmine --key secret \\
# --project foo \\
# --tracker bug \\
# --allow-override tracker,priority
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'
require 'getoptlong'
Jean-Philippe Lang
Use RDoc.usage...
r1865 require 'rdoc/usage'
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
def self.post_form(url, params)
request = Post.new(url.path)
request.form_data = params
request.basic_auth url.user, url.password if url.user
http = new(url.host, url.port)
http.use_ssl = (url.scheme == 'https')
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
VERSION = '0.1'
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 attr_accessor :verbose, :issue_attributes, :allow_override, :unknown_user, :no_permission_check, :url, :key
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 = {}
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 opts = GetoptLong.new(
Jean-Philippe Lang
Use RDoc.usage...
r1865 [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
[ '--version', '-V', GetoptLong::NO_ARGUMENT ],
[ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
[ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ],
[ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
[ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ],
Jean-Philippe Lang
Adds --status option to rdm-mailhandler....
r2074 [ '--status', '-s', GetoptLong::REQUIRED_ARGUMENT ],
Jean-Philippe Lang
Use RDoc.usage...
r1865 [ '--tracker', '-t', GetoptLong::REQUIRED_ARGUMENT],
[ '--category', GetoptLong::REQUIRED_ARGUMENT],
[ '--priority', GetoptLong::REQUIRED_ARGUMENT],
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 [ '--allow-override', '-o', GetoptLong::REQUIRED_ARGUMENT],
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 [ '--unknown-user', GetoptLong::REQUIRED_ARGUMENT],
[ '--no-permission-check', GetoptLong::NO_ARGUMENT]
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 )
opts.each do |opt, arg|
case opt
when '--url'
self.url = arg.dup
when '--key'
self.key = arg.dup
when '--help'
usage
when '--verbose'
self.verbose = true
when '--version'
puts VERSION; exit
Jean-Philippe Lang
Adds --status option to rdm-mailhandler....
r2074 when '--project', '--status', '--tracker', '--category', '--priority'
Jean-Philippe Lang
Mail handler: more control over issue attributes (#1110)....
r1629 self.issue_attributes[opt.gsub(%r{^\-\-}, '')] = arg.dup
when '--allow-override'
self.allow_override = arg.dup
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 when '--unknown-user'
self.unknown_user = arg.dup
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 when '--no-permission-check'
self.no_permission_check = '1'
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
end
Jean-Philippe Lang
Use RDoc.usage...
r1865 RDoc.usage if url.nil?
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
def submit(email)
uri = url.gsub(%r{/*$}, '') + '/mail_handler'
Jean-Philippe Lang
Mail handler: more control over issue attributes (#1110)....
r1629
Jean-Philippe Lang
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 data = { 'key' => key, 'email' => email,
'allow_override' => allow_override,
Jean-Philippe Lang
Adds a 'no_permission_check' option to the MailHandler....
r3081 'unknown_user' => unknown_user,
'no_permission_check' => no_permission_check}
Jean-Philippe Lang
Mail handler: more control over issue attributes (#1110)....
r1629 issue_attributes.each { |attr, value| data["issue[#{attr}]"] = value }
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
Fixes rdm-mailhandler SSL support (#1724)....
r1714 response = Net::HTTPS.post_form(URI.parse(uri), data)
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}"
Jean-Philippe Lang
mailhandler: fixes exit status and adds an explicit message if response code is 403....
r1866
Jean-Philippe Lang
Improve rdm-mailhandler exit status (#4368)....
r3029 case response.code.to_i
when 403
warn "Request was denied by your Redmine server. " +
"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
private
def debug(msg)
puts msg if verbose
end
end
handler = RedmineMailHandler.new
Jean-Philippe Lang
Improve rdm-mailhandler exit status (#4368)....
r3029 exit(handler.submit(STDIN.read))