用appengine开发服务器测试邮件(java)
我正在使用javamail从我的appengine应用程序发送邮件。 它在部署中完美运行,但我无法弄清楚如何使用开发服务器执行此操作。 每当我需要测试sendmail时,我都需要部署非常烦人的应用程序。
背景信息(为什么日志不起作用):
我们知道电子邮件会转到appengine开发服务器上的日志。 但是,想要从开发服务器发送电子邮件的主要原因是能够测试电子邮件的格式。 它看起来怎么样? 需要对电子邮件模板进行更改,以使其在电子邮件客户端A,B和C中看起来很好,并且可以快速完成,而无需每次都部署到真实的默认appengine版本的麻烦。
我们不是垃圾邮件发送者。 我们不是试图绕过任何类型的安全。 简而言之,我们希望合法地能够在一个或多个电子邮件客户端中查看真实的实际电子邮件,然后立即进行代码更改,以便我们可以调整它们,而无需经历编辑,编译,等待5分钟的艰苦过程它可以部署,测试,重复循环。 由于每个电子邮件客户端如何呈现电子邮件没有标准,因此通过尝试在许多客户端中使用某些内容来放大这一艰苦的过程。
题:
Java Google App Engine开发服务器如何配置为从本地计算机或SMTP服务发送电子邮件,以便测试发送到真实,实际电子邮件客户端的电子邮件?
从Eclipse中,选择“运行”菜单,“调试配置…”,然后选择应用程序的配置。 选择Arguments选项卡,然后在“VM arguments”部分中,设置VM属性,如下所示:
-Dmail.log_mail_level=WARNING -Dmail.log_mail_body=true
当我使用电子邮件服务实现时,我使用了一个很酷的提示。 因此,如果您也使用MimeMessage
,并且只想检查消息是否按预期格式化,检查附件是否存在,HTML格式正确,图像是否正确引用等等,您可以构建整个消息,并且在调试期间您可以有这样的代码:
MimeMessage msg = new MimeMessage(session); ... if ("1".equals(System.getProperty("mail.debug"))) { msg.writeTo(new FileOutputStream(new File("/tmp/sentEmail.eml"))); }
每次执行此操作时, MimeMessage
instane都将保存到emailSent.eml
。 您可以使用电子邮件阅读器打开此文件,并检查一切是否正常。
当然,您需要使用-Dmail.debug = 1参数执行您的应用程序。
使用此方法附加文件,文本消息和html消息的示例可能如下所示:
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("admin@foo.bar", "Foo Admin")); msg.addRecipient(Message.RecipientType.TO, new InternetAddress("baz@foo.bar", "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("test message and so on in HTML
", "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"))); } } }
来自文档 :
当在开发服务器中运行的应用程序调用Mail服务发送电子邮件消息时,该消息将打印到日志中。 Java开发服务器不发送电子邮件消息。
因此,只需在您打算发送邮件时检查日志,并确保它显示在那里。 实际上没有真正的邮件会被发送。
GAE使用JavaMail,因此使其工作并不困难。 你需要改变两件事。
第一种是为STMP服务器正确设置JavaMail会话。 为此,请使用Session.getDefaultInstance
,而不是使用Session.getDefaultInstance
,至少提供mail.smtp.host
属性。 请参阅JavaMail SMTP参考 ,或者只查找通用JavaMail SMTP协议。
第二个变化是您需要停止GAE处理您的电子邮件。 这是因为这条线
rfc822=gm
在SDK jar中的META-INF / javamail.address.map中。 您可以包含自己的地址映射 – 但这很烦人,因为我假设您只需要它进行调试 – 或者从代码中修改地址映射。 这就像做一样简单
session.setProtocolForAddress("rfc822", "smtp");
在您在第一步中创建的会话上。 这应该将您的所有电子邮件路由到标准SMTP处理程序。
您可以执行以下操作在开发服务器上设置电子邮件
final String username = "xxxxxxxxx@gmail.com";//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");
并正常使用会话发送电子邮件:
try { Message msg = new MimeMessage(session); msg.setFrom(new InternetAddress("xxxx@gmail.com", "xxxx")); msg.addRecipient(Message.RecipientType.TO, new InternetAddress("user@testdomain.com,"Mr. User")); msg.setSubject("Test email from GAE/J development"); msg.setText("This is test:); Transport.send(msg); } catch (Exception e) { e.printStackTrace(); }
此外,您需要在构建路径和war / WEB-INF / lib下添加以下两个库:
- javax.mail.jar
- javax.activation.jar
您可以通过Google搜索轻松找到这些链接。
最后,如果您想将gmail用作smtp服务器,则需要转到您的帐户,并启用较少seucre应用的访问权限https://www.google.com/settings/security/lesssecureapps
如果其他人偶然发现此问题,请参阅以下有关配置本地GAE服务器以发送邮件的说明
- 为什么在托管模式下运行GWT App Engine应用程序时会出现ClassNotPersistableException?
- 如何在Google App Engine(Java)中启用会话支持?
- Maven:资源二进制文件在构建后更改文件大小
- 我可以全局设置HTTP连接的超时吗?
- 如何从非GWT(但Java)gapplication调用服务器上的GWT RPC方法?
- Google App Engine:Memcache还是Static变量?
- ImagesService.getServingUrl的URL持续多长时间
- 在GAE / J和JPA上使用@MappedSuperclass时,“字段jdoFieldFlags是冲突的”
- 如何配置Google AppEngine以使用矢量图形?