无法使用Gmail SMTP服务器(在Discourse中)发送邮件

5
我将尝试设置rails3网络应用程序Discourse,但是在配置Gmail SMTP服务器的过程中遇到了一些问题。
我昨天注册了一个新的Gmail账户,并且能够通过浏览器和电子邮件客户端软件登录。
然后我在文件config/environments/production.rb中配置Discourse:
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address   => "smtp.gmail.com",
  :port      => "587",
  :user_name => "smtp4shuzu@gmail.com",
  :password  => "12345678",
  :authentication => :plain,
  :domain => "shuzhu.org",
  :enable_starttls_auto => true
}

启动sidekiq,用于在后台发送邮件:

nohup bundle exec sidekiq > log/sidekiq.log 2>&1 &

然后以生产模式启动讨论:

rails server -e production -d

但是它不能正常工作。我在sidekiq.log中看到了一些错误:

2013-03-01T03:06:02Z 30687 TID-qib28 WARN: {"retry"=>true, "queue"=>"default", "class"=>"Jobs::UserEmail", "args"=>[{"type"=>"signup", "user_id"=>42, "email_token"=>"b40a21ece2b14586e346abfd96685975", "current_site_id"=>"default"}], "jid"=>"558bb6bd5aa36cfc8d3d1e91", "error_message"=>"Connection refused - connect(2)", "error_class"=>"Errno::ECONNREFUSED", "failed_at"=>2013-03-01 03:06:02 UTC, "retry_count"=>0} 2013-03-01T03:06:02Z 30687 TID-qib28 WARN: Connection refused - connect(2) 2013-03-01T03:06:02Z 30687 TID-qib28 WARN: /home/discourse/.rvm/rubies/ruby-1.9.3-p385/lib/ruby/1.9.1/net/smtp.rb:540:in initialize' /home/discourse/.rvm/rubies/ruby-1.9.3-p385/lib/ruby/1.9.1/net/smtp.rb:540:inopen' /home/discourse/.rvm/rubies/ruby-1.9.3-p385/lib/ruby/1.9.1/net/smtp.rb:540:in `tcp_socket'

我尝试了各种smtp设置,但没有一种有效。


更新:

根据@Basil的答案,我刚刚尝试了:

config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address   => "smtp.gmail.com",
  :port      => 587,
  :user_name => "smtp4shuzu",
  :password  => "12345678",
  :authentication => "plain",
  :enable_starttls_auto => true
}

但是它仍然出现相同的错误。 shuzu.org 是我的网站域名,我曾考虑将其传递给 smtp。现在我已将其删除,但仍无法正常工作。

尝试添加 :domain => "gmail.com",然后重新启动您的服务器。 - bsiddiqui
5个回答

5

最后,我找到了(愚蠢的)原因。

我应该在生产模式下启动 sidekiq

nohup bundle exec sidekiq -e production > log/sidekiq.log 2>&1 &

3

尝试去掉端口周围的引号

  :port      => 587,

此外,我不明白为什么你的电子邮件地址是 @gmail,但你的域名是 @shuhzu... SMTP 设置应该显示你的电子邮件帐户的域名。如果你有一个自定义的 Gmail,比如 me@custom.com,那么域名就是 custom.com。以下是一个示例,如果你有一个自定义的电子邮件地址,你的域名的 SMTP 设置应该是什么:
{
    :address => "smtp.gmail.com",
    :port => 587 ,
    :domain => "custom.com",
    :user_name => "some_email@custom.com",
    :password => "some_password",
    :authentication => "plain",
    :enable_starttls_auto => true
}

1

我刚在自己的Ubuntu物理现场服务器上的Docker容器中设置了一个新的讨论实例,并编辑了app.yml以包含:

DISCOURSE_SMTP_ADDRESS: 'smtp.gmail.com'
DISCOURSE_SMTP_AUTHENTICATION: 'plain'
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: 'my.name@gmail.com'
DISCOURSE_SMTP_PASSWORD: 'myPa$$word'
DISCOURSE_SMTP_ENABLE_START_TLS: true

它可以工作。其中一半的成功在于知道何时放置单引号(')和何时不用。

另外,我还有一种方法 - 我的ISP为其静态IP客户提供中继SMTP,因此我在app.yam中使用了这个选项:

DISCOURSE_SMTP_ADDRESS: mail.myisp.tld
DISCOURSE_SMTP_AUTHENTICATION: none
DISCOURSE_SMTP_PORT: 25

而且这对我也起作用。


1
有时候在/var/discourse/containers/app.yml中,取消以下行的注释是很有用的:
 ## If you want to set the 'From' email address for your first registration, uncomment and change:
 ## After getting the first signup email, re-comment the line. It only needs to run once.
  - exec: rails r "SiteSetting.notification_email='noreply@YOURDOMAIN.com'"

你应该在此处放置代表所有Discourse邮件的地址。默认情况下,Discourse将尝试使用您论坛的域名,但它可能不被您的SMTP允许。例如,您的论坛位于forum.example.com,而您的Gmail SMTP仅允许来自example.com的电子邮件。
对于没有身份验证的SMTP,请将身份验证字段保留为空。
  DISCOURSE_SMTP_USER_NAME:
  DISCOURSE_SMTP_PASSWORD:

并且在所有内容保存之后:

./launcher rebuild app

一旦电子邮件起作用,您可以重新注释此行(使用SiteSetting)。
您甚至可以通过控制台设置此SiteSetting,但这比取消注释/重新注释单个行并重新构建容器更困难,因此我不会详细介绍。

0
在我的安装中,我使用的是预制映像(Bitnami)之一,我只需要运行以下命令:
/opt/discourse-0.9.5-0/ctlscript.sh start discourse_sidekiq

有人知道我怎样才能自动化这个过程,使它在启动时发生吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接