This example shows how to send an email for user signups. You can also checkout this gem for more advanced features.
Let's generate a Mailer class. Mailer classes function as our controllers for email views.
_10rails generate mailer UserNotifierMailer
Now we open up the mailer we've just generated, app/mailers/user_notifier_mailer.rb
and add a mailer action that sends users a signup email.
_10class UserNotifierMailer < ApplicationMailer_10 default :from => 'any_from_address@example.com'_10_10 # send a signup email to the user, pass in the user object that contains the user's email address_10 def send_signup_email(user)_10 @user = user_10 mail( :to => @user.email,_10 :subject => 'Thanks for signing up for our amazing app' )_10 end_10end
Now we need a view that corresponds to our action and outputs HTML for our email. Create a file app/views/user_notifier_mailer/send_signup_email.html.erb
as follows:
_11<!DOCTYPE html>_11<html>_11 <head>_11 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />_11 </head>_11 <body>_11 <h1>Thanks for signing up, <%= @user.name %>!</h1>_11 <p>Thanks for joining and have a great day! Now sign in and do_11awesome things!</p>_11 </body>_11</html>
If you don't have a user model quite yet, generate one quickly.
_10rails generate scaffold user name email login_10rake db:migrate
Now in the controller for the user model app/controllers/users_controller.rb
, add a call to UserNotifierMailer.send_signup_email
when a user is saved.
_19class UsersController < ApplicationController_19 def create_19 # Create the user from params_19 @user = User.new(user_params)_19 if @user.save_19 # Deliver the signup email_19 UserNotifierMailer.send_signup_email(@user).deliver_19 redirect_to(@user, :notice => 'User created')_19 else_19 render :action => 'new'_19 end_19 end_19_19 private_19_19 def user_params_19 params.require(:user).permit(:name, :email, :login)_19 end_19end
Alright, now we're cooking! Let's get it all going through SendGrid.
In config/environment.rb
specify your ActionMailer settings to point to SendGrid's servers.
_10ActionMailer:\:Base.smtp_settings = {_10 :user_name => 'apikey', # This is the string literal 'apikey', NOT the ID of your API key_10 :password => '<SENDGRID_API_KEY>', # This is the secret sendgrid API key which was issued during API key creation_10 :domain => 'yourdomain.com',_10 :address => 'smtp.sendgrid.net',_10 :port => 587,_10 :authentication => :plain,_10 :enable_starttls_auto => true_10}
That's it! When a new user object is saved, an email will be sent to the user via SendGrid.
As a best practice, you should not store your credentials directly in the source but should instead store them in configuration files or environment variables. See this tutorial on environment variables in Rails. And for Rails Versions 5.2+ see Securely storing custom credentials in Rails.