2011-02-09 35 views
26

Tôi đang viết một chương trình Ruby nhỏ để kéo các bản ghi từ cơ sở dữ liệu và gửi một email HTML hàng ngày. Tôi đang cố gắng sử dụng ActionMailer 3.0.3 cho việc này, nhưng tôi đang gặp vấn đề. Tất cả các tìm kiếm tôi đã thực hiện cho đến nay bằng cách sử dụng ActionMailer bên ngoài Rails áp dụng cho các phiên bản trước phiên bản 3. Ai đó có thể chỉ cho tôi đi đúng hướng nơi tìm tài nguyên về cách thực hiện điều này không? Đây là nơi tôi ở trên tệp bưu phẩm của tôi cho đến nay:ActionMailer 3 không có Rails

# lib/bug_mailer.rb 
require 'action_mailer' 

ActionMailer::Base.delivery_method = :file 

class BugMailer < ActionMailer::Base 
    def daily_email 
    mail(
      :to  => "[email protected]", 
      :from => "[email protected]", 
      :subject => "testing mail" 
    ) 
    end 
end 

BugMailer.daily_email.deliver 

Tôi chắc chắn bị kẹt ở vị trí đặt quan điểm của mình. Mọi nỗ lực tôi đã thực hiện để nói với ActionMailer nơi các mẫu của tôi đã thất bại.

Tôi đoán tôi cũng nên hỏi xem có cách nào khác để hoàn thành chương trình này hay không. Về cơ bản, tôi đang làm tất cả mọi thứ từ đầu tại thời điểm này. Rõ ràng điều gì làm cho Rails tuyệt vời là quy ước của nó, vậy nên cố gắng sử dụng các phần của Rails một cách lãng phí thời gian của họ? Có cách nào để có được môi trường Rails giống như không tạo ra một ứng dụng Rails đầy đủ không?

Trả lời

44

Sau khi gỡ lỗi nghiêm trọng, tôi đã tìm cách định cấu hình nó.

tập tin mailer.rb

require 'action_mailer' 

ActionMailer::Base.raise_delivery_errors = true 
ActionMailer::Base.delivery_method = :smtp 
ActionMailer::Base.smtp_settings = { 
    :address => "smtp.gmail.com", 
    :port  => 587, 
    :domain => "domain.com.ar", 
    :authentication => :plain, 
    :user_name  => "[email protected]", 
    :password  => "passw0rd", 
    :enable_starttls_auto => true 
    } 
ActionMailer::Base.view_paths= File.dirname(__FILE__) 

class Mailer < ActionMailer::Base 

    def daily_email 
    @var = "var" 

    mail( :to  => "[email protected]", 
      :from => "[email protected]", 
      :subject => "testing mail") do |format| 
       format.text 
       format.html 
    end 
    end 
end 

email = Mailer.daily_email 
puts email 
email.deliver 

tập tin bưu phẩm/daily_email.html.erb

<p>this is an html email</p> 
<p> and this is a variable <%= @var %> </p> 

tập tin bưu phẩm/daily_email.text.erb

this is a text email 

and this is a variable <%= @var %> 

Câu hỏi hay! Nó đã giúp tôi hiểu thêm một chút về cách Rails 3 hoạt động :)

+0

Cảm ơn ... đã giúp. Vì vậy, nơi tôi đang bị mắc kẹt tiếp theo là nơi để đưa quan điểm của tôi. Tôi biết rằng, nếu tôi đang tạo một ứng dụng Rails, họ sẽ sống trong 'app/views', nhưng tôi không biết tôi nên đặt quan điểm của mình ở đâu. Hiện tại, chế độ xem của tôi như sau: 'lib/bug_mailer/daily_email.html.erb'. Bất kỳ ý tưởng? –

+0

Ha, stackoverflow có tất cả các câu trả lời :) http://stackoverflow.com/questions/741989/actionmailer-and-ramaze – Augusto

+0

Đó thực sự là bài đăng đầu tiên tôi xem xét trong nghiên cứu ActionMailer bên ngoài Rails. Tôi theo phương pháp được đề cập ở đó, nhưng không đi. Đây là cách tôi đã thiết lập mọi thứ hiện tại. Mailer là ở đây: 'bugs_email/lib/bug_mailer.rb'. Khung nhìn ở đây: 'bugs_email/lib/bug_mailer/daily_email.html.erb'. Vì vậy, trừ khi tôi đang thiếu một cái gì đó (có thể!) Tôi được thiết lập như ví dụ đó. –

2

Tôi mất một lúc để làm việc này (không) Rails 4. Tôi nghi ngờ đó là vì tôi có ': require => false' khắp Gemfile của tôi, nhưng tôi cần thêm những điều sau đây để làm cho nó làm việc:

require 'action_view/record_identifier' 
require 'action_view/helpers' 
require 'action_mailer' 

Nếu không có đoạn mã trên, tôi vẫn tiếp tục nhận được một NoMethodError với undefined method 'assign_controller'.

Sau đó, tôi cấu hình ActionMailer như sau:

ActionMailer::Base.smtp_settings = { 
    address: 'localhost', port: '25', authentication: :plain 
} 
ActionMailer::Base.default from: '[email protected]' 
ActionMailer::Base.raise_delivery_errors = true 
ActionMailer::Base.logger = Logger.new(STDOUT) 
ActionMailer::Base.logger.level = Logger::DEBUG 
ActionMailer::Base.view_paths = [ 
    File.join(File.expand_path("../../", __FILE__), 'views', 'mailers') 
    # Note that this is an Array 
] 

Các mẫu đi trong lib/<GEM_NAME>/views/mailers/<MAILER_CLASS_NAME>/<MAILER_ACTION_NAME>.erb (MAILER_ACTION_NAME là phương pháp dụ nào của lớp bưu phẩm của bạn mà bạn gọi để gửi email).

Cuối cùng, đừng quên đặt điều này trong spec_helper của bạn:

ActionMailer::Base.delivery_method = :test