无法在Google App Engine上发送电子邮件

5

我尝试使用Javamail发送邮件。然而,我收到了以下信息:

javax.mail.SendFailedException: Send failure (javax.mail.MessagingException: Illegal Arguments (java.lang.IllegalArgumentException: Bad Request: ))

我尝试从管理员账户(我用来上传应用程序的账户)以及我登录应用程序时使用的用户账户发送电子邮件。(来自 UserService - getCurrentUser().getEmail())但都失败了。

我想知道是否有任何特殊设置需要设置?

    Properties props = new Properties();
    Session session = Session.getDefaultInstance(props, null);    
    Message msg = new MimeMessage(session);
    UserService userService = UserServiceFactory.getUserService();
    String email = userService.getCurrentUser().getEmail();
    //Or
    //String email = "my_admin_account@gmail.com";
    msg.setFrom(new InternetAddress(email));
    msg.addRecipient(Message.RecipientType.TO,
                     new InternetAddress("some_test_email@gmail.com"));
    msg.setSubject("Test Email");
    msg.setText("Nobody");
    Transport.send(msg);

你是否使用了一个不存在的虚假收件人地址?我没有看到代码有任何问题,而且我以前也用过类似的代码在appengine上发送邮件。 - jsight
我在示例中更改了收件人地址。我将邮件发送到管理员地址。 - Roy Chan
5个回答

5

这确实非常奇怪。我刚刚写了以下代码示例:

UserService userService = UserServiceFactory.getUserService();
String thisURL = request.getRequestURI();
if (request.getUserPrincipal() != null) {
    response.getWriter().println("<p>Hello, " +
                                request.getUserPrincipal().getName() +
                                "!  You can <a href=\"" +
                                userService.createLogoutURL(thisURL) +
                                "\">sign out</a>.</p>");
    Properties props = new Properties();
    Session mailSession = Session.getDefaultInstance(props, null);    
    Message msg = new MimeMessage(mailSession);
    String email = userService.getCurrentUser().getEmail();
    //Or
    //String email = "my_admin_account@gmail.com";
    msg.setFrom(new InternetAddress(email));
    msg.addRecipient(Message.RecipientType.TO,
                     new InternetAddress("jesse.sightler@gmail.com"));
    msg.setSubject("Test Email");
    msg.setText("Nobody");
    Transport.send(msg);
    response.getWriter().println("<p>Sent email!</p>");
} else {
    response.getWriter().println("<p>Please <a href=\"" +
                                userService.createLoginURL(thisURL) +
                                "\">sign in</a>.</p>");
}

没有例外,我确实收到了电子邮件。你确定实际应用程序中没有更多的问题吗?


4

仅浏览此文档,我发现以下内容:

出于安全考虑,消息的发送者地址必须是应用程序管理员的电子邮件地址或当前已登录的用户的Google帐户电子邮件地址。 电子邮件地址可以包括“回复”地址,该地址也必须符合这些限制。

因此,“电子邮件”至少应设置回您的管理员电子邮件帐户,或将专用电子邮件帐户添加为项目的管理员..

除此之外,我没有看到您的代码存在任何问题。


我尝试使用上传应用程序的帐户,但仍然无法使用。出现相同的错误信息。 - Roy Chan

1

很可能是因为您正在本地运行应用程序。 将其上传到应用引擎,它将正常工作。 *您的发件人电子邮件应该是您将项目部署到应用引擎时使用的邮件ID* 或管理员邮件ID。


1

我的两分钱!检查一下这个功能是否属于服务器而不是客户端类。


0

请确保您正在使用与当前已登录用户或应用程序部署的帐户的电子邮件地址相对应的消息发送方

最重要的是,如果应用程序在本地运行,则不会发送消息。要实际发送消息,请将其部署到Google App Engine并远程运行它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接