2010-06-21 14 views
13

Estoy usando javamail para enviar correos desde mi aplicación appengine. Funciona perfectamente en la implementación, pero no puedo encontrar la manera de hacerlo utilizando el servidor de desarrollo. Cada vez que necesito probar el sendmail, tengo que implementar la aplicación, que es bastante molesto.probando el correo con el servidor de desarrollo appengine (java)

Información de Antecedentes (¿Por qué registros no funcionan):

sabemos correos electrónicos van a los registros en el servidor de desarrollo de Google App Engine. Sin embargo, la razón principal para querer enviar correos electrónicos desde el servidor de desarrollo es poder probar el formato del correo electrónico. ¿Cómo se ve? ¿Es necesario realizar cambios en la plantilla de correo electrónico para que se vea bien en los clientes de correo electrónico A, B y C, y se puede hacer rápidamente sin la molestia de implementar en una versión appengine real, predeterminada, cada vez.

No somos spammers. No estamos tratando de eludir ningún tipo de seguridad. En resumen, queremos legítimamente poder ver el correo electrónico real y real en uno o más clientes de correo electrónico y luego realizar cambios de código al instante para poder modificarlos sin tener que pasar por el minucioso proceso de la edición, compilar, esperar 5 minutos para que despliegue, pruebe, repita el ciclo. Debido a que no hay estándares en la forma en que cada cliente de correo electrónico genera un correo electrónico, este proceso minucioso se amplifica al tratar de hacer que algo funcione en muchos clientes.

Pregunta:

¿Cómo puede el servidor de desarrollo de motores de Java Google App ser configurado para enviar mensajes de correo electrónico desde el equipo local o un servicio SMTP con el fin de poner a prueba los correos electrónicos enviados a clientes de correo electrónico reales, reales?

Respuesta

3

De the docs:

Cuando una aplicación se ejecuta en el servidor de desarrollo llama al servicio de correo de para enviar un mensaje de correo electrónico, el mensaje se imprime en el registro. El servidor de desarrollo Java no envía el mensaje de correo electrónico.

Así que simplemente verifique los registros cuando tenga la intención de enviar correos, y asegúrese de que aparezcan allí. No se enviará realmente un correo real.

+1

Esto no sirve porque necesito verificar otras cosas también; si el mensaje tiene el formato correcto, si los archivos adjuntos se pueden descargar y si el correo se está entregando en primer lugar. – akula1001

+0

No puede hacer ese tipo de prueba de integración con el servidor de desarrollo. Le sugiero que configure eso en la implementación con, por ejemplo, una aplicación separada o use su propio servidor de correo en lugar de las API de App Engine. – hleinone

+0

@hleinone - Solo quería hacerle saber que hay una recompensa en esta pregunta, y parece que sabrá cómo resolver esto. – jmort253

12

Desde Eclipse, seleccione el menú Ejecutar, Configuraciones de depuración ..., y luego seleccione la configuración de su aplicación. Seleccione la pestaña Argumentos, a continuación, en la sección “argumentos de VM”, establecer VM propiedades como esta:

-Dmail.log_mail_level=WARNING -Dmail.log_mail_body=true

+0

Esto en realidad no envía el correo electrónico, ¿verdad? ¿Simplemente imprime el marcado bruto en los registros? ¿Correcto? – jmort253

+0

Ha pasado mucho tiempo que respondí esta pregunta y realmente no recuerdo. Para comprobar si el correo se está enviando o no, puede probarlo usando test-mail-server-tool http://www.toolheap.com/test-mail-server-tool/ si está trabajando en la plataforma de Windows. – zawhtut

6

Cuando trabajé con una implementación de servicio de correo electrónico utilicé un toque fresco. Entonces, si también usa MimeMessage y solo desea comprobar si el mensaje está formateado como se esperaba, verificando si hay archivos adjuntos, si el formato de HTML está correcto, si las imágenes están referenciadas correctamente, etc., podría compilar todo el mensaje y durante la depuración podría tener algo de código como este:

MimeMessage msg = new MimeMessage(session); 
... 
if ("1".equals(System.getProperty("mail.debug"))) { 
    msg.writeTo(new FileOutputStream(new File("/tmp/sentEmail.eml"))); 
} 

Cada vez que esto se ejecuta el MimeMessage instane se guardará en emailSent.eml. Este archivo puede abrirlo con su lector de correo electrónico y verificar si todo está bien.

Por supuesto que necesita ejecutar su aplicación con el parámetro -Dmail.debug = 1.

Un ejemplo con el archivo adjunto, mensajes de texto y html con este enfoque podría ser así:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Properties; 

import javax.activation.DataHandler; 
import javax.activation.FileDataSource; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.Multipart; 
import javax.mail.Session; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 

import org.junit.Test; 

public class MimeMessageTest { 

    @Test 
    public void tesstMimeMessage() throws MessagingException, FileNotFoundException, IOException { 
     Session session = Session.getDefaultInstance(new Properties(), null); 
     MimeMessage msg = new MimeMessage(session); 
     msg.setFrom(new InternetAddress("[email protected]", "Foo Admin")); 
     msg.addRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]", "Baz User")); 
     msg.setSubject("Subject from admin e-mail to baz user"); 

     // create and fill the first message part 
     MimeBodyPart mbp1 = new MimeBodyPart(); 
     mbp1.setText("test message and so on"); 
     mbp1.setContent("<h1>test message and so on in HTML</h1>", "text/html"); 

     // create the second message part 
     MimeBodyPart mbp2 = new MimeBodyPart(); 

     // attach the file to the message 
     FileDataSource fds = new FileDataSource("/tmp/fileToBeAttached"); 
     mbp2.setDataHandler(new DataHandler(fds)); 
     mbp2.setFileName(fds.getName()); 

     // create the Multipart and add its parts to it 
     Multipart mp = new MimeMultipart(); 
     mp.addBodyPart(mbp1); 
     mp.addBodyPart(mbp2); 

     // add the Multipart to the message 
     msg.setContent(mp); 

     if ("1".equals(System.getProperty("debug"))) { 
      msg.writeTo(new FileOutputStream(new File("/tmp/sentEmail.eml"))); 
     } 
    } 
} 
+0

¡Hola Spaeth, esto se ve genial! Buena idea. Una pregunta, ¿puede escribir en el sistema de archivos desde el servidor de desarrollo GAE, o está ejecutando esto fuera del GAE Java SDK? – jmort253

+1

Me estoy ejecutando fuera de 'GAE'. ** PERO **, si no puede guardarlo en un archivo, podría, por ejemplo: imprimirlo en salida estándar y copiar/pasar a un archivo (ya que mimeMessage es un archivo de texto con todos los archivos adjuntos codificados en Base64), esta podría ser una solución para verificar si hay archivos adjuntos, formato HTML, enlaces ok, imágenes referenciadas a la derecha, etc. Por lo tanto, necesita este cambio: 'msg.writeTo (System.out);' en lugar de 'msg.writeTo (new FileOutputStream (new File ("/tmp/sentEmail.eml ")));' –

+0

Ok, ya estoy escribiendo la plantilla completa a la secuencia de salida, pero no como un mensaje de correo electrónico, sino solo como una plantilla. En realidad, no parece que me lleve mucho tiempo implementarlo. Voy a probar esto el fin de semana. Gracias. – jmort253

2

GAE usa JavaMail, así que no es demasiado difícil de conseguir que funcione. Hay dos cosas que necesitará cambiar.

El primero es configurar su sesión de JavaMail correctamente para su servidor STMP. Para hacer esto, en lugar de usar Session.getDefaultInstance, use Session.getInstance, proporcionando al menos las propiedades mail.smtp.host. Vea JavaMail SMTP reference, o simplemente busque un tutortial JavaMail SMTP genérico.

El segundo cambio es que debe evitar que GAE maneje sus correos electrónicos. Esto se hace debido a la línea

rfc822=gm 

en META-INF/javamail.address.map en el frasco SDK. Puede incluir su propio mapa de direcciones, pero eso es molesto porque supongo que solo lo quiere para la depuración, o modificar el mapa de direcciones del código. Eso es tan simple como hacer

session.setProtocolForAddress("rfc822", "smtp"); 

en la sesión que creó en el primer paso. Eso debería enrutar todos sus correos electrónicos al controlador SMTP estándar.

1

Usted puede hacer lo siguiente para configurar el correo electrónico en el servidor de desarrollo

final String username = "[email protected]";//change accordingly 
final String password = "xxxxxxx";//change accordingly 

// Assuming you are sending email through gmail 
String host = "smtp.gmail.com"; 

Properties props = new Properties(); 
props.put("mail.smtp.auth", "true"); 
props.put("mail.smtp.starttls.enable", "true"); 
props.put("mail.smtp.host", host); 
props.put("mail.smtp.port", "587"); 

// Get the Session object. 
Session session = Session.getInstance(props, 
new javax.mail.Authenticator() { 
protected PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(username, password); 
} 
}); 
session.setProtocolForAddress("rfc822", "smtp"); 

Y el uso de la sesión normalmente para enviar mensajes de correo electrónico:

try { 
    Message msg = new MimeMessage(session); 
    msg.setFrom(new InternetAddress("[email protected]", "xxxx")); 
    msg.addRecipient(Message.RecipientType.TO, 
    new InternetAddress("[email protected],"Mr. User")); 
    msg.setSubject("Test email from GAE/J development"); 
    msg.setText("This is test:); 
    Transport.send(msg); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

Además es necesario agregar las dos bibliotecas siguientes en Vía de construcción y bajo war/WEB-INF/lib:

  • javax.mail.jar
  • javax.activation.jar

Puede encontrar los enlaces fácilmente buscándolos en Google.

Por último, si desea utilizar Gmail como servidor SMTP, tiene que ir a su cuenta, y permitir el acceso por menos aplicaciones seucre https://www.google.com/settings/security/lesssecureapps

Cuestiones relacionadas