vpopmail 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,99 @@
1
- require 'log4r'
2
- require 'vpopmail'
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Copyright 2006 (c) Gildas Cherruel
4
+ # All rights reserved.
5
+ # See LICENSE.txt for permissions.
6
+ #++
3
7
 
4
- logname = File.basename(__FILE__, '.rb')
5
- log = Log4r::Logger.new(logname)
6
- log.add(Log4r::FileOutputter.new(logname, :filename => logname + '.log', :level => Log4r::DEBUG))
7
- VPOPMail::logger = log
8
+ require 'rubygems'
9
+ require 'getoptlong'
10
+ require_gem 'vpopmail'
8
11
 
9
- log.info "Starting emailcheck"
10
- valid = VPOPMail::Message.validAddress?(ARGV[0], 'postmaster@breizh.org')
11
- puts "Address #{ARGV[0]} is " + (valid ? "valid" : "invalid")
12
+ $APPNAME = File::basename(__FILE__, '.rb')
13
+ $log = nil
14
+ $VERBOSE = true
15
+ $OPTS = GetoptLong.new(
16
+ ["--domain", "-d", GetoptLong::REQUIRED_ARGUMENT],
17
+ ["--help", "-h", GetoptLong::NO_ARGUMENT],
18
+ ["--log", GetoptLong::OPTIONAL_ARGUMENT],
19
+ ["--silent", "-s", GetoptLong::NO_ARGUMENT],
20
+ ["--verbose", "-v", GetoptLong::NO_ARGUMENT])
21
+
22
+ #------------------------------------------------------------------------------------------
23
+ # function: Verbose {{{
24
+ def Verbose(p_string)
25
+ $log.info p_string if !$log.nil?
26
+ puts p_string if $VERBOSE
27
+ end # }}}
28
+
29
+ #------------------------------------------------------------------------------------------
30
+ # function: usage {{{
31
+ def usage(p_error = nil, p_errno = 0, p_wantQuit = true)
32
+ puts "Usage: #{__FILE__} [options] [email_address]"
33
+ puts "Error: #{p_error}" if ! p_error.nil?
34
+ puts "Options:"
35
+ puts " -d domain, --domain=domain Sets the domain to use when querying remote Mail servers"
36
+ puts " -h, --help Prints this help."
37
+ puts " --log[=file], -l [file] Will log in [file] or /var/log/#{$APPNAME}.log"
38
+ puts " The application does not log by default."
39
+ puts " -s, --silent Proceed silently."
40
+ puts " -v, --verbose Proceed verbosely."
41
+ exit p_errno if p_wantQuit
42
+ end # }}}
43
+
44
+ #------------------------------------------------------------------------------------------
45
+ # function: find_domain {{{
46
+ def find_postmaster(p_domainname = nil)
47
+ if p_domainname.nil? or p_domainname.empty? then
48
+ begin
49
+ IO.foreach('/etc/resolv.conf') do |line|
50
+ line.gsub!(/\s*[;#].*/,"")
51
+ next unless line =~ /\S/
52
+ case line
53
+ when /^\s*domain\s+(\S+)/
54
+ p_domainname = $1
55
+ break
56
+ when /^\s*search\s+(.*)/
57
+ p_domainname = $1.split(" ").first
58
+ break
59
+ end
60
+ end
61
+ rescue
62
+ p_domainname= 'localdomain'
63
+ end
64
+ end
65
+ return "postmaster@#{p_domainname}"
66
+ end # }}}
67
+
68
+ #------------------------------------------------------------------------------------------
69
+ # main {{{
70
+ domainname = nil
71
+ logfile = nil
72
+
73
+ $OPTS.each {|opt, arg| # {{{
74
+ case opt
75
+ when "--domain" then domainname = arg
76
+ when "--help" then usage()
77
+ when "--log" then logfile = arg.empty? ? "/var/log/qmail/#{$APPNAME}.log" : arg
78
+ when "--silent" then $VERBOSE = false
79
+ when "--verbose" then $VERBOSE = true
80
+ end
81
+ } # }}}
82
+
83
+ if !logfile.nil? then
84
+ require 'logger'
85
+ $log = Logger.new(logfile)
86
+ VPOPMail::logger = $log
87
+ $log.info "=========================== Starting #{$APPNAME}"
88
+ end
89
+
90
+ if ARGV.size == 0 then
91
+ $log.error "There is no email to validate!" if !$log.nil?
92
+ usage("Missing email address argument")
93
+ exit 1
94
+ end
95
+ address = ARGV[0]
96
+ valid = VPOPMail::Message.validAddress?(address, find_postmaster(domainname))
97
+ Verbose "Address #{address} is " + (valid ? "valid" : "invalid")
98
+ exit valid ? 0 : 1
99
+ # }}}
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Copyright 2006 (c) Gildas Cherruel
4
+ # All rights reserved.
5
+ # See LICENSE.txt for permissions.
6
+ #++
7
+
8
+ require 'rubygems'
9
+ require 'getoptlong'
10
+ require 'net/smtp'
11
+ require_gem 'vpopmail'
12
+
13
+ $APPNAME = File::basename(__FILE__, '.rb')
14
+ $log = nil
15
+ $dryrun = false
16
+ $VERBOSE = true
17
+ $OPTS = GetoptLong.new(
18
+ ["--domain", "-d", GetoptLong::REQUIRED_ARGUMENT],
19
+ ["--folder", "-f", GetoptLong::REQUIRED_ARGUMENT],
20
+ ["--user", "-u", GetoptLong::REQUIRED_ARGUMENT],
21
+
22
+ ["--dry-run", "-n", GetoptLong::NO_ARGUMENT],
23
+ ["--help", "-h", GetoptLong::NO_ARGUMENT],
24
+ ["--log", GetoptLong::OPTIONAL_ARGUMENT],
25
+ ["--silent", "-s", GetoptLong::NO_ARGUMENT],
26
+ ["--verbose", "-v", GetoptLong::NO_ARGUMENT])
27
+
28
+ #------------------------------------------------------------------------------------------
29
+ # function: Verbose {{{
30
+ def Verbose(p_string)
31
+ $log.info p_string if !$log.nil?
32
+ puts p_string if $VERBOSE
33
+ end # }}}
34
+
35
+ #------------------------------------------------------------------------------------------
36
+ # function: usage {{{
37
+ def usage(p_error = nil, p_errno = 0, p_wantQuit = true)
38
+ puts "Usage: #{__FILE__} [options]"
39
+ puts "Error: #{p_error}" if ! p_error.nil?
40
+ puts "Options:"
41
+ puts " -d domain, --domain=domain Will work only on this vpopmail domain. (Default: all)"
42
+ puts " -f folder, --folder=folder Will work only on this vpopmail folder. (Default: inbox)"
43
+ puts " -u user, --user=user Will work only on this vpopmail user. (Default: all)"
44
+ puts " -h, --help Prints this help."
45
+ puts " --log[=file], -l [file] Will log in [file] or /var/log/#{$APPNAME}.log"
46
+ puts " The application does not log by default."
47
+ puts " -n, --dry-run Do not delete any message."
48
+ puts " -s, --silent Proceed silently."
49
+ puts " -v, --verbose Proceed verbosely."
50
+ exit p_errno if p_wantQuit
51
+ end # }}}
52
+
53
+ #------------------------------------------------------------------------------------------
54
+ # function: validate {{{
55
+ def validate(p_message, p_folder, p_cache = {})
56
+ Verbose "Processing: #{p_message.id}"
57
+ email = p_message.header.reply_to.first
58
+ email = RMail::Address.parse(p_message.header["Return-Path"])[0] if email.nil?
59
+ begin
60
+ valid = p_cache.include?(email) ? p_cache[email] : p_message.validAddress?(email)
61
+ p_cache[email] = valid
62
+ Verbose "address: #{email.address} is " + (valid ? "valid" : "invalid")
63
+ p_message.deleteFrom(p_folder) if !$dryrun && !valid
64
+ rescue Net::SMTPServerBusy =>p_e
65
+ Verbose "Impossible to validate address #{email.address}, #{p_e}"
66
+ end
67
+ return p_cache
68
+ end # }}}
69
+
70
+ #------------------------------------------------------------------------------------------
71
+ # main {{{
72
+ domainname = nil
73
+ foldername = nil
74
+ username = nil
75
+ logfile = nil
76
+
77
+ $OPTS.each {|opt, arg| # {{{
78
+ case opt
79
+ when "--domain" then domainname = arg
80
+ when "--folder" then foldername = arg
81
+ when "--user" then username = arg
82
+
83
+ when "--dry-run" then $dryrun = true
84
+ when "--help" then usage()
85
+ when "--log" then logfile = arg.empty? ? "/var/log/qmail/#{$APPNAME}.log" : arg
86
+ when "--silent" then $VERBOSE = false
87
+ when "--verbose" then $VERBOSE = true
88
+ end
89
+ } # }}}
90
+
91
+ if !logfile.nil? then
92
+ require 'logger'
93
+ $log = Logger.new(logfile)
94
+ VPOPMail::logger = $log
95
+ $log.info "=========================== Starting #{$APPNAME}"
96
+ end
97
+
98
+ if domainname.nil? and username =~ /(.*)@(.*)/ then
99
+ username = $1
100
+ domainname = $2
101
+ end
102
+
103
+ if !domainname.nil? and !username.nil? then
104
+ domain = VPOPMail::Domain.FindDomains(domainname)[0]
105
+ Verbose "Analyzing domain #{domain.name}"
106
+ user = VPOPMail::User.FindUsers(domain, username)[0]
107
+ Verbose "Analyzing user #{user.name}"
108
+ folder = VPOPMail::Folder.new(user, foldername)
109
+ Verbose "Analyzing folder #{folder}, size = #{folder.size}"
110
+ messageid = ARGV.size == 0 ? nil : ARGV[0]
111
+
112
+ if !messageid.nil? and !messageid.empty? then
113
+ message = VPOPMail::Message.new(folder, messageid)
114
+ validate(message, folder)
115
+ else
116
+ cache = {}
117
+ folder.each {|message| cache = validate(message, folder, cache) }
118
+ end
119
+ else
120
+ cache = {}
121
+ VPOPMail::Domain.FindDomains.each { |domain|
122
+ Verbose "Analyzing domain #{domain.name}"
123
+ VPOPMail::User.FindUsers(domain).each { |user|
124
+ Verbose "Analyzing user #{user.name}"
125
+ folder = VPOPMail::Folder.new(user) # Opening the inbox
126
+ Verbose "Analyzing folder #{folder}, size = #{folder.size}"
127
+ folder.each {|message| cache = validate(message, folder, cache) }
128
+ }
129
+ }
130
+ end
131
+ exit 0
@@ -1,47 +1,67 @@
1
1
  #!/usr/bin/env ruby
2
+ #--
3
+ # Copyright 2006 (c) Gildas Cherruel
4
+ # All rights reserved.
5
+ # See LICENSE.txt for permissions.
6
+ #++
7
+
8
+ require 'rubygems'
2
9
  require 'getoptlong'
3
- require 'vpopmail'
10
+ require_gem 'vpopmail'
4
11
 
5
12
  $CFG = { "Junk Folder" => "Junk E-mails",
6
- "Learn SPAM Folder" => "Learn Junk",
7
- "Learn HAM Folder" => "Learn Good",
8
- "archive user" => "postmaster",
9
- "archive SPAM Folder" => "SPAM",
10
- "archive HAM Folder" => "HAM",
11
- }
13
+ "Learn SPAM Folder" => "Learn Junk",
14
+ "Learn HAM Folder" => "Learn Good",
15
+ "archive user" => "postmaster",
16
+ "archive SPAM Folder" => "SPAM",
17
+ "archive HAM Folder" => "HAM",
18
+ }
12
19
 
20
+ $APPNAME = File::basename(__FILE__, '.rb')
21
+ $log = nil
22
+ $dryrun = false
13
23
  $VERBOSE = true
14
24
  $OPTS = GetoptLong.new(
15
25
  ["--domain", "-d", GetoptLong::REQUIRED_ARGUMENT],
16
26
  ["--folder", "-f", GetoptLong::REQUIRED_ARGUMENT],
17
27
  ["--ham", GetoptLong::NO_ARGUMENT],
18
- ["--help", "-h", GetoptLong::NO_ARGUMENT],
19
- ["--silent", "-s", GetoptLong::NO_ARGUMENT],
20
28
  ["--spam", GetoptLong::NO_ARGUMENT],
21
29
  ["--user", "-u", GetoptLong::REQUIRED_ARGUMENT],
30
+
31
+ ["--dry-run", "-n", GetoptLong::NO_ARGUMENT],
32
+ ["--help", "-h", GetoptLong::NO_ARGUMENT],
33
+ ["--log", GetoptLong::OPTIONAL_ARGUMENT],
34
+ ["--silent", "-s", GetoptLong::NO_ARGUMENT],
22
35
  ["--verbose", "-v", GetoptLong::NO_ARGUMENT])
23
36
 
24
37
  #------------------------------------------------------------------------------------------
25
38
  # function: Verbose {{{
26
39
  def Verbose(p_string)
40
+ $log.info p_string if !$log.nil?
27
41
  puts p_string if $VERBOSE
28
42
  end # }}}
29
43
 
44
+ #------------------------------------------------------------------------------------------
30
45
  # function: usage {{{
31
46
  def usage(p_error = nil, p_errno = 0, p_wantQuit = true)
32
- puts "Usage: vlearn.rb [options] [filename]"
47
+ puts "Usage: #{__FILE__} [options] [filename]"
33
48
  puts "Error: #{p_error}" if ! p_error.nil?
34
49
  puts "Options:"
35
50
  puts " -d domain, --domain=domain Will work only on this vpopmail domain. (Default: all)"
51
+ puts " -f folder, --folder=folder Will work only on this vpopmail folder. (Default: inbox)"
36
52
  puts " -u user, --user=user Will work only on this vpopmail user. (Default: all)"
37
53
  puts " --ham Will consider messages as good messages"
38
54
  puts " --spam Will consider messages as spam/junk messages"
39
55
  puts " -h, --help Prints this help."
56
+ puts " --log[=file], -l [file] Will log in [file] or /var/log/#{$APPNAME}.log"
57
+ puts " The application does not log by default."
58
+ puts " -n, --dry-run Do not delete any message."
40
59
  puts " -s, --silent Proceed silently."
41
60
  puts " -v, --verbose Proceed verbosely."
42
61
  exit p_errno if p_wantQuit
43
62
  end # }}}
44
63
 
64
+ #------------------------------------------------------------------------------------------
45
65
  # function: loadFolder {{{
46
66
  def loadFolder(p_user, p_name = nil)
47
67
  begin
@@ -52,24 +72,41 @@ def loadFolder(p_user, p_name = nil)
52
72
  end
53
73
  end # }}}
54
74
 
75
+ #------------------------------------------------------------------------------------------
55
76
  # main {{{
56
77
  domainname = nil
57
78
  foldername = nil
58
79
  username = nil
59
80
  kind = nil
81
+ logfile = nil
60
82
 
61
- $OPTS.each {|opt, arg|
83
+ $OPTS.each {|opt, arg| # {{{
62
84
  case opt
63
85
  when "--domain" then domainname = arg
64
86
  when "--folder" then foldername = arg
65
87
  when "--user" then username = arg
66
88
  when "--ham" then kind = "ham"
67
89
  when "--spam" then kind = "spam"
90
+
91
+ when "--dry-run" then $dryrun = true
68
92
  when "--help" then usage()
93
+ when "--log" then logfile = arg.empty? ? "/var/log/qmail/#{$APPNAME}.log" : arg
69
94
  when "--silent" then $VERBOSE = false
70
95
  when "--verbose" then $VERBOSE = true
71
96
  end
72
- }
97
+ } # }}}
98
+
99
+ if !logfile.nil? then
100
+ require 'logger'
101
+ $log = Logger.new(logfile)
102
+ VPOPMail::logger = $log
103
+ $log.info "=========================== Starting #{$APPNAME}"
104
+ end
105
+
106
+ if domainname.nil? and username =~ /(.*)@(.*)/ then
107
+ username = $1
108
+ domainname = $2
109
+ end
73
110
 
74
111
  if !domainname.nil? and !username.nil? and !foldername.nil? then
75
112
  domain = VPOPMail::Domain.FindDomains(domainname)[0]
@@ -3,7 +3,7 @@
3
3
  # Read COPYRIGHT in the root of VPOPMail library for copyright info
4
4
  # Creator: gildasc@rubyforg.org
5
5
  # Author: $Author: gildasc $
6
- # Version: $Id: vpopmail.rb 4 2006-10-07 23:18:13Z gildasc $
6
+ # Version: $Id: vpopmail.rb 12 2006-10-09 08:49:52Z gildasc $
7
7
  #++
8
8
 
9
9
  $:.unshift(File.dirname(__FILE__)) unless
@@ -27,8 +27,8 @@ module VPOPMail
27
27
  module VERSION #:nodoc:
28
28
  MAJOR = 1
29
29
  MINOR = 0
30
- TINY = 0
31
- BUILD = %q$Id: vpopmail.rb 4 2006-10-07 23:18:13Z gildasc $
30
+ TINY = 1
31
+ BUILD = %q$Id: vpopmail.rb 12 2006-10-09 08:49:52Z gildasc $
32
32
  STRING = [MAJOR, MINOR, TINY].join('.')
33
33
  end # }}}
34
34
 
@@ -3,7 +3,7 @@
3
3
  # Read COPYRIGHT in the root of VPOPMail library for copyright info
4
4
  # Creator: gildasc@rubyforg.org
5
5
  # Author: $Author: gildasc $
6
- # Version: $Id: domain.rb 4 2006-10-07 23:18:13Z gildasc $
6
+ # Version: $Id: domain.rb 7 2006-10-08 21:06:36Z gildasc $
7
7
  #++
8
8
 
9
9
  require 'rmail'
@@ -30,7 +30,7 @@ class Domain
30
30
  @@logger = nil
31
31
  def self.logger ; @@logger ; end
32
32
  def self.logger=(p_object) ; @@logger = p_object ; end
33
- def logger(p_object) ; @@logger ; end
33
+ def logger ; @@logger ; end
34
34
  def logger=(p_object) ; @@logger = p_object ; end
35
35
  # }}}
36
36
 
@@ -3,7 +3,7 @@
3
3
  # Read COPYRIGHT in the root of VPOPMail library for copyright info
4
4
  # Creator: gildasc@rubyforg.org
5
5
  # Author: $Author: gildasc $
6
- # Version: $Id: folder.rb 4 2006-10-07 23:18:13Z gildasc $
6
+ # Version: $Id: folder.rb 7 2006-10-08 21:06:36Z gildasc $
7
7
  #++
8
8
 
9
9
  require 'rexml/document'
@@ -31,7 +31,7 @@ class Folder
31
31
  @@logger = nil
32
32
  def self.logger ; @@logger ; end
33
33
  def self.logger=(p_object) ; @@logger = p_object ; end
34
- def logger(p_object) ; @@logger ; end
34
+ def logger ; @@logger ; end
35
35
  def logger=(p_object) ; @@logger = p_object ; end
36
36
  # }}}
37
37
 
@@ -3,7 +3,7 @@
3
3
  # Read COPYRIGHT in the root of VPOPMail library for copyright info
4
4
  # Creator: gildasc@rubyforg.org
5
5
  # Author: $Author: gildasc $
6
- # Version: $Id: imapdb.rb 4 2006-10-07 23:18:13Z gildasc $
6
+ # Version: $Id: imapdb.rb 10 2006-10-09 08:41:47Z gildasc $
7
7
  #++
8
8
 
9
9
  require 'rexml/document'
@@ -30,7 +30,7 @@ class IMAPDB
30
30
  @@logger = nil
31
31
  def self.logger ; @@logger ; end
32
32
  def self.logger=(p_object) ; @@logger = p_object ; end
33
- def logger(p_object) ; @@logger ; end
33
+ def logger ; @@logger ; end
34
34
  def logger=(p_object) ; @@logger = p_object ; end
35
35
  # }}}
36
36
 
@@ -128,7 +128,7 @@ class IMAPDB
128
128
  begin
129
129
  lines = IO.readlines(@filename)
130
130
  rescue Errno::ENOENT
131
- logger.warning "Folder #{@folder.name}: IMAPDB does not exist, nothing to do" if !@@logger.nil?
131
+ logger.warn "Folder #{@folder.name}: IMAPDB does not exist, nothing to do" if !@@logger.nil?
132
132
  return Array.new
133
133
  end
134
134
  if lines[0] !~ /^1 (\d+) (\d+)/ then
@@ -3,7 +3,7 @@
3
3
  # Read COPYRIGHT in the root of VPOPMail library for copyright info
4
4
  # Creator: gildasc@rubyforg.org
5
5
  # Author: $Author: gildasc $
6
- # Version: $Id: message.rb 4 2006-10-07 23:18:13Z gildasc $
6
+ # Version: $Id: message.rb 9 2006-10-09 01:12:10Z gildasc $
7
7
  #++
8
8
 
9
9
  require 'rexml/document'
@@ -27,20 +27,25 @@ class SMTP
27
27
  #--------------------------------------------------------------------------------------
28
28
  # method: validAddress? {{{
29
29
  #++
30
+ #
31
+ # === Possible Exceptions
32
+ # * SMTPServerBusy
30
33
  def validAddress?(p_address, p_local)
31
34
  begin
32
35
  mailfrom p_local
33
36
  rcptto p_address
34
- getok('RSET')
37
+ rescue SMTPServerBusy => p_e
38
+ raise p_e
35
39
  rescue SMTPFatalError
36
- begin
37
- getok('RSET')
38
- rescue
39
- end
40
40
  return false
41
41
  rescue Exception => p_e
42
42
  STDERR.puts "Unknown Error! #{p_e}"
43
43
  return false
44
+ ensure
45
+ begin
46
+ getok('RSET')
47
+ rescue
48
+ end
44
49
  end
45
50
  return true
46
51
  end # }}}
@@ -66,7 +71,7 @@ class Message
66
71
  @@logger = nil
67
72
  def self.logger ; @@logger ; end
68
73
  def self.logger=(p_object) ; @@logger = p_object ; end
69
- def logger(p_object) ; @@logger ; end
74
+ def logger ; @@logger ; end
70
75
  def logger=(p_object) ; @@logger = p_object ; end
71
76
  # }}}
72
77
 
@@ -103,28 +108,44 @@ class Message
103
108
  # This methods queries the DNS of the domain contains in <tt>p_address</tt> for its
104
109
  # MX Servers. Then it will use the SMTP protocol to query the MX servers for the validity
105
110
  # of <tt>p_address</tt>
111
+ #
112
+ # === Possible Exceptions
113
+ # * SMTPServerBusy
106
114
  def self.validAddress?(p_address, p_local)
107
115
  p_address = RMail::Address.parse(p_address)[0] if !p_address.kind_of? RMail::Address
108
116
  p_local = RMail::Address.parse(p_local)[0] if !p_local.kind_of? RMail::Address
109
117
 
110
118
  logger.info "Checking Domain: #{p_address.domain}" if !@@logger.nil?
111
- resolver = Net::DNS::Resolver.new
112
- logger.debug "#{resolver.inspect}"
113
- answer = resolver.query(p_address.domain, Net::DNS::MX)
114
- logger.debug "#{answer.inspect}"
115
- if answer.nil? or answer.header.anCount == 0
116
- logger.warn "No nameserver found for domain: #{resolver.errorstring}" if !@@logger.nil?
119
+ begin
120
+ resolver = Net::DNS::Resolver.new
121
+ answer = resolver.query(p_address.domain, Net::DNS::MX)
122
+ logger.debug "#{answer.inspect}" if !@@logger.nil?
123
+ if answer.nil? or answer.header.anCount == 0
124
+ logger.warn "No nameserver found for domain: #{resolver.errorstring}" if !@@logger.nil?
125
+ return false
126
+ end
127
+ hosts = answer.answer.sort {|x, y| x.preference <=> y.preference}
128
+ rescue Timeout::Error
129
+ logger.error "Timeout while querying #{p_address.domain}" if !@@logger.nil?
130
+ return false
131
+ rescue NameError => p_e
132
+ logger.error "NameError while querying #{p_address.domain}, #{p_e}" if !@@logger.nil?
117
133
  return false
118
134
  end
119
- hosts = answer.answer.sort {|x, y| x.preference <=> y.preference}
120
135
 
121
136
  hosts.each { |host|
122
137
  logger.info "Connecting to MX #{host.exchange}" if !@@logger.nil?
123
138
  begin
124
139
  Net::SMTP.start(host.exchange, 25, p_local.domain) { |smtp|
125
140
  logger.debug "Validating #{p_address.address}" if !@@logger.nil?
126
- return smtp.validAddress?(p_address.address, p_local.address)
141
+ valid = smtp.validAddress?(p_address.address, p_local.address)
142
+ logger.info "#{p_address.address} valid?: #{valid}" if !@@logger.nil?
143
+ return valid
127
144
  }
145
+ rescue Net::SMTPServerBusy => p_e
146
+ # That means the MX Host does not honor the answer
147
+ logger.error "#{host.exchange} replied #{p_e}" if !@@logger.nil?
148
+ raise p_e
128
149
  rescue Errno::ETIMEDOUT => p_e
129
150
  # That means the MX Host does not answer
130
151
  logger.warn "timeout in querying #{host.exchange}" if !@@logger.nil?
@@ -147,6 +168,26 @@ class Message
147
168
  return Message.validAddress?(p_address, @folder.domain.postmaster)
148
169
  end # }}}
149
170
 
171
+ #--------------------------------------------------------------------------------------
172
+ # method: header {{{
173
+ #++
174
+ # Gives the header of the email
175
+ #
176
+ # Returns a RMail::Header object
177
+ def body
178
+ return @rmail.header
179
+ end # }}}
180
+
181
+ #--------------------------------------------------------------------------------------
182
+ # method: body {{{
183
+ #++
184
+ # Gives the body of the email
185
+ #
186
+ # Returns a String or an array of RMail::Message if the Message is a MIME multipart
187
+ def body
188
+ return @rmail.body
189
+ end # }}}
190
+
150
191
  #--------------------------------------------------------------------------------------
151
192
  # method: markAs {{{
152
193
  #++
@@ -206,6 +247,9 @@ class Message
206
247
  # method: load {{{
207
248
  #++
208
249
  # Loads the Message from its file in its <tt>@rmail</tt> attribute (RMail::Message)
250
+ #
251
+ # === Possible Exceptions
252
+ # * Errno::ENOENT
209
253
  def load
210
254
  if @filename == @id then
211
255
  path = @folder.newpath + File::SEPARATOR + @filename
@@ -218,10 +262,15 @@ class Message
218
262
  stat = File.stat(path)
219
263
  @uid = stat.uid
220
264
  @gid = stat.gid
221
- logger.debug "Loaded. uid=#{@uid}, gid=#{@gid}" if !@@logger.nil?
222
- rescue Errno::ENOENT
265
+ if !@@logger.nil? then
266
+ logger.debug "Loaded. uid=#{@uid}, gid=#{@gid}"
267
+ logger.info "Message: #{@id}"
268
+ logger.info "Message From: #{@rmail.header.from.inspect}"
269
+ logger.info "Message Subject: #{@rmail.header.subject}"
270
+ end
271
+ rescue Errno::ENOENT => p_e
223
272
  logger.error "Cannot load #{path}" if !@@logger.nil?
224
- exit -1
273
+ raise p_e
225
274
  end
226
275
  end # }}}
227
276
 
@@ -3,7 +3,7 @@
3
3
  # Read COPYRIGHT in the root of VPOPMail library for copyright info
4
4
  # Creator: gildasc@rubyforg.org
5
5
  # Author: $Author: gildasc $
6
- # Version: $Id: user.rb 4 2006-10-07 23:18:13Z gildasc $
6
+ # Version: $Id: user.rb 7 2006-10-08 21:06:36Z gildasc $
7
7
  #++
8
8
 
9
9
  require 'vpopmail/config'
@@ -25,7 +25,7 @@ class User
25
25
  @@logger = nil
26
26
  def self.logger ; @@logger ; end
27
27
  def self.logger=(p_object) ; @@logger = p_object ; end
28
- def logger(p_object) ; @@logger ; end
28
+ def logger ; @@logger ; end
29
29
  def logger=(p_object) ; @@logger = p_object ; end
30
30
  # }}}
31
31
 
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: vpopmail
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.0.0
7
- date: 2006-10-08
6
+ version: 1.0.1
7
+ date: 2006-10-09
8
8
  summary: Ruby VPOPMail interface
9
9
  require_paths:
10
10
  - lib
@@ -37,6 +37,7 @@ files:
37
37
  - lib/vpopmail/message.rb
38
38
  - lib/vpopmail/user.rb
39
39
  - examples/emailcheck.rb
40
+ - examples/vdelfakemail.rb
40
41
  - examples/vlearn.rb
41
42
  - Rakefile
42
43
  - install.rb