2017-10-04 42 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