2016-04-04 15 views
7

Nie mogę znaleźć samouczka krok po kroku, jak zintegrować interfejs API Sendgrid w aplikacji Ruby on Rails. Jestem całkiem nowy, więc może brakuje mi czegoś oczywistego.Funkcja API Sendgrid dla Ruby on Rails

Chciałbym użyć web sendgrid API zamiast metody dostarczania smtp (mailgun mówi o korzyściach z web API dla metody SMTP tutaj: https://documentation.mailgun.com/quickstart-sending.html, i myślałem, że Sendgrid miałby te same korzyści lub Mogłabym później przełączyć się na mailgun).

Po zainstalowaniu sendgrid gem (https://github.com/sendgrid/sendgrid-ruby), dokumentacja mówi mi "Tworzenie nowego klienta z SendGrid API Key", i że mogę to zrobić na 2 sposoby:

require 'sendgrid-ruby' 

# As a hash 
client = SendGrid::Client.new(api_key: 'YOUR_SENDGRID_APIKEY') 

# Or as a block 
client = SendGrid::Client.new do |c| 
    c.api_key = 'YOUR_SENDGRID_APIKEY' 
end 

Gdzie konkretnie w moim wniosek czy mam umieścić ten kod? Czy powinienem umieścić to w moim programie pocztowym, aplikacji mailer lub w pliku config/environments/production.rb?

Wziąłem spojrzeć na tym kursie, który idzie przez jak skonfigurować API Mailgun: https://launchschool.com/blog/handling-emails-in-rails

Według tego poradnika to wygląda linii client = SendGrid::Client.new(api_key: 'YOUR_SENDGRID_APIKEY') powinny rzeczywiście iść do samej metody przesyłkę. Poniżej znajduje się przykład launchschool.com (przypuszczalnie zastępując mailgun konkretne informacje z sendgrid info):

class ExampleMailer < ActionMailer::Base 

     def sample_email(user) 
    @user = user 
    mg_client = Mailgun::Client.new ENV['api_key'] 
    message_params = {:from => ENV['gmail_username'], 
         :to  => @user.email, 
         :subject => 'Sample Mail using Mailgun API', 
         :text => 'This mail is sent using Mailgun API via mailgun-ruby'} 
    mg_client.send_message ENV['domain'], message_params 
    end 
end 

Dodatkowo, w jaki sposób mogę uzyskać moja metoda Mailer wysłać widok mailera zamiast prostego tekstu jak wskazano w Przykład launchschool? Na przykład, zamiast wysyłać tekst "Ta poczta jest wysyłana za pomocą ..." chciałbym wysłać widok mailera (coś w stylu account_activation.html.erb).

Wreszcie, używam Devise w mojej aplikacji i chciałbym, aby Devise użył interfejsu API do wysyłania wiadomości e-mail (np. Resetowania hasła itp.). Czy to oznacza, że ​​muszę utworzyć niestandardowy program pocztowy dla Devise? Jeśli tak, jak mam to zrobić?

Zgodnie z Devise (https://github.com/plataformatec/devise/wiki/How-To:-Use-custom-mailer), powinienem "stworzyć klasę, która rozszerza Devise :: Mailer". Czy to znaczy, że po prostu robię plik w moim folderze mailer z informacjami zawartymi w dokumentach? Czy potrzebuję osobnego programu pocztowego do pracy w Devise lub czy mój program pocztowy może dziedziczyć po programie pocztowym Devise? Na koniec, w jaki sposób mam powiedzieć, jak używać aplikacji sendi web api do wysyłania wiadomości e-mail (zamiast prostej metody SMTP)?

Przepraszamy za długie pytanie, ale mam nadzieję, że inni uznają to za przydatne.

Dzięki!

+2

Nie próbowałem tego, ale wydaje się obiecujące: https://github.com/eddiezane/sendgrid-actionmailer –

Odpowiedz

-3

Oto przewodnik krok po kroku, który pomoże Ci zintegrować SendGrid z aplikacją RoR. Mam nadzieję, że to pomoże!

  • Utwórz konto SendGrid pierwszy na: http://sendgrid.com/
  • Utwórz nowy folder poręcze (sendgrid_confirmation)

    • szyn nowy sendgrid_confirmation
  • Przejdź do folderu 'sendgrid_confirmation'

    • cd sendgrid_confirmation
  • otwarty 'sendgrid_confirmation' w edytorze tekstowym (Sublime)

  • Tworzenie modelu użytkownika (User to model testowy, można utworzyć dowolny inny model jak na użyciu Twojego projektu)

    • szyny generować rusztowanie nazwa użytkownika e-mail logowania
    • rake db: migrować
  • Dołącz sendgrid szyn gem w Gemfile

    • gem 'sendgrid barierki', '~> 2,0'
  • Uruchom pakiet zainstalować w swoim terminalu

    • Pakiet instalacyjny
  • Użyj secrets.yml, aby zdefiniować poświadczenia interfejsu API SendGrid: (config/secrets.yml) produkcja: nazwa_użytkownika_logicznego: nazwa_użytkownika-sendgrid hasło_gramy_bazy_działające: twoje hasło-sendgrid (Wiadomości e-mail nie są wysyłane w środowiskach programistycznych i testowych. Możesz więc zdefiniować go tylko do produkcji.)

  • Wygeneruj klasę Mailer. Klasy Mailer funkcjonują jako nasze kontrolery dla widoków e-mail.

    • szyny generować Mailer UserNotifier
  • Otwórz app/koperty/user_notifier.rb i dodać następujące działania pocztowego, który wysyła użytkownikom mail znak-up

class UserNotifier < ActionMailer::Base 
    default :from => '[email protected]' 
    # send a signup email to the user, pass in the user object that contains the user's email address 
    def send_signup_email(user) 
    @user = user 
    mail(:to => @user.email, 
     :subject => 'Thanks for signing up for our amazing app') 
    end 
end 
  • Utwórz aplikację pliku/views/User_notifier/send_signup_email.html.erb, co następuje: (To będzie utworzyć widok, który odpowiada naszej akcji i wyjścia HTML na nasz e-mail)

<!DOCTYPE html> 
    <html> 
     <head> 
       <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' /> 
     </head> 
     <body> 
       <h1>Thanks for signing up, <%= @user.name %>!</h1> 
       <p>Thanks for joining and have a great day! Now sign in and do awesome things!</p> 
     </body> 
    </html> 
  • idź do użytkowników Controller (app/controllers/users_controller.rb) i dodaj połączenie do UserNotifier.send_signup_email po zapisaniu użytkownika.

def create 
    @user = User.new(user_params) 
    respond_to do |format| 
    if @user.save 
     UserNotifier.send_signup_email(@user).deliver 
     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render :show, status: :created, location: @user } 
    else 
     format.html { render :new } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 
  • zaktualizować swój config/environment.rb do punktu ustawienia ActionMailer do serwerów SendGrid użytkownika. Plik environment.rb powinna wyglądać następująco:

# Load the Rails application. 
require File.expand_path('../application', __FILE__) 

# Initialize the Rails application. 
Rails.application.initialize! 

ActionMailer::Base.smtp_settings = { 
    :user_name => ‘your_sendgrid_username’, 
    :password => 'your_sendgrid_password’, 
    :domain => ‘your_domain.com', 
    :address => 'smtp.sendgrid.net', 
    :port => 587, 
    :authentication => :plain, 
    :enable_starttls_auto => true 
} 
  • Point to Twój plik konfiguracyjny/routes.rb, aby załadować stronę indeksu obciążenia. Dodaj następujący w pliku routes.rb:

get ‘/’ => ‘users#index’ 

I to jest to! Teraz, gdy utworzysz nowego użytkownika, powinieneś otrzymać wiadomość e-mail (na podaną przez ciebie user.email) z [email protected]. Możesz to zmienić: e-mail z app/mailers/user_notifier.rb. Zmień domyślny: z adresu i powinien to zrobić. Możesz dodać parametry wiadomości e-mail w metodzie send_signup_mail w tym samym pliku i dodać szczegóły, które chcesz dodać. Możesz także zmienić treść wiadomości z app/views/user_notifier/send_signup_email.html.erb, aby wyświetlić dowolną treść, którą chcesz.

+3

Chociaż ta odpowiedź poprawnie wyjaśnia (jak dokumenty sendgrid), jak wysłać e-mail z aplikacji RoR za pomocą SMTP, to robi nie odpowiadać na zadane pytanie. Pytanie jednoznacznie określa kierunki użycia interfejsu API sendgrid zamiast SMTP. –

+4

Rozczarowanie! To nie jest odpowiedź, jest wycięcie i wklejenie z przestarzałego sposobu, który można łatwo znaleźć w wielu innych miejscach. –

-1

EDIT:

Metoda ta, niestety, działa tylko z odległych obrazów.


OK, więc oto jak to zrobiłem. Może być lepszy sposób, aby to zrobić, ale to działało dla mnie.

Wysyłając wiadomość e-mail, wyślij ją najpierw, wykonując czynności podobne do: UserMailer.reset_email(user).deliver. Więc usunąć dostarczamy i zapisać go do zmiennej:

object = UserMailer.reset_email(user)

głęboko zagnieżdżone w tym ISH jest ciało email. Miejsce, w którym się znajduje, może się zmieniać wraz z kontekstem, więc moja rada polega na zwróceniu obiektu do frontendu, abyś mógł go zagłębić i znaleźć. Dla mnie tu mieszkało:

object = UserMailer.reset_email(user) 
body = object.body.parts.last.body.raw_source 

Okej, więc teraz masz surowe źródło.Teraz, aby wysłać go, oto sposób stworzyłem:

def self.sendEmail(from,to,subject,message) 
    from = Email.new(email: from) 
    to = Email.new(email: to) 
    content = Content.new(type: 'text/html', value: message) 
    mail = Mail.new(from, subject, to, content) 

    sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY']) 
    response = sg.client.mail._('send').post(request_body: mail.to_json) 
    puts response.status_code 
    puts response.body 
    puts response.headers 
    end 

nazwać to jako takie (w moim przypadku jest to w modelu użytkownika):

User.sendEmail('[email protected]',user.email,'Reset Password', body)

Upewnij się, aby zmienić typ zawartości z zwykły do ​​html, lub dostaniesz surowy kod. Mam nadzieję że to pomoże.

1

Chciałbym utworzyć klasę mailera to zrobić

class SendgridWebMailer < ActionMailer::Base 
    include Sendgrid 

    def initialize 
    @client = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY']).client 
    end 

    def send_some_email(record, token) 
    mail = Mail.new 
    // do your mail setup here 
    mail = Mail.new 
    mail.from = Email.new(email: YOUR_EMAIL_HERE) 
    mail.subject = YOUR_SUBJECT 

    // I personally use sendgrid templates, but if you would like to use html - 
    content = Content.new(
     type: 'text/html', 
     value: ApplicationController.render(
     template: PATH_TO_TEMPLATE, 
     layout: nil, 
     assigns: IF_NEEDED || {} 
    ) 
    mail.contents = content 

    personalization = Personalization.new 
    personalization.to = Email.new(email: EMAIL, name: NAME) 
    personalization.subject = SUBJECT 

    mail.personalizations = personalization 
    @client.mail._('send').post(request_body: mail.to_json) 
    end 
end 

Nazwać użyciu

SendgridWebMailer.send_some_email(record, token).deliver_later 

Aby opracować

class MyDeviseMailer < Devise::Mailer 
    helper :application # gives access to all helpers defined within `application_helper`. 
    include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url` 

    def reset_password_instructions(record, token, opts={}) 

     SendgridWebMailer.send_some_email(record, token).deliver_later 
    end 
end 

w config/devise.rb

# Configure the class responsible to send e-mails. 
    config.mailer = 'MyDeviseMailer' 
+1

dlaczego 'SendgridWebMailer' musi odziedziczyć po' ActionMailer :: Base'? – kittyminky