Skip to content

Instantly share code, notes, and snippets.

@shurizzle
Created March 23, 2012 14:46
Show Gist options
  • Save shurizzle/2171333 to your computer and use it in GitHub Desktop.
Save shurizzle/2171333 to your computer and use it in GitHub Desktop.
short, simple version
#!/usr/bin/env ruby
# Please insert this in your crontab
# 0 * * * * /path/to/script
CONFIG = {
host: 'smtp.gmail.com',
port: 587,
user: 'shura1991',
pass: '******',
sender: 'shura1991@gmail.com',
dest: 'shura1991@gmail.com'
}
require 'net/http'
require 'openssl'
require 'net/smtp'
require 'geokit'
# Net::SMTP starttls support {{{
Net::SMTP.class_eval do
private
def do_start(helodomain, user, secret, authtype)
raise IOError, 'SMTP session already started' if @started
if RUBY_VERSION > "1.8.6"
check_auth_args user, secret if user or secret
else
check_auth_args user, secret, authtype if user or secret
end
sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
@socket = Net::InternetMessageIO.new(sock)
@socket.read_timeout = 60 #@read_timeout
check_response(critical { recv_response() })
do_helo(helodomain)
if starttls
raise 'openssl library not installed' unless defined?(OpenSSL)
ssl = OpenSSL::SSL::SSLSocket.new(sock)
ssl.sync_close = true
ssl.connect
@socket = Net::InternetMessageIO.new(ssl)
@socket.read_timeout = 60 #@read_timeout
do_helo(helodomain)
end
authenticate user, secret, authtype if user
@started = true
ensure
unless @started
# authentication failed, cancel connection.
@socket.close if not @started and @socket and not @socket.closed?
@socket = nil
end
end
def do_helo(helodomain)
begin
if @esmtp
ehlo helodomain
else
helo helodomain
end
rescue Net::ProtocolError
if @esmtp
@esmtp = false
@error_occured = false
retry
end
raise
end
end
def starttls
getok('STARTTLS') rescue return false
return true
end
def quit
begin
getok('QUIT')
rescue EOFError
end
end
end
# }}}
ip = Net::HTTP.get(URI.parse('http://checkip.dyndns.org/')).match(/((?:[0-9]{1,3}\.){3}[0-9]{1,3})/) ? $1 : nil
if Geokit::Geocoders::YahooGeocoder.geocode(ip).country_code.upcase != "IT"
Net::SMTP.start(CONFIG[:host], CONFIG[:port], Socket.gethostname, CONFIG[:user], CONFIG[:pass], :login) do |smtp|
message = <<EOF
From: Son <#{CONFIG[:sender]}>
To: Mom <#{CONFIG[:dest]}>
Subject: Tits
WANT MOAR TITS
EOF
smtp.send_message message, CONFIG[:sender], CONFIG[:dest]
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment