##// END OF EJS Templates
Ability to accept incoming emails from unknown users (#2230, #3003)....
Ability to accept incoming emails from unknown users (#2230, #3003). An option lets you specify how to handle emails from unknown users: * ignore: the email is ignored (previous and default behaviour) * accept: the sender is considered as an anonymous user * create: a user account is created (username/password are sent back to the user) Permissions have to be consistent with the chosen option. Eg. if you choose 'create', the 'Non member' role must have the 'Add issues' permission so that an issue can be created by an unknown user via email. If you choose 'accept', the 'Anonymous' role must have this permission. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2789 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r2689:b3afde14fa60
r2689:b3afde14fa60
Show More
rdm-mailhandler.rb
141 lines | 4.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 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
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
Ability to accept incoming emails from unknown users (#2230, #3003)....
r2689 attr_accessor :verbose, :issue_attributes, :allow_override, :uknown_user, :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],
[ '--unknown-user', GetoptLong::REQUIRED_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 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,
'unknown_user' => unknown_user }
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
puts "Request was denied by your Redmine server. " +
"Please, make sure that 'WS for incoming emails' is enabled in application settings and that you provided the correct API key." if response.code == '403'
response.code == '201' ? 0 : 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
private
def debug(msg)
puts msg if verbose
end
end
handler = RedmineMailHandler.new
handler.submit(STDIN.read)