即时通讯使用设计,我试图在有人使用动作制作者注册后发送欢迎电子邮件。
我在设计上覆盖了注册控制器......
def create
build_resource
if resource.save
if resource.active_for_authentication?
set_flash_message :notice, :signed_up if is_navigational_format?
UserMailer.welcome_email(resource).deliver
sign_in(resource_name, resource)
respond_with resource, :location => after_sign_up_path_for(resource)
else
set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
expire_session_data_after_sign_in!
respond_with resource, :location => after_inactive_sign_up_path_for(resource)
end
else
clean_up_passwords resource
respond_with resource
end
end
在那一行
UserMailer.welcome_email(resource).deliver
我打电话给我的user_mailer.rb
default :from => "blink@gmail.com"
def welcome_email(user)
@user = user
@url = "http://example.com/login"
mail(:to => user.email, :submit => "Welcome YEAH!")
end
我在app / views / user_mailer / welcome_email.text.erb下有一个视图
在我的初始化文件夹中,我有一个setup_mail.rb
ActionMailer::Base.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:domain => "gmail.com",
:user_name => "blink@gmail.com",
:password => "example",
:authentication => "plain",
:enable_starttls_auto => true
}
在我的开发中。我有... ...
config.action_mailer.delivery_method = :sendmail
config.action_mailer.perform_deliveries = true
我感到非常难过,为什么这一切都没有奏效。香港专业教育学院写了一个较旧的项目,我让动作邮件工作。现在的代码几乎与我的旧项目相同。例外是我现在使用设计。
在我的终端窗口中,当我运行'rails server'时,在该窗口上它也会说......
Sent mail to blink@gmail.com (140ms)
Date: Thu, 12 Apr 2012 12:32:48 -0700
From: blink@gmail.com
To: blink@gmail.com
Message-ID: <4f872de096f4e_1805f3fdba4834cd493153@spiderman.local.mail>
Subject: Welcome email
Mime-Version: 1.0
Content-Type: multipart/alternative;
boundary="--==_mimepart_4f872de0883d4_1805f3fdba4834cd49281a";
charset=UTF-8
Content-Transfer-Encoding: 7bit
submit: Welcome YEAH!
用户注册后。我不认为它真的发送。我的gmail永远不会得到它而不是我的垃圾邮件。它可能是设计邮件/视图的东西吗?但我明确地在控制器中使用UserMailer,这就是我覆盖它的原因
我已经被困了好几天了!帮助将不胜感激。谢谢一堆答案 0 :(得分:3)
你试过吗
config.action_mailer.delivery_method = :smtp
看看mailcatcher在开发中测试电子邮件,我发现它比实际发送邮件容易得多。
答案 1 :(得分:3)
首先,您必须确保告诉设备要寻找您的控制器(因为您已将其子类化,我假设)。您可以通过编辑config/routes.rb
来完成此操作:
# config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
如果您已完成此操作,请确保您的控制器是正在使用的控制器。此外,关于sendmail
具体,我还没有尝试使用它,但假设sendmail
使用您的主机操作系统的内部邮件代理,并且您在动态IP地址下(ISP提供给它连接时的用户),我相信像GMail这样的邮件提供商会阻止你的邮件,因为他们不允许动态IP作为邮件提供商。他们主要是出于安全目的这样做。也许你可以通过编辑config/environments/development.rb
:
# config/environments/development.rb
config.action_mailer.raise_delivery_errors = true
看看引擎盖下是否有什么东西在发生。如果这没有那么多帮助(并且因为您实际上要做的是使用有效的邮件帐户发送电子邮件 - 给定您的ActionMailer设置),您可以使用SMTP传递而不是sendmail,以及您拥有的配置,编辑这一行:
# config/environment/development.rb
config.action_mailer.delivery_method = :smtp
在您的初始化程序中,实际上会通过指定的帐户向指定的收件人发送电子邮件。
作为最终(非主题)建议,我建议您使用Rails Observers,在这种情况下,您不需要覆盖Devise的注册控制器。这将使您的生活更加简单,干燥并遵循惯例而不是配置的理念。然后你可以像这样创建一个Observer:
# app/observers/user_observer.rb
class UserObserver < ActiveRecord::Observer
def after_create(user)
UserMailer.welcome_email(user).deliver
end
end
并修改config/application.rb
:
config.active_record.observers = :user_observer