module MailCatcher

Constants

VERSION

Public Instance Methods

browse(url) click to toggle source
# File lib/mail_catcher.rb, line 41
def browse url
  if windows?
    system "start", "/b", url
  elsif which "open"
    system "open", url
  end
end
browse?() click to toggle source
# File lib/mail_catcher.rb, line 37
def browse?
  windows? or which "open"
end
growl?() click to toggle source
# File lib/mail_catcher.rb, line 33
def growl?
  growlnotify?
end
growlnotify?() click to toggle source
# File lib/mail_catcher.rb, line 29
def growlnotify?
  which "growlnotify"
end
mac?() click to toggle source
# File lib/mail_catcher.rb, line 17
def mac?
  RbConfig::CONFIG['host_os'] =~ /darwin/
end
macruby?() click to toggle source
# File lib/mail_catcher.rb, line 25
def macruby?
  mac? and const_defined? :MACRUBY_VERSION
end
options() click to toggle source
# File lib/mail_catcher.rb, line 62
def options
  @@options rescue @@defaults
end
parse!(arguments=ARGV, defaults=@defaults) click to toggle source
# File lib/mail_catcher.rb, line 70
def parse! arguments=ARGV, defaults=@defaults
  @@defaults.dup.tap do |options|
    OptionParser.new do |parser|
      parser.banner = "Usage: mailcatcher [options]"
      parser.version = VERSION

      parser.on("--ip IP", "Set the ip address of both servers") do |ip|
        options[:smtp_ip] = options[:http_ip] = ip
      end

      parser.on("--smtp-ip IP", "Set the ip address of the smtp server") do |ip|
        options[:smtp_ip] = ip
      end

      parser.on("--smtp-port PORT", Integer, "Set the port of the smtp server") do |port|
        options[:smtp_port] = port
      end

      parser.on("--http-ip IP", "Set the ip address of the http server") do |ip|
        options[:http_ip] = ip
      end

      parser.on("--http-port PORT", Integer, "Set the port address of the http server") do |port|
        options[:http_port] = port
      end

      parser.on("--no-quit", "Don't allow quitting the process") do
        options[:quit] = false
      end

      if mac?
        parser.on("--[no-]growl", "Growl to the local machine when a message arrives") do |growl|
          if growl and not growlnotify?
            puts "You'll need to install growlnotify from the Growl installer."
            puts
            puts "See: http://growl.info/extras.php#growlnotify"
            exit -2
          end

          options[:growl] = growl
        end
      end

      unless windows?
        parser.on('-f', '--foreground', 'Run in the foreground') do
          options[:daemon] = false
        end
      end

      if browse?
        parser.on('-b', '--browse', 'Open web browser') do
          options[:browse] = true
        end
      end

      parser.on('-v', '--verbose', 'Be more verbose') do
        options[:verbose] = true
      end

      parser.on('-h', '--help', 'Display this help information') do
        puts parser
        exit
      end
    end.parse!
  end
end
quit!() click to toggle source
# File lib/mail_catcher.rb, line 192
def quit!
  EventMachine.next_tick { EventMachine.stop_event_loop }
end
quittable?() click to toggle source
# File lib/mail_catcher.rb, line 66
def quittable?
  options[:quit]
end
run!(options=nil) click to toggle source
# File lib/mail_catcher.rb, line 137
def run! options=nil
  # If we are passed options, fill in the blanks
  options &&= options.reverse_merge @@defaults
  # Otherwise, parse them from ARGV
  options ||= parse!

  # Stash them away for later
  @@options = options

  puts "Starting MailCatcher"

  #Thin::Logging.silent = true

  # One EventMachine loop...
  EventMachine.run do
    # Get our lion on if asked
    MailCatcher::Growl.start if options[:growl]

    smtp_url = "smtp://#{options[:smtp_ip]}:#{options[:smtp_port]}"
    http_url = "http://#{options[:http_ip]}:#{options[:http_port]}"

    # Set up an SMTP server to run within EventMachine
    rescue_port options[:smtp_port] do
      EventMachine.start_server options[:smtp_ip], options[:smtp_port], Smtp
      puts "==> #{smtp_url}"
    end

    # Let Thin set itself up inside our EventMachine loop
    # (Skinny/WebSockets just works on the inside)
    # rescue_port options[:http_port] do
      #Thin::Server.start options[:http_ip], options[:http_port], Web
      # puts "==> #{http_url}"
    # end

    # Open the web browser before detatching console
    if options[:browse]
      EventMachine.next_tick do
        browse http_url
      end
    end

    # Daemonize, if we should, but only after the servers have started.
    if options[:daemon]
      EventMachine.next_tick do
        if quittable?
          puts "*** MailCatcher runs as a daemon by default. Go to the web interface to quit."
        else
          puts "*** MailCatcher is now running as a daemon that cannot be quit."
        end
        #Process.daemon
      end
    end
  end
end
which(command) click to toggle source
# File lib/mail_catcher.rb, line 11
def which command
  not windows? and Open3.popen3 'which', 'command' do |stdin, stdout, stderr|
    return stdout.read.chomp.presence
  end
end
windows?() click to toggle source
# File lib/mail_catcher.rb, line 21
def windows?
  RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
end

Protected Instance Methods

rescue_port(port) { || ... } click to toggle source
# File lib/mail_catcher.rb, line 198
def rescue_port port
  begin
    yield

  # XXX: EventMachine only spits out RuntimeError with a string description
  rescue RuntimeError
    if $!.to_s =~ /\bno acceptor\b/
      puts "~~> ERROR: Something's using port #{port}. Are you already running MailCatcher?"
      exit -1
    else
      raise
    end
  end
end