module Mailcatcher

Constants

VERSION

Public Instance Methods

browse(url) click to toggle source
# File lib/mail_catcher.rb, line 48
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 44
def browse?
  windows? or which "open"
end
mac?() click to toggle source
# File lib/mail_catcher.rb, line 32
def mac?
  RbConfig::CONFIG['host_os'] =~ /darwin/
end
macruby?() click to toggle source
# File lib/mail_catcher.rb, line 40
def macruby?
  mac? and const_defined? :MACRUBY_VERSION
end
options() click to toggle source
# File lib/mail_catcher.rb, line 67
def options
  @@options
end
parse!(arguments=ARGV, defaults=@defaults) click to toggle source
# File lib/mail_catcher.rb, line 75
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") do |growl|
          puts "Growl is no longer supported"
          exit -2
        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 193
def quit!
  EventMachine.next_tick { EventMachine.stop_event_loop }
end
quittable?() click to toggle source
# File lib/mail_catcher.rb, line 71
def quittable?
  options[:quit]
end
run!(options=nil) click to toggle source
# File lib/mail_catcher.rb, line 136
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

  # If we're running in the foreground sync the output.
  unless options[:daemon]
    $stdout.sync = $stderr.sync = true
  end

  puts "Starting MailCatcher"

  Thin::Logging.silent = (ENV["MAILCATCHER_ENV"] != "development")

  # One EventMachine loop...
  EventMachine.run do
    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 26
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 36
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 199
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