Envío de correo con Rails 3 en entorno de desarrollo


Estoy seguro de que esto se ha preguntado un millón de veces antes, pero no puedo encontrar nada que funcione para mí, así que estoy preguntando de nuevo!

Solo necesito una forma de enviar emails usando ActionMailer en rails 3. He seguido numerosos tutoriales, incluido el tutorial Railscasts sobre el nuevo ActionMailer y puedo ver los correos que se generan, pero no los recibo.

He probado un montón de maneras diferentes, pero generalmente equivalen a configurar los siguientes ajustes

ActionMailer::Base.delivery_method = :smtp

ActionMailer::Base.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "[email protected]",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

I he probado el código anterior (con detalles válidos de gmail, por supuesto) en mi configuración/entorno.rb, config / environments / development.rb y actualmente lo tiene en su propio inicializador config / initialisers / setup_mail.rb

También he probado con algunos servidores smtp diferentes, incluidos Gmail y Sendgrid, ajustando la configuración de smtp en consecuencia, pero todavía nada. Puedo ver el correo en la terminal y el registro de desarrollo y eso es todo.

¿Alguien sabe de cualquier otro gotcha's que pueda tener ¿has perdido la necesidad de configurar ActionMailer para que funcione? En su defecto, ¿hay alguna forma de obtener más información sobre por qué no se envían los correos? Tengo

config.action_mailer.raise_delivery_errors = true

Establecido en mi configuración/desarrollo.rb pero el registro de desarrollo todavía muestra lo mismo que veo en el terminal.

Por si sirve de algo, estoy desarrollando en una computadora portátil Ubuntu 10.04 por si acaso hay alguna configuración específica necesaria para eso.

Muchas gracias

Author: Addsy, 2010-11-30

8 answers

Bueno, he resuelto el problema, pero por qué esto funciona y los otros métodos no, no lo sé.

La solución fue crear un inicializador en config/initialisers/setup_mail.rb que contenga lo siguiente

if Rails.env != 'test'
  email_settings = YAML::load(File.open("#{Rails.root.to_s}/config/email.yml"))
  ActionMailer::Base.smtp_settings = email_settings[Rails.env] unless email_settings[Rails.env].nil?
end

Luego agregué config/email.yml que contiene los detalles de las cuentas de correo electrónico de desarrollo y producción

development:
  :address: smtp.gmail.com
  :port: 587
  :authentication: plain
  :user_name: xxx
  :password: yyy
  :enable_starttls_auto: true
production:
  :address: smtp.gmail.com
  :port: 587
  :authentication: plain
  :user_name: xxx
  :password: yyy
  :enable_starttls_auto: true

Como digo, no tengo idea de por qué, pero esto parecía hacer el truco. Gracias a todos por los consejos

 55
Author: Addsy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-07 14:39:47

Tengo lo siguiente en config/environments/development.rb

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

La configuración de correo real, config.actionmailer.* la he colocado en config\application.rb.

Espero que esto ayude:)

 27
Author: nathanvda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-30 12:32:18

Intente usar 'sendmail' en lugar de 'smtp'.

ActionMailer::Base.delivery_method = :sendmail
ActionMailer::Base.sendmail_settings = {
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "[email protected]",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}
 5
Author: Anubhaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-12 21:30:37

Tres cosas.

Primero, el puerto es un entero y no necesita comillas, como en su primer ejemplo. (Pero creo que una cuerda aún debería funcionar.)

En segundo lugar, no olvide reiniciar su servidor cada vez que modifique este (o cualquier) archivo inicializador. Esto podría explicar por qué no vio un error después de agregar:

config.action_mailer.raise_delivery_errors = true

Sin tener ese mensaje de error, es difícil determinar por qué el correo no iba, pero ahora lo está. Una posibilidad es el uso de comillas dobles alrededor de la contraseña. Si estaba utilizando una contraseña segura y tenía un token en su contraseña que no se escapó, podría haber sido reinterpretado. (es decir, "P@ssw\0rd" se convertiría en P@ssrd). Por esta razón, siempre uso comillas simples en mi código a menos que necesite específicamente el azúcar sintáctico.

Por último, enable_starttls_auto: true es el valor predeterminado e innecesario.

 3
Author: IAmNaN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-30 00:22:55

Simplemente ponga toda la configuración a: config / environments / development.rb

Quiero decir

ActionMailer::Base.delivery_method = :smtp

ActionMailer::Base.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "[email protected]",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

Y

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

Funcionó para mí.

 1
Author: Nickle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-05 10:21:22

ActionMailer::Base.delivery_method = :sendmail
y
config.action_mailer.perform_deliveries = true

Fueron los dos pasos necesarios que me llevaron sobre este tema

 1
Author: Jerome,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-08 15:55:37

Además de, su nombre de usuario de gmail no se alias.

Ref: https://support.google.com/mail/answer/12096?hl=en

 0
Author: seyyah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-02 05:44:24

Mis dos centavos valen:

Tuve exactamente los mismos síntomas con Rails 5.1: No pasó nada, los ajustes en mi archivo development.rb fueron completamente ignorados...

Entonces me acordé de reiniciar la máquina! (que resolvió mágicamente el problema)

Esto había sido señalado por un par de comentarios anteriores.

Sin embargo, el problema es complicado porque no espera este comportamiento. En mi opinión, los comentarios por defecto en development.rb son, a este respecto, engañosos:

# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since *you don't have to restart the web server when you make code changes*.
 0
Author: Varus Septimus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-30 21:10:48