我在通过Ruby代码发送电子邮件时遇到问题。你可以看到我的full code on GitHub。
更新:以下代码已经过修改,以反映@Gaurish的建议
UPDATE2:看起来gmail拒绝了登录尝试 - 我收到了他们的电子邮件,警告我一些未知的应用程序试图访问我的帐户但是他们禁用了它
具体课程在这里:
require 'net/smtp'
=begin
http://apidock.com/ruby/v1_9_3_125/Net/SMTP/start/class
https://devcenter.heroku.com/articles/config-vars
I added the following config vars to Heroku
heroku config:add GM_USR=xxxx
heroku config:add GM_PSW=xxxx
=end
class Email
def initialize (to, from, subject, body)
@to = to
@from = from
@subject = subject
@body = body
@message = <<MESSAGE_CONTENT
From: User <#{@from}>
To: Integralist <#{@to}>
MIME-Version: 1.0
Content-type: text/html
Subject: #{@subject}
#{@body}
MESSAGE_CONTENT
@smtp = Net::SMTP.new('smtp.gmail.com', 587)
end
def send_email
@smtp.enable_starttls
@smtp.start('furious-wind-9309.herokuapp.com', ENV['GM_USR'], ENV['GM_PSW'], :login) do |smtp|
@smtp.send_message(@message, @from, @to)
end
end
end
我这样称呼它:
email = Email.new('myemail@gmail.com', params[:email], 'test subject', params[:message]);
email.send_mail
但是当我执行代码时,我会在屏幕上显示错误:535-5.7.1 Please log in with your web browser and then try again. Learn more at
我检查了日志,我得到了......
2012-06-13T08:01:08+00:00 heroku[router]: POST furious-wind-9309.herokuapp.com/contact dyno=web.1 queue=0 wait=0ms service=628ms status=500 bytes=2060
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/rack-protection-1.2.0/lib/rack/protection/xss_header.rb:22:in `call'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:200:in `call'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:205:in `context'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/logger.rb:15:in `call'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/commonlogger.rb:20:in `call'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/head.rb:9:in `call'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/methodoverride.rb:21:in `call'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:1334:in `block in call'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:1416:in `synchronize'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:1334:in `call'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:80:in `block in pre_process'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:78:in `catch'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:78:in `pre_process'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:1060:in `call'
2012-06-13T08:01:08+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:1060:in `block in spawn_threadpool'
2012-06-13T08:01:08+00:00 app[web.1]: 82.69.39.185 - - [13/Jun/2012 08:01:08] "POST /contact HTTP/1.1" 500 2060 0.6254
我知道人们可能会建议使用ActionMailer或Pony,但我宁愿不使用那些或者请那些建议给我。我反而喜欢一种有助于修复上述代码的解决方案。
答案 0 :(得分:4)
[更新1]
如果gmail不适合您,您可以使用SendGrid Addon,每天最多免费提供200电子邮件。
以下是有关如何将其STMP API与docs
一起使用的示例(摘自mail gem)require 'mail'
Mail.defaults do
delivery_method :smtp, { :address => "smtp.sendgrid.net",
:port => 587,
:domain => "yourdomain.com",
:user_name => "yourusername@domain.com",
:password => "yourPassword",
:authentication => 'plain',
:enable_starttls_auto => true }
end
mail = Mail.deliver do
to 'yourRecipient@domain.com'
from 'Your Name <name@domain.com>'
subject 'This is the subject of your email'
text_part do
body 'Hello world in text'
end
html_part do
content_type 'text/html; charset=UTF-8'
body '<b>Hello world in HTML</b>'
end
end
使用Sendgrid是一个更好的解决方案,因为您还可以访问高级报告&amp;解析不适用于gmail。此外,sendgrid中的“from”地址没有限制。
使用Heroko,您无法直接从localhost
发送电子邮件,因为Heroku does not provide an outgoing mail service。
因此您必须考虑使用外部 smtp服务器来发送电子邮件。受欢迎的是Gmail&amp; Sendgrid
这只是使用像heroku这样的云计算平台的一个权衡。
使用Gmail,请尝试执行以下操作:
require 'net/smtp'
msg = "your message goes here"
smtp = Net::SMTP.new 'smtp.gmail.com', 587
smtp.enable_starttls
smtp.start(YourDomain, YourAccountName, YourPassword, :login) do
smtp.send_message(msg, FromAddress, ToAddress)
end
答案 1 :(得分:0)
如果您尝试:
@email = Email.new('mark.mcdx@gmail.com', params[:email], 'test subject', params[:message])
@email.send_email
答案 2 :(得分:0)
只需将SendGrid作为插件加载即可,它开箱即用。此外,您还可获得一整套分析功能,以便对跳出,交付等进行故障排除......