2014-05-07 4 views
8

Ich benutze Mailgun HTTP API, um E-Mails von Rails-Anwendung zu senden.Aber ich bin nicht in der Lage, die Mailer-Ansichten zu rendern. Dies ist meine Mailerklasse.So rendern Schienen Mailer Ansichten in Mailgun HTTP API

class MailgunMails < ActionMailer::Base 

    def send_complex_message 
     data = Multimap.new 
     data[:from] = "Excited User <[email protected]#{@@domain}>" 
     data[:to] = "[email protected]" 
     data[:subject] = "Hello" 
     data[:html] = File.open("#{Rails.root}/app/views/mailgun_mails/send_complex_message.html.erb", 'r').to_s.html_safe 
     ## also tried 
     data[:html] = render(template: "send_complex_message.html.erb") 
     response = RestClient.post "https://api:#{@@private_key}"\ 
     "@api.mailgun.net/v2/#{@@domain}/messages", data 

     response = JSON.parse(response) 

    end 

end 

Aber das wirft:

NoMethodError: undefined method `each_byte' for nil:NilClass

Wie verwende ich Mailer Ansichten mit Mailgun API.

PS: Ich weiß, dass es viele Edelsteine ​​gibt, um mailgun mit Rails zu verwenden, aber keiner von ihnen gibt volle Funktionalität wie die API.

Wenn es eine alternative Möglichkeit gibt, E-Mails von der API über die Schienenansichten zu senden, warte ich auf diese Antwort. Ich weiß nur nicht, wie das zu tun (auch wenn es nicht Action nicht verwendet)

FULL Fehlertrace

NoMethodError: undefined method `each_byte' for nil:NilClass 
    from /Users/example/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/uri/common.rb:307:in `block in escape' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/activesupport-4.0.4/lib/active_support/core_ext/string/output_safety.rb:177:in `gsub' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/activesupport-4.0.4/lib/active_support/core_ext/string/output_safety.rb:177:in `gsub' 
    from /Users/example/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/uri/common.rb:304:in `escape' 
    from /Users/example/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/uri/common.rb:623:in `escape' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient/payload.rb:150:in `handle_key' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient/payload.rb:143:in `block in build_stream' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient/payload.rb:142:in `collect' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient/payload.rb:142:in `build_stream' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient/payload.rb:53:in `initialize' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient/payload.rb:18:in `new' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient/payload.rb:18:in `generate' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient/request.rb:45:in `initialize' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `new' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/rest-client-1.6.7/lib/restclient.rb:72:in `post' 
... 2 levels... 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.4/lib/abstract_controller/callbacks.rb:18:in `block in process_action' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/activesupport-4.0.4/lib/active_support/callbacks.rb:373:in `_run__1281843520849433682__process_action__callbacks' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/activesupport-4.0.4/lib/active_support/callbacks.rb:80:in `run_callbacks' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.4/lib/abstract_controller/callbacks.rb:17:in `process_action' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.4/lib/abstract_controller/base.rb:136:in `process' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/actionpack-4.0.4/lib/abstract_controller/rendering.rb:44:in `process' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/actionmailer-4.0.4/lib/action_mailer/base.rb:503:in `process' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/actionmailer-4.0.4/lib/action_mailer/base.rb:497:in `initialize' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/actionmailer-4.0.4/lib/action_mailer/base.rb:480:in `new' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/actionmailer-4.0.4/lib/action_mailer/base.rb:480:in `method_missing' 
    from (irb):1 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/railties-4.0.4/lib/rails/commands/console.rb:90:in `start' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/railties-4.0.4/lib/rails/commands/console.rb:9:in `start' 
    from /Users/example/.rvm/gems/ruby-2.0.0-p451/gems/railties-4.0.4/lib/rails/commands.rb:62:in `<top (required)>' 
    from bin/rails:4:in `require' 
+0

Sie senden also eine E-Mail in Ihrem Mailer, indem Sie ihre API darin aufrufen? Es ist ein Muster, das ich vorher nicht gesehen habe. http://www.leemunroe.com/send-automated-email-ruby-rails-mailgun/ –

+0

Anscheinend ja. Ich kann die SMTP-Einstellungen nicht verwenden. (Ich möchte nicht verwenden), da meine sendende E-Mail dynamisch geändert wird. Was ist der richtige Weg, um das zu erreichen, was ich erreichen möchte? –

+0

Warum können Sie SMTP nicht verwenden? Nur neugierig. Sie können die E-Mail-Vorlagen dynamisch ändern und weiterhin das standardmäßige ActionMailer-Verhalten verwenden. Sie können die Ansichten mithilfe der Rendermethode ändern. –

Antwort

6

Wie über die render_to_string Methode? Ich glaube, dass Sie den Inhalt der Ansicht dynamisch generieren möchten. Das Lesen der Ansichtsvorlage durch Öffnen der Datei würde keinen Ruby-Code enthalten.

class MailgunMails < ActionMailer::Base 

     def send_complex_message 
      data = Multimap.new 
      data[:from] = "Excited User <[email protected]#{@@domain}>" 
      data[:to] = "[email protected]" 
      data[:subject] = "Hello" 
      html_output = render_to_string template: "mailgun_mails/send_complex_message" 
      data[:html] = html_output.to_str 
      response = RestClient.post "https://api:#{@@private_key}"\ 
      "@api.mailgun.net/v2/#{@@domain}/messages", data 

      response = JSON.parse(response) 

     end 

    end 
+0

Bereits versucht. Gibt den gleichen Fehler! –

+1

Versuchen Sie, die "to_str" -Methode zu verwenden, wie oben im aktualisierten Code gezeigt. to_str, um zu erzwingen, dass echte Strings zurückgegeben werden. –

+0

Das funktioniert aber nur als reine Saite. Der HTML-Code wird nicht gerendert. (die Links etc) –