Git Product home page Git Product logo

youve_changed's Introduction

##Sending Email with the service Sendgrid##

###Getting Started###

If you don't already have one, the first step you should do is sign up for an account with Sendgrid. It would be best to do this ahead of time. Sendgrid with provision your account at first so it might take some time to get the account set up. You should sign up for the free account.

Now that we've got that, go ahead and clone down the repo

git clone https://github.com/turingschool-examples/youve_changed.git youve_changed

###Figaro###

Our next step will be to set up Figaro. It is a gem that let's us set up ruby environment variables for things like keys (or that Sendgrid username and password you just set up)

  # Gemfile
  gem "figaro"

And after you bundle, run

  bundle exec figaro install

This creates an application.yml file and adds it to your .gitignore

For now, let's put our Sendgrid username and password into the newly created application.yml file

# config/application.yml

SENDGRID_USER_NAME: "supersecret"
SENDGRID_PASSWORD: "supersecretpassword"

And remember, don't add the application.yml to your commits! We never push up our keys to Github.

##Creating the Mailer##

Our next step will be to create the Friend mailer to passive-aggressively inform your friends that they've changed.

rails g mailer FriendNotifier

This creates a lot of files for you. Let's first start out with the FriendNotifier.

# mailers/friend_notifier.rb

class FriendNotifier < ApplicationMailer
  def inform(user, friend_contact)
    @user = user
    mail(to: friend_contact, subject: "#{user.name} says you've changed.")
  end
end

Next we'll make the views that will determine the body of the email that is send.

In app/views/friend_notifier create two files, inform.html.erb and inform.text.erb

Depending on the person's email client you're sending the email to, it will render either the plain text or the html view. We don't have control over that, so we'll make them have the same content.

# inform.html.erb and inform.text.erb

Your 'friend' <%= @user.name.capitalize %> wanted to let you know that you've changed. Tell someone else that they've changed. It's your duty.

##Notification Controller##

Next we'll make a new controller that will call our mailer. Create a controller called NotificationController

# app/controllers/notification_controller.rb

class NotificationController < ApplicationController
  def create
    FriendNotifier.inform(current_user, params[:email]).deliver_now
    flash[:notice] = "Successfully told your friend that they've changed."
    redirect_to root_url
  end
end

We'll also make sure we put that route into the routes file:

post '/notification' => 'notification#create'

##Putting it all together##

Remember that setup we did earlier with Sendgrid? Now let's plug it into our program.

First, let's change the default address the email gets sent from:

class ApplicationMailer < ActionMailer::Base
  default from: "[email protected]"
  layout 'mailer'
end

And now in config/application.rb:

module YouveChanged
  class Application < Rails::Application
    config.action_mailer.delivery_method = :smtp

    config.action_mailer.smtp_settings = {
      address:              'smtp.sendgrid.net',
      port:                 '587',
      domain:               'example.com',
      user_name:            ENV["SENDGRID_USER_NAME"],
      password:             ENV["SENDGRID_PASSWORD"],
      authentication:       'plain',
      enable_starttls_auto: true
    }
    # Do not swallow errors in after_commit/after_rollback callbacks.
    config.active_record.raise_in_transactional_callbacks = true
  end
end

This is where figaro comes in handy. Just make sure that the ENV variables that you set here match the ones in your application.yml file that figaro generated for you.

youve_changed's People

Contributors

meyerhoferc avatar jmejia avatar tessgriffin avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.