imap-feeder 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +0 -0
- data/.project +23 -0
- data/History.txt +4 -0
- data/License.txt +341 -0
- data/Manifest.txt +48 -0
- data/README.txt +77 -0
- data/Rakefile +4 -0
- data/TODO.txt +11 -0
- data/bin/imap-feeder +68 -0
- data/config/hoe.rb +77 -0
- data/config/requirements.rb +17 -0
- data/lib/imap-feeder.rb +87 -0
- data/lib/imap-feeder/createconfigparser.rb +40 -0
- data/lib/imap-feeder/fakeserver.rb +23 -0
- data/lib/imap-feeder/feedfolder.rb +23 -0
- data/lib/imap-feeder/feedreader.rb +81 -0
- data/lib/imap-feeder/imapfeederconfig.rb +74 -0
- data/lib/imap-feeder/message.rb +152 -0
- data/lib/imap-feeder/messagestore.rb +35 -0
- data/lib/imap-feeder/opmlreader.rb +50 -0
- data/lib/imap-feeder/server.rb +77 -0
- data/lib/imap-feeder/version.rb +9 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +77 -0
- data/settings.rb.example +58 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +15 -0
- data/test/data/encoded.rss +22 -0
- data/test/data/erroneous.yml +7 -0
- data/test/data/last_messages.yaml +0 -0
- data/test/data/rss20_no_body.xml +10 -0
- data/test/data/rss20_one_entry.xml +11 -0
- data/test/data/rss20_two_entries.xml +17 -0
- data/test/data/rss20_with_authors.xml +21 -0
- data/test/data/simple.opml +9 -0
- data/test/functional_test_server.rb +95 -0
- data/test/test_feedreader.rb +92 -0
- data/test/test_imap-feeder.rb +66 -0
- data/test/test_imapfeederconfig.rb +56 -0
- data/test/test_message.rb +312 -0
- data/test/test_messagestore.rb +54 -0
- data/test/test_opmlreader.rb +73 -0
- data/test/testlogger.rb +22 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +137 -0
- data/website/template.rhtml +49 -0
- metadata +175 -0
- metadata.gz.sig +0 -0
data/Rakefile
ADDED
data/TODO.txt
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
Ideas for further development:
|
2
|
+
* Adding new feeds through rssimap, without manually editing the file.
|
3
|
+
* HTML-Mails (really?)
|
4
|
+
* make the position of the link to the original configurable
|
5
|
+
* embed images (e.g. for dilbert)
|
6
|
+
|
7
|
+
* user-hooks that can interact with the feed processing:
|
8
|
+
* to ignore items
|
9
|
+
* custom body, e.g. fetch content with hpricot
|
10
|
+
* code directly in the feedy.yml
|
11
|
+
* or an external file, with an ID to identify the feed
|
data/bin/imap-feeder
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'imap-feeder'
|
4
|
+
require 'imap-feeder/createconfigparser'
|
5
|
+
require 'imap-feeder/imapfeederconfig'
|
6
|
+
require 'imap-feeder/fakeserver.rb'
|
7
|
+
|
8
|
+
opts = CreateConfigParser.parse(ARGV)
|
9
|
+
|
10
|
+
if opts.create
|
11
|
+
$stdout.puts "Creating new configuration."
|
12
|
+
ImapFeederConfig.create(opts.create_file, opts.folder)
|
13
|
+
$stdout.puts "Please edit your settings.rb file now."
|
14
|
+
|
15
|
+
elsif opts.check
|
16
|
+
$stdout.puts "Checking configuration #{opts.check}"
|
17
|
+
$log = Logger.new($stdout)
|
18
|
+
ImapFeederConfig.check(File.open(opts.check))
|
19
|
+
|
20
|
+
elsif ARGV.first and load(ARGV.first)
|
21
|
+
configuration = [$host, $user, $pass, $temp, $config]
|
22
|
+
if not configuration.all?
|
23
|
+
$stderr.puts "Your settings are incomplete, please review settings.rb:"
|
24
|
+
$stderr.puts configuration.inspect
|
25
|
+
exit 1
|
26
|
+
end
|
27
|
+
|
28
|
+
if File.exist? $running_instance
|
29
|
+
$stderr.puts "Already running (#{$running_instance})! Aborting..."
|
30
|
+
exit 1
|
31
|
+
else
|
32
|
+
File.new($running_instance, "w")
|
33
|
+
end
|
34
|
+
|
35
|
+
store = MessageStore.new($temp)
|
36
|
+
|
37
|
+
server_options = {
|
38
|
+
:host => $host,
|
39
|
+
:user => $user,
|
40
|
+
:pass => $pass,
|
41
|
+
:port => $port || "143",
|
42
|
+
:use_ssl => $use_ssl || false
|
43
|
+
}
|
44
|
+
|
45
|
+
if opts.pretend
|
46
|
+
@server = FakeServer.new(server_options)
|
47
|
+
def store.save
|
48
|
+
end
|
49
|
+
$log = Logger.new(STDOUT)
|
50
|
+
else
|
51
|
+
begin
|
52
|
+
@server = Server.new(server_options)
|
53
|
+
rescue Exception, Errno::ECONNRESET => e
|
54
|
+
$log.error "Could not open initial connection to server: #{e}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
config = File.open($config)
|
59
|
+
imapfeeder = ImapFeeder.new(@server, store, config)
|
60
|
+
imapfeeder.run
|
61
|
+
@server.disconnect
|
62
|
+
|
63
|
+
File.delete $running_instance
|
64
|
+
|
65
|
+
else
|
66
|
+
$stdout.puts "No options given, maybe you need --help?"
|
67
|
+
end
|
68
|
+
|
data/config/hoe.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'imap-feeder/version'
|
2
|
+
|
3
|
+
AUTHOR = 'Mirko Stocker' # can also be an array of Authors
|
4
|
+
EMAIL = "me@misto.ch"
|
5
|
+
DESCRIPTION = "Imap-feeder pushes your RSS and Atom feeds to an IMAP server."
|
6
|
+
GEM_NAME = 'imap-feeder' # what ppl will type to install your gem
|
7
|
+
RUBYFORGE_PROJECT = 'imap-feeder' # The unix name for your project
|
8
|
+
HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
|
9
|
+
DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
|
10
|
+
|
11
|
+
@config_file = "~/.rubyforge/user-config.yml"
|
12
|
+
@config = nil
|
13
|
+
RUBYFORGE_USERNAME = "unknown"
|
14
|
+
def rubyforge_username
|
15
|
+
unless @config
|
16
|
+
begin
|
17
|
+
@config = YAML.load(File.read(File.expand_path(@config_file)))
|
18
|
+
rescue
|
19
|
+
puts <<-EOS
|
20
|
+
ERROR: No rubyforge config file found: #{@config_file}
|
21
|
+
Run 'rubyforge setup' to prepare your env for access to Rubyforge
|
22
|
+
- See http://newgem.rubyforge.org/rubyforge.html for more details
|
23
|
+
EOS
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
end
|
27
|
+
RUBYFORGE_USERNAME.replace @config["username"]
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
REV = nil
|
32
|
+
# UNCOMMENT IF REQUIRED:
|
33
|
+
# REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
|
34
|
+
VERS = ImapFeeder::VERSION::STRING + (REV ? ".#{REV}" : "")
|
35
|
+
RDOC_OPTS = ['--quiet', '--title', 'imap-feeder documentation',
|
36
|
+
"--opname", "index.html",
|
37
|
+
"--line-numbers",
|
38
|
+
"--main", "README",
|
39
|
+
"--inline-source"]
|
40
|
+
|
41
|
+
class Hoe
|
42
|
+
def extra_deps
|
43
|
+
@extra_deps.reject! { |x| Array(x).first == 'hoe' }
|
44
|
+
@extra_deps
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Generate all the Rake tasks
|
49
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
50
|
+
hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
51
|
+
p.developer(AUTHOR, EMAIL)
|
52
|
+
p.description = DESCRIPTION
|
53
|
+
p.summary = DESCRIPTION
|
54
|
+
p.url = HOMEPATH
|
55
|
+
p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
|
56
|
+
p.test_globs = ["test/**/test_*.rb"]
|
57
|
+
p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
|
58
|
+
|
59
|
+
# == Optional
|
60
|
+
p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
|
61
|
+
|
62
|
+
p.extra_deps = [
|
63
|
+
['actionmailer', '>= 1.3.2'],
|
64
|
+
['hpricot', '>= 0.5'],
|
65
|
+
['htmlentities', '>= 3.0.1'],
|
66
|
+
['tidy', '>= 1.1.2'],
|
67
|
+
['simple-rss', '>= 1.1']
|
68
|
+
]
|
69
|
+
|
70
|
+
#p.spec_extras = {} # A hash of extra values to set in the gemspec.
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
|
75
|
+
PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
|
76
|
+
hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
|
77
|
+
hoe.rsync_args = '-av --delete --ignore-errors'
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
include FileUtils
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
%w[rake hoe newgem rubigen].each do |req_gem|
|
6
|
+
begin
|
7
|
+
require req_gem
|
8
|
+
rescue LoadError
|
9
|
+
puts "This Rakefile requires the '#{req_gem}' RubyGem."
|
10
|
+
puts "Installation: gem install #{req_gem} -y"
|
11
|
+
exit
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
$:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
|
16
|
+
|
17
|
+
require 'imap-feeder'
|
data/lib/imap-feeder.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'imap-feeder/server'
|
4
|
+
require 'imap-feeder/message'
|
5
|
+
require 'imap-feeder/feedreader'
|
6
|
+
require 'imap-feeder/messagestore'
|
7
|
+
|
8
|
+
$KCODE="U"
|
9
|
+
|
10
|
+
class ImapFeeder
|
11
|
+
|
12
|
+
def initialize(server, store, config)
|
13
|
+
@server = server
|
14
|
+
@store = store
|
15
|
+
@config = config
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
$log.info "Started"
|
20
|
+
feeds = YAML.load(@config)
|
21
|
+
|
22
|
+
feeds.each do |feed|
|
23
|
+
path = feed['feed']['path']
|
24
|
+
$log.info "Processing #{path}"
|
25
|
+
|
26
|
+
create_folder(path) unless check_folder_exists(path)
|
27
|
+
|
28
|
+
begin
|
29
|
+
url = feed['feed']['url']
|
30
|
+
reader = FeedReader.new(url)
|
31
|
+
rescue OpenURI::HTTPError => e
|
32
|
+
$log.warn "Error retrieving #{url}: #{e.message}"
|
33
|
+
next
|
34
|
+
rescue Exception => e
|
35
|
+
$log.error "Unexpected error while retrieving #{path}: #{e.message}"
|
36
|
+
next
|
37
|
+
end
|
38
|
+
|
39
|
+
archive = get_archived(path)
|
40
|
+
messages = reader.get_new(archive)
|
41
|
+
|
42
|
+
unless messages.empty?
|
43
|
+
$log.debug "already processed messages: '#{archive.join("', '")}'"
|
44
|
+
send_messages(messages, path, reader.number_of_entries)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
$log.info "Finished"
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def send_messages messages, path, number_of_entries
|
54
|
+
$log.info "#{messages.size} new message(s)"
|
55
|
+
messages.each do |msg|
|
56
|
+
send_message(msg, path)
|
57
|
+
end
|
58
|
+
message_sent(messages, path, number_of_entries)
|
59
|
+
end
|
60
|
+
|
61
|
+
def message_sent(messages, path, number_of_entries)
|
62
|
+
identifiers = messages.collect do |msg|
|
63
|
+
msg.generate_identifier
|
64
|
+
end
|
65
|
+
|
66
|
+
@store.add_new(path, identifiers, number_of_entries)
|
67
|
+
@store.save
|
68
|
+
end
|
69
|
+
|
70
|
+
def send_message(msg, complete_path)
|
71
|
+
@server.send(msg, complete_path)
|
72
|
+
$log.info "Found in #{complete_path.split(".").last}: #{msg.generate_identifier}"
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_archived(path)
|
76
|
+
@store.get_archived path
|
77
|
+
end
|
78
|
+
|
79
|
+
def create_folder(path)
|
80
|
+
$log.info "Creating #{path}"
|
81
|
+
@server.create_folder path
|
82
|
+
end
|
83
|
+
|
84
|
+
def check_folder_exists(path)
|
85
|
+
@server.has_folder? path
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
class CreateConfigParser
|
5
|
+
def self.parse(args)
|
6
|
+
options = OpenStruct.new
|
7
|
+
|
8
|
+
opts = OptionParser.new do |opts|
|
9
|
+
opts.banner = <<EOF
|
10
|
+
Usage: #{$0} [options] to create or check your configuration
|
11
|
+
or #{$0} SETTINGS_FILE to run the script
|
12
|
+
EOF
|
13
|
+
|
14
|
+
opts.on("-c", "--check-settings SETTINGS_FILE",
|
15
|
+
"Check an existing configuration") do |file|
|
16
|
+
options.check = file
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on("-r", "--imap-root [FOLDER]",
|
20
|
+
"Use this as the root folder for all feeds") do |folder|
|
21
|
+
options.folder = folder
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on("-n", "--new-config [OPML_FILE]",
|
25
|
+
"Create a new configuration") do |file|
|
26
|
+
options.create = true
|
27
|
+
options.create_file = file
|
28
|
+
end
|
29
|
+
|
30
|
+
opts.on("-p", "--pretend",
|
31
|
+
"Don't do anything, just pretend. " +
|
32
|
+
"Prints new items to the console.") do |pretend|
|
33
|
+
options.pretend = pretend
|
34
|
+
end
|
35
|
+
end
|
36
|
+
opts.parse!(args)
|
37
|
+
|
38
|
+
options
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class FakeServer
|
2
|
+
|
3
|
+
attr_reader :connected
|
4
|
+
|
5
|
+
def initialize(params)
|
6
|
+
puts "Would connect to #{params[:host]}:#{params[:port]}, with ssl? #{params[:use_ssl]}"
|
7
|
+
puts "Would login with #{params[:user]}/#{params[:pass]}"
|
8
|
+
end
|
9
|
+
|
10
|
+
def disconnect
|
11
|
+
end
|
12
|
+
|
13
|
+
def send(message, folder="INBOX")
|
14
|
+
puts "Send message to folder #{folder}: #{message.title}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_folder(folder)
|
18
|
+
end
|
19
|
+
|
20
|
+
def has_folder?(folder)
|
21
|
+
true
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
FeedUrl = Struct.new(:name, :url)
|
2
|
+
|
3
|
+
class FeedFolder
|
4
|
+
attr_accessor :name, :children, :urls
|
5
|
+
|
6
|
+
def initialize(name)
|
7
|
+
@name = name
|
8
|
+
@children = []
|
9
|
+
@urls = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_sub(child)
|
13
|
+
@children << child
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_url(url)
|
17
|
+
@urls << url
|
18
|
+
end
|
19
|
+
|
20
|
+
def [](index)
|
21
|
+
@children[index]
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'simple-rss'
|
4
|
+
require 'htmlentities'
|
5
|
+
require 'iconv'
|
6
|
+
|
7
|
+
$KCODE="U"
|
8
|
+
|
9
|
+
# Overwrite SimpleRSS::unescape because of an open bug(#10852)
|
10
|
+
class SimpleRSS
|
11
|
+
def unescape(content)
|
12
|
+
content.gsub(/(<!\[CDATA\[|\]\]>)/,'').strip
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class FeedReader
|
17
|
+
attr_reader :messages
|
18
|
+
|
19
|
+
def initialize(feed_url)
|
20
|
+
@feed_url = feed_url
|
21
|
+
@feed = SimpleRSS.parse(open(feed_url))
|
22
|
+
|
23
|
+
@encoding = @feed.source[/encoding=["'](.*?)["']/, 1]
|
24
|
+
if not @encoding
|
25
|
+
$log.warn "No encoding found for #{feed_url}, defaulting to UTF-8."
|
26
|
+
@encoding = "UTF-8"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def conv(str)
|
31
|
+
Iconv.iconv("UTF-8", @encoding, str).first
|
32
|
+
rescue Iconv::IllegalSequence => e
|
33
|
+
$log.error "IConv reports an IllegalSequence: #{e.message} from #{str}"
|
34
|
+
return str
|
35
|
+
end
|
36
|
+
|
37
|
+
def number_of_entries
|
38
|
+
@feed.entries.size
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_new(archive)
|
42
|
+
return [] if not @feed
|
43
|
+
|
44
|
+
archive ||= []
|
45
|
+
if archive.include?("")
|
46
|
+
$log.warn "Title is empty, that should never happen! Aborting #{@feed_url}."
|
47
|
+
return []
|
48
|
+
end
|
49
|
+
|
50
|
+
messages = []
|
51
|
+
@feed.entries.each do |item|
|
52
|
+
|
53
|
+
body = conv(item.content_encoded || item.content ||
|
54
|
+
item.summary || item.description)
|
55
|
+
message = Message.new(
|
56
|
+
:title => conv(item.title),
|
57
|
+
:time => time_from(item),
|
58
|
+
:body => body,
|
59
|
+
:from => conv(item.author),
|
60
|
+
:url => conv(item.link)
|
61
|
+
)
|
62
|
+
|
63
|
+
item_identifier = message.generate_identifier
|
64
|
+
|
65
|
+
if archive.include? item_identifier
|
66
|
+
short_name = message.title[0..30]
|
67
|
+
short_name << "…" if message.title.length > 30
|
68
|
+
$log.debug "Already have '#{short_name}'."
|
69
|
+
else
|
70
|
+
messages << message
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
messages
|
75
|
+
end
|
76
|
+
|
77
|
+
def time_from item
|
78
|
+
return nil if not item
|
79
|
+
item.published || item.pubDate || item.date_published || item.updated || nil
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'uri'
|
3
|
+
require 'net/http'
|
4
|
+
require 'ftools'
|
5
|
+
|
6
|
+
require 'imap-feeder/opmlreader'
|
7
|
+
|
8
|
+
class ImapFeederConfig
|
9
|
+
def self.create(opml_file, root_folder)
|
10
|
+
|
11
|
+
root_folder = root_folder ? "INBOX.#{root_folder}" : "INBOX"
|
12
|
+
|
13
|
+
if opml_file
|
14
|
+
items = process(OpmlReader.get(File.open(opml_file)), "#{root_folder}").flatten
|
15
|
+
else
|
16
|
+
items = [
|
17
|
+
{"feed" => {"url" => "http://rubyforge.org/export/rss_sfnews.php", "path" => "#{root_folder}.rubyforge"}},
|
18
|
+
{"feed" => {"url" => "http://feeds.feedburner.com/DilbertDailyStrip", "path" => "#{root_folder}.dilbert"}}
|
19
|
+
]
|
20
|
+
end
|
21
|
+
|
22
|
+
File.open("#{Dir.pwd}/feeds.yml", "w+") do |file|
|
23
|
+
YAML.dump(items, file)
|
24
|
+
end
|
25
|
+
|
26
|
+
File.copy "#{File.dirname(__FILE__)}/../../settings.rb.example", "#{Dir.pwd}/settings.rb"
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.check(configuration)
|
30
|
+
YAML.load(configuration).each do |conf_item|
|
31
|
+
check_url_connection(conf_item['feed']['url'])
|
32
|
+
check_path_name(conf_item['feed']['path'])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def self.process(folder, parent_path)
|
38
|
+
items = []
|
39
|
+
path = parent_path + folder.name
|
40
|
+
|
41
|
+
folder.urls.each do |child|
|
42
|
+
feed_path = "#{path}.#{child.name}"
|
43
|
+
$log.debug "#{feed_path}: #{child.url}"
|
44
|
+
items << {"feed" => {"url" => child.url, "path" => feed_path}}
|
45
|
+
end
|
46
|
+
|
47
|
+
folder.children.each do |child|
|
48
|
+
items << process(child, path + '.')
|
49
|
+
end
|
50
|
+
items
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.check_url_connection(url)
|
54
|
+
begin
|
55
|
+
uri = URI.parse url
|
56
|
+
uri.path = "/" if uri.path.empty?
|
57
|
+
|
58
|
+
response = Net::HTTP.new(uri.host, uri.port).head(uri.path, nil)
|
59
|
+
if response.code =~ /^[^2]\d/
|
60
|
+
$log.info "Connecting to #{url}: #{response.message}, code: #{response.code}"
|
61
|
+
else
|
62
|
+
$log.info "Connecting to #{url}: OK"
|
63
|
+
end
|
64
|
+
rescue Exception => e
|
65
|
+
$log.warn "Exception while connecting to #{url}: #{e}."
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.check_path_name(path)
|
70
|
+
path.scan(/[^#{IMAP_CHARS}\.]+/) do |char|
|
71
|
+
$log.error "Invalid character found in \'#{path}\': #{char}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|