2010-12-08 14 views
6

En Ruby on Rails, me gustaría que mi aplicación (en un entorno de prueba particular) intercepte todos los correos electrónicos salientes generados por la aplicación y en su lugar los envíe a una dirección de prueba diferente (tal vez también modificando el cuerpo para decir "Inicialmente enviado a: ...").Redirigir todos los correos electrónicos salientes a una sola dirección para probar

Veo ActionMailer tiene algunos ganchos para observar o interceptar el correo, pero no quiero usar mi propia solución si hay una manera más fácil de hacerlo. Sugerencias?

Respuesta

11

Estamos utilizando la gema sanitize_email con mucho éxito. Envía todos los correos electrónicos a la dirección que especifique y lo antepone con el destinatario original. Parece que hace exactamente lo que quiere y ha hecho que los correos electrónicos de QA-ing sean sencillos para nosotros.

+0

Eso parece exactamente lo que estoy buscando. ¡Gracias! – jrdioko

1

Normalmente, lo que hace en las pruebas es inspeccionar ActionMailer :: Base.deliveryies, que es una matriz de objetos TMail para los correos que se han enviado a través de su aplicación. En el entorno de prueba, la configuración predeterminada es que no se entrega nada, solo se coloca en esa matriz.

También buscaría usar email_spec en sus pruebas. Mucho más conveniente que rodar tu propia funcionalidad de prueba. Entre el uso de email_spec, las funciones auxiliares y los pasos web de capybara, y factory_girl, eso es cerca del 80% del área de superficie de una aplicación para probar en la mayoría de mis aplicaciones.

1

vieja pregunta, pero primero golpeado en Google ...

Finalmente he resuelto esto de una manera diferente por (ab) uso de delivery_method = :sendmail, esto efectivo sólo tubos de un correo electrónico a algo ejecutable; se supone que es sendmail, pero puede ser cualquier cosa, realmente.

En su config/environments/development.rb se puede hacer algo como:

YourApp::Application.configure do 
    # [...] 
    config.action_mailer.delivery_method = :sendmail 
    config.action_mailer.sendmail_settings = { 
     location: "#{Rails.root}/script/fake-sendmail", 
     arguments: '[email protected]', 
    } 
end 

y después hacen que script/fake-sendmail:

#!/bin/sh 
sendmail -if [email protected] "$1" < /dev/stdin 

(! No se olvide de hacer este ejecutable)

una solución relacionada (que prefiero) es solo anexarlo a un archivo mbox; esto requirió muy poca configuración.

El config/environments/development.rb tiene una apariencia similar:

YourApp::Application.configure do 
    # [...] 
    config.action_mailer.delivery_method = :sendmail 
    config.action_mailer.sendmail_settings = { 
     location: "#{Rails.root}/script/fake-sendmail", 
     arguments: "'#{Rails.root}/tmp/mail.mbox'", 
    } 
end 

Y script/fake-sendmail ahora queda como:

#!/bin/sh 
echo "From FAKE-SENDMAIL $(date)" >> "$1" 
cat /dev/stdin >> "$1" 
echo >> "$1" 

Abrir el archivo mbox con el cliente de correo electrónico $any ...

Este es un método muy simple , eso parece funcionar bastante bien. Algunos más detalles can be found here (soy el autor de esta página).

Cuestiones relacionadas