From 3d8d4fa0d6cc945f18b90c139069e8c806e72668 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 22 Jun 2008 12:27:00 +0000 Subject: [PATCH] Adds a rake task (redmine:email:receive_imap) to read emails from an IMAP server (#1110). git-svn-id: http://redmine.rubyforge.org/svn/trunk@1569 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/imap.rb | 43 +++++++++++++++++++++++++++++++++++++++++++ lib/tasks/email.rake | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 lib/redmine/imap.rb diff --git a/lib/redmine/imap.rb b/lib/redmine/imap.rb new file mode 100644 index 000000000..d09832c2e --- /dev/null +++ b/lib/redmine/imap.rb @@ -0,0 +1,43 @@ +# redMine - project management software +# Copyright (C) 2006-2008 Jean-Philippe Lang +# +# 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. + +require 'net/imap' + +module Redmine + module IMAP + class << self + def check(imap_options={}, options={}) + host = imap_options[:host] || '127.0.0.1' + port = imap_options[:port] || '143' + ssl = !imap_options[:ssl].nil? + folder = imap_options[:folder] || 'INBOX' + + imap = Net::IMAP.new(host, port, ssl) + imap.login(imap_options[:username], imap_options[:password]) unless imap_options[:username].nil? + imap.select(folder) + imap.search(['ALL']).each do |message_id| + puts "Receiving message #{message_id}" + msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822'] + if MailHandler.receive(msg, options) + imap.store(message_id, "+FLAGS", [:Deleted]) + end + end + imap.expunge + end + end + end +end diff --git a/lib/tasks/email.rake b/lib/tasks/email.rake index dbdbe71fc..01407c36d 100644 --- a/lib/tasks/email.rake +++ b/lib/tasks/email.rake @@ -15,7 +15,10 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -desc <<-END_DESC +namespace :redmine do + namespace :email do + + desc <<-END_DESC Read an email from standard input. Available options: @@ -25,13 +28,42 @@ Example: rake redmine:email:receive project=foo RAILS_ENV="production" END_DESC -namespace :redmine do - namespace :email do task :receive => :environment do options = {} options[:project] = ENV['project'] if ENV['project'] MailHandler.receive(STDIN.read, options) end + + desc <<-END_DESC +Read emails from an IMAP server. + +Available IMAP options: + * host => IMAP server host (default: 127.0.0.1) + * port => IMAP server port (default: 143) + * ssl => Use SSL? (default: false) + * username => IMAP account + * password => IMAP password + * folder => IMAP folder to read (default: INBOX) +Other options: + * project => identifier of the project the issue should be added to + +Example: + rake redmine:email:receive_iamp host=imap.foo.bar username=redmine@somenet.foo password=xxx project=foo RAILS_ENV="production" +END_DESC + + task :receive_imap => :environment do + imap_options = {:host => ENV['host'], + :port => ENV['port'], + :ssl => ENV['ssl'], + :username => ENV['username'], + :password => ENV['password'], + :folder => ENV['folder']} + + options = {} + options[:project] = ENV['project'] if ENV['project'] + + Redmine::IMAP.check(imap_options, options) + end end end