net-smtp-proxy
Proxy support for Ruby's Net::SMTP library.
Installation
gem install net-smtp-proxy
or put it in your Gemfile:
gem 'net-smtp-proxy'
Once it's available in your project, require it like so:
require 'net/smtp/proxy'
What is this Thing?
This gem allows you to connect to an SMTP server by way of an HTTP proxy. Why would you want to do that? I'm sure a number of use-cases exist, but I specifically needed to connect to the Gmail SMTP relay service in order to send an email from a company-wide alias. Normally, Gmail requires you to provide the credentials for the sender's account when sending an email. The relay service however replaces the usual password authentication with IP whitelisting. You provide Google with a static IP address that all your SMTP requests will come from. The SMTP relay service also allows you to send email from company-wide email aliases, i.e. accounts that don't have a login. In our case, we wanted to send an email from the Platform Engineering Team as opposed to one specific member of that team. We already had Squid set up as a reverse proxy with a static IP, so we whitelisted the IP with Google and wrote this gem to send SMTP requests through the proxy.
Usage
Instantiate an instance of the Proxy
class and use it to make SMTP requests:
address = 'smtp-relay.gmail.com'
port = 587
proxy_address = 'http://myproxy.mydomain.com'
proxy_port = 1234
proxy = Net::SMTP::Proxy.new(address, port, proxy_address, proxy_port)
proxy.start do |smtp|
smtp.helo('mydomain.com')
end
You can also use the .start
method to accomplish the same thing:
Net::SMTP::Proxy.start(address, port, proxy_address, proxy_port) do |smtp|
smtp.helo('mydomain.com')
end
Integration with the Mail Gem
The DeliveryMethod
class provides an easy way to integrate with the Mail gem. Simply pass the class in as the delivery method, providing the same options hash you would pass to the SMTP delivery method (plus the proxy options):
Mail.deliver do
delivery_method Net::SMTP::Proxy::DeliveryMethod, {
address: address,
port: port,
proxy_address: proxy_address,
proxy_port: proxy_port,
domain: 'mydomain.com'
}
from 'from@mydomain.com'
to 'to@mydomain.com'
subject 'Mail is cool'
body "Look ma, I'm sending email!"
end
License
Licensed under the MIT license. See LICENSE for details.
Authors