我正在学习Peter Cooper的《Beginning Ruby》这本书。
其中有一个简单的例子,使用ActionMailer发送电子邮件。
以下是该示例代码:
require 'action_mailer'
ActionMailer::Base.smtp_settings = {
:address => "smtp.mail.yahoo.com",
:port => 465,
:authentication => :login,
:user_name => "username@yahoo.com",
:password => "password",
:openssl_verify_mode => :ssl
}
class Emailer < ActionMailer::Base
def self.test_email(email_address, email_body)
mail(to: email_address, from: 'username@yahoo.com', subject: 'action mailer test', body: email_body)
end
end
Emailer.test_email('username@gmail.com', 'This is a test e-mail!').deliver_now
正如您所看到的,我想使用雅虎的SMTP服务器向我的Gmail帐户发送电子邮件。 我提供了所需的smtp设置并创建了类方法
test_email
来使用main
方法和deliver_now
方法发送电子邮件。 但是,我收到以下错误消息:/home/asarluhi/.rvm/gems/ruby-2.5.1@beginning_ruby/gems/actionmailer-5.2.0/lib/action_mailer/base.rb:582:in `method_missing': undefined method `mail' for Emailer:Class (NoMethodError)
我还尝试将test_email
方法更改为实例方法并使用Emailer.new.test_email
...在这种情况下,我收到的错误消息是:
/home/asarluhi/.rvm/gems/ruby-2.5.1@beginning_ruby/gems/mail-2.7.0/lib/mail/message.rb:1396:in `method_missing': undefined method `deliver_now' for #<Mail::Message:0x0000000002e0eac8> (NoMethodError)
我不知道为什么在 Ruby 5.2.0 中方法
mail
和方法 deliver_now
都没有被识别出来,实际上这两个方法都属于 ActionMailer::Base。如果我从 test_email
方法中删除 self
(这是原书中的代码,我以为是错误),当我运行包含以上代码的 rb 文件时,会收到一个长长的回溯(21 行),并显示以下错误信息:/home/asarluhi/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/net/protocol.rb:189:in `rbuf_fill': end of file reached (EOFError)
根据作者的说法,ActionMailer可以独立于Rails使用。因此,我在一个专门的rvm gemset中安装了ActionMailer gem,并从书中提取了上面的代码写入一个rb
文件。运行这个脚本时,我收到了EOFError错误。我尝试让它工作的所有尝试都失败了,例如将test_email
方法添加self
或在Emailer类的实例上调用test_email
方法。
deliver
,据我记得,这在Rails 5中已经改变了。 - Marek Lipkaclass
、def
等)是否都有相应的结尾(end
)。 - Sergio Tulentsev