0

私はGAEバージョン1.7.3を使用しており、JavaメールAPIを使用してメールを送信しています。ローカル開発サーバーでは、メールは正常に送信されます。しかし、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)

メールを送信するための私のコードは次のとおりです。

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();
        }

編集:

私はあなたの提案に従ってコードを変更しました、そしてここに私の更新されたコードがあります:

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);

また、同様の例外が発生します。APIパッケージ「remote_socket」または呼び出し「CreateSocket()」が見つかりませんでした。上記の送信者は、このアプリケーションの開発者としても登録されています。

4

2 に答える 2

2

@Shay が指摘したように、GAE で外部 SMTP プロバイダーを使用することはできません。GAE は独自の SMTP ゲートウェイを使用します。

関連する問題: GAE では、アプリ管理者の 1 人 (GAE 管理者 -> 権限) または現在 Google アカウント経由でログインしているユーザーから発信された (つまり、フィールドからの) メールのみを送信できます。注: これは、フェデレーション ログイン (OpenID など) を介してログインしたユーザーではなく、Google アカウントを介してログインしたユーザーに対してのみ機能します: Google Apps ユーザーに代わってメールを送信(回答は Google エンジニアから)

更新:前述のように、 はGoogle Apps ログイン経由で GAE アプリにログインしusername@gmail.comたユーザーのメールアドレスであるか、ユーザーが GAE アプリの管理者である必要があります。

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
}
于 2013-01-09T12:39:34.543 に答える
1

アプリは、JavaMail インターフェースを使用して他のメール サービスに接続し、電子メール メッセージを送受信することはできません。トランスポートまたはセッションに追加された SMTP 構成は無視されます。

ポート、ユーザー、パスワード、およびメール ホストの設定を削除すると、機能するはずです。

于 2013-01-09T12:00:24.470 に答える