2017-10-04 29 views
0

我使用這個類行動梅勒軌郵件功能:覆蓋在的ActionMailer

class UserMailer < ActionMailer::Base 

    default from: "[email protected]", 
      reply_to: '[email protected]' 

    def mail_method 
    mail(to: '[email protected]', subject: "SUBJECT") 
    end 
end 

所以這樣我得到了很多類和發送電子郵件這樣從SMTP傳輸方法的方法。

但是現在我想執行交付,即僅在生產環境中發送電子郵件,而不是在開發或測試環境中。

因此,我只想使用我的電子郵件,這就是爲什麼我需要重寫郵件的方法。

我試過的東西。

- >將函數返回的電子郵件,其中函數名是get_right_email

class UserMailer < ActionMailer::Base 

    default from: "[email protected]", 
      reply_to: '[email protected]' 

    def mail_method 
    mail(to: get_right_email('[email protected]'), subject: "SUBJECT") 
    end 
end 

而且get_right_email的定義如下:

def get_right_email(email) 
    if(Rails.env=='production') 
    return email 
    else 
    return '[email protected]' 
    end 
end 

這將需要一些重構,但仍在可控範圍。將需要幾個小時,我可以做,但有一個更快的方式,我可以重寫郵件功能。

回答

2

在您的config> enviroments文件夾中,您應該有一個用於生產,開發和測試的文件。在這裏您可以指定每個設置。在這些文件夾

設置此改變那些在配置>測試時我通常不實際發送電子郵件,但我也希望能夠測試郵件,所以我用

application.rb中

例如

config.action_mailer.delivery_method = :test 

這使得調用的ActionMailer :: Base.deliveries訪問的電子郵件

您可以設置從電子郵件地址默認這些文件,以及使用:

config.action_mailer.default_options = { 
    :from => "[email protected]" 
} 

Theres由奇妙的Ryan Bates管理的一個名爲letter_opener的gem不是在開發中發送電子郵件,而是在新標籤中打開電子郵件。這使得在開發過程中測試電子郵件變得輕而易舉。

Letter Opener

更新下------

道歉,我不太明白,你所期待的。

Rails有webshook,您可以使用它來攔截電子郵件並重定向它們。你會想要使用與生產不同的環境。

測試環境通常用於自動測試,爲了保持清楚,您可能需要考慮設置新環境(例如:暫存)。

要創建一個新的環境剛剛創建的config /環境中一個新的文件/並給它一個合適的名字 - 如:staging.rb

你可以調用Rails.env.staging?你喜歡哪裏。

反正回到主事件......

攔截郵件首先要創建一個攔截類:

class StagingEmailInterceptor 
    def self.delivering_email(message) 
    message.to = ['[email protected]'] 
    end 
end 

,然後創建一個初始化文件,如:

配置/初始化/staging_email_interceptor.rb

and inside do this:

if Rails.env.staging? 
    ActionMailer::Base.register_interceptor(StagingEmailInterceptor) 
end 

這樣,在臨時環境中發送的所有電子郵件都將發送到您的電子郵件。

+0

謝謝,它的偉大的發展。我可能會使用它。但是測試環境呢?測試服務器甚至沒有瀏覽器,即使有,也沒有人訪問它,因爲它是一個虛擬機實例。 – user1735921

+0

你想在測試環境中發生什麼? – Eoghain

+0

電子郵件應該在測試環境中發送給我 – user1735921