我正在使用javamail从我的appengine应用程序发送邮件。它在部署中完美运行,但我无法弄清楚如何使用开发服务器执行此操作。每当我需要测试sendmail时,我都需要部署非常烦人的应用程序。
背景信息(为什么日志不起作用):
我们知道电子邮件会转到appengine开发服务器上的日志。但是,想要从开发服务器发送电子邮件的主要原因是能够测试电子邮件的格式。它看起来怎么样?需要对电子邮件模板进行更改,使其在电子邮件客户端A,B和C中看起来很好,并且可以快速完成,而无需每次都部署到真实的默认appengine版本。
我们不是垃圾邮件发送者。我们不是试图绕过任何类型的安全。简而言之,我们希望合法地能够在一个或多个电子邮件客户端中查看真实的实际电子邮件,然后立即进行代码更改,以便我们可以调整它们,而无需经历编辑,编译,等待5分钟的艰苦过程它可以部署,测试,重复循环。由于每个电子邮件客户端如何呈现电子邮件没有标准,因此通过尝试在许多客户端中使用某些内容来扩大这一艰苦的过程。
问题:
如何将Java Google App Engine开发服务器配置为从本地计算机或SMTP服务发送电子邮件,以便测试发送给真实电子邮件客户端的电子邮件?
答案 0 :(得分:12)
从Eclipse中,选择“运行”菜单,“调试配置...”,然后选择您的应用程序 组态。选择Arguments选项卡,然后在“VM arguments”部分中设置VM 像这样的属性:
-Dmail.log_mail_level=WARNING -Dmail.log_mail_body=true
答案 1 :(得分:6)
当我使用电子邮件服务实现时,我使用了一个很酷的提示。因此,如果您也使用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("<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")));
}
}
}
答案 2 :(得分:3)
来自the docs:
当一个应用程序在运行时 开发服务器调用Mail 服务发送电子邮件, 消息将打印到日志中。该 Java开发服务器不发送 电子邮件。
因此,只需在您打算发送邮件时检查日志,并确保它显示在那里。实际上不会发送真实邮件。
答案 3 :(得分:2)
GAE使用JavaMail,因此让它工作起来并不困难。你需要改变两件事。
第一种是为您的STMP服务器正确设置JavaMail会话。要执行此操作,请使用Session.getDefaultInstance
,而不是使用Session.getInstance
,至少提供mail.smtp.host
属性。请参阅JavaMail SMTP reference,或者只查找通用的JavaMail SMTP协议。
第二个变化是您需要停止GAE处理您的电子邮件。这是因为行
rfc822=gm
在SDK jar中的META-INF / javamail.address.map中。您可以包含自己的地址映射 - 但这很烦人,因为我假设您只想要它进行调试 - 或者从代码修改地址映射。这就像做
一样简单session.setProtocolForAddress("rfc822", "smtp");
在您在第一步中创建的会话上。这应该将您的所有电子邮件路由到标准的SMTP处理程序。
答案 4 :(得分:1)
您可以执行以下操作在开发服务器上设置电子邮件
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下添加以下两个库:
您可以通过Google搜索轻松找到这些链接。
最后,如果你想使用gmail作为smtp服务器,你需要转到你的帐户,并为少量seucre应用启用访问权限 https://www.google.com/settings/security/lesssecureapps
答案 5 :(得分:0)
如果其他人偶然发现此问题,请参阅configuring your local GAE server to send mail
的说明