简体   繁体   English

无法从Google App Engine发送电子邮件

[英]Unable to send email from google app engine

I am on GAE Version 1.7.3 and using java mail api to send the email. 我使用GAE版本1.7.3,并使用java邮件api发送电子邮件。 On local development server the mail is sent fine. 在本地开发服务器上,邮件发送正常。 But after deploying to app engine i get following exception 但是在部署到App Engine之后,出现以下异常

com.google.apphosting.api.ApiProxy$CallNotFoundException: The API package 'remote_socket' or call 'Resolve()' was not found.
    at java.lang.Thread.getStackTrace(Thread.java:1495)
    at com.google.apphosting.runtime.ApiProxyImpl.doSyncCall(ApiProxyImpl.java:240)
    at com.google.apphosting.runtime.ApiProxyImpl.access$000(ApiProxyImpl.java:66)
    at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:183)
    at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:180)

    at java.security.AccessController.doPrivileged(Native Method)

    at com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:180)

    at com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:66)

    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:107)
    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:56)

    at com.google.appengine.api.socket.SocketApiHelper.apiProxyMakeSyncCall(SocketApiHelper.java:90)

    at com.google.appengine.api.socket.SocketApiHelper.makeSyncCall(SocketApiHelper.java:58)

    at com.google.appengine.api.socket.NameServiceImpl.lookupAllHostAddr(NameServiceImpl.java:61)

    at com.google.apphosting.util.ResolverManager$AppEngineNameservice.lookupAllHostAddr(ResolverManager.java:42)

    at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1353)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1303)

    at java.net.InetAddress.getAllByName(InetAddress.java:1232)

    at java.net.InetAddress.getAllByName(InetAddress.java:1163)

    at java.net.InetAddress.getByName(InetAddress.java:1113)

    at javax.mail.Service.connect(Service.java:257)

    at javax.mail.Service.connect(Service.java:91)

    at javax.mail.Service.connect(Service.java:76)

    at javax.mail.Transport.send(Transport.java:94)
    at javax.mail.Transport.send(Transport.java:48)
    at com.test.igreetings.service.impl.EmailImpl.sendEmail(EmailImpl.java:61)

Here is the my code to send the email: 这是我发送电子邮件的代码:

try {
            // Email is my custom pojo class
            Email email = new Email();
            email.setMailHost("smtp.gmail.com");
            email.setAuth("true");
            email.setFrom("username@gmail.com");
            email.setTo("targetemail@example.com");
            email.setSubject("test);
            email.setMessage("test body");
            email.setPort("25");
            email.setStarttls("true");
            email.setLogin("username@gmail.com");
            email.setPassword("pwd");

            Properties props = new Properties();
            props.setProperty("mail.host", email.getMailHost());
            props.setProperty("mail.smtp.port", email.getPort());
            props.setProperty("mail.smtp.auth", email.getAuth());
            props.setProperty("mail.smtp.starttls.enable", email.getStarttls());

            Authenticator auth = new SMTPAuthenticator(email.getLogin(), email.getPassword());

            Session session = Session.getInstance(props, auth);

            MimeMessage msg = new MimeMessage(session);
            msg.setText(email.getMessage());
            msg.setSubject(email.getSubject());
            msg.setFrom(new InternetAddress(email.getFrom()));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(email.getTo()));
            Transport transport = session.getTransport("smtp");
            transport.connect(email.getMailHost(), 25, "username@gmail.com", "pwd");

            transport.sendMessage(msg, msg.getAllRecipients());

            transport.close();
        } catch (AuthenticationFailedException ex) {
            Logging.log("AuthenticationFailedException in sendEmail: " + ex.toString());
            ex.printStackTrace();

        } catch (AddressException ex) {

            Logging.log("AddressException in sendEmail: " + ex.toString());
            ex.printStackTrace();
        } catch (MessagingException ex) {
            Logging.log("MessagingException in sendEmail: " + ex.toString());
            ex.printStackTrace();
        }

EDIT: 编辑:

I have changed code per your suggestion and here is my updated code: 我已根据您的建议更改了代码,这是我的更新代码:

Properties props = new Properties();
                        Session session = Session.getDefaultInstance(props, null);
                        Message msg = new MimeMessage(session);
                        msg.setFrom(new InternetAddress("username@gmail.com"));
                        msg.addRecipient(Message.RecipientType.TO,
                        new InternetAddress("targetemail@example.com"));
                        msg.setSubject("test");
                        msg.setText("test");
                        Transport.send(msg);

And i am getting similar exception The API package 'remote_socket' or call 'CreateSocket()' was not found. 而且我也收到类似的异常,未找到API包“ remote_socket”或调用“ CreateSocket()”。 The above sender is also registered as developer of this application. 上述发送者也已注册为该应用程序的开发者。

As @Shay noted you can not use external SMTP provider with GAE. 正如@Shay指出的,您不能将外部SMTP提供程序与GAE一起使用。 GAE uses it's own SMTP gateway. GAE使用它自己的SMTP网关。

Related issue: on GAE you can only send email that originates (ie from field) from one of the app administrators (GAE Admin -> permissions) or currently logged-in users via Google Accounts. 相关问题:在GAE上,您只能通过Google帐户发送来自一位应用程序管理员(GAE管理员->权限)或当前登录用户的电子邮件(即来自字段)。 Note: this only works for users logged-in via Google Accounts, not for users logged in via federated login (eg OpenID): Sending email on behalf of Google Apps user (answer is from Google engineer) 注意:这仅适用于通过Google帐户登录的用户,不适用于通过联合登录(例如OpenID)登录的用户: 代表Google Apps用户发送电子邮件 (答案来自Google工程师)

Update: as noted before, the username@gmail.com must be the email of the user that logged into your GAE app via Google Apps login or the user must be an admin of your GAE app. 更新:如前所述, username@gmail.com必须是通过Google Apps登录名登录到GAE应用程序的用户的电子邮件,或者该用户必须是GAE应用程序的管理员。

Update2: this works for me: Update2:这对我有用

Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
try {
    Message msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress("admin@domain.com", "Admin", "UTF-8"));
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(recipientAddress));
    msg.setSubject(emailSubject);
    msg.setText(emailText);
    Transport.send(msg);

} catch (AddressException e) {
// TO address not valid
} catch (MessagingException e) {
    // other email error
} catch (UnsupportedEncodingException e) {
    // should not happen UTF-8 is always available
}

An app cannot use the JavaMail interface to connect to other mail services for sending or receiving email messages. 应用程序无法使用JavaMail界面连接到其他邮件服务以发送或接收电子邮件。 SMTP configuration added to the Transport or Session is ignored. 添加到传输或会话的SMTP配置将被忽略。

Remove the port, user, password and mail host settings, and it should work. 删除端口,用户,密码和邮件主机设置,它应该可以工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM