0

私のGAEアプリケーションでは、JavaメールAPIを使用してメールを送信できません。次のエラーが発生します。

javax.mail.MessagingException: Connection error (java.net.SocketException: Permission denied: Not allowed to issue a socket bind: permission denied.)
    at org.apache.geronimo.javamail.transport.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:408)
    at javax.mail.Service.connect(Service.java:248)
    at com.soa.util.SendMailSSL.sendMail(SendMailSSL.java:54)
    at com.soa.managers.MailManager.mailApproved(MailManager.java:87)
    at com.soa.managers.WidgetManager.approveRequest(WidgetManager.java:216)
    at com.soa.servlets.WidgetServlet.doPost(WidgetServlet.java:71)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:383)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.net.SocketException: Permission denied: Not allowed to issue a socket bind: permission denied.
    at com.google.appengine.api.socket.SocketApiHelper.translateError(SocketApiHelper.java:94)
    at com.google.appengine.api.socket.SocketApiHelper.translateError(SocketApiHelper.java:105)
    at com.google.appengine.api.socket.SocketApiHelper.makeSyncCall(SocketApiHelper.java:71)
    at com.google.appengine.api.socket.AppEngineSocketImpl.createSocket(AppEngineSocketImpl.java:502)
    at com.google.appengine.api.socket.AppEngineSocketImpl.bind(AppEngineSocketImpl.java:518)
    at java.net.Socket.bind(Socket.java:577)
    at java.net.Socket.<init>(Socket.java:373)
    at java.net.Socket.<init>(Socket.java:249)
    at org.apache.geronimo.javamail.transport.smtp.SMTPTransport.getConnectedSocket(SMTPTransport.java:1096)
    at org.apache.geronimo.javamail.transport.smtp.SMTPTransport.getConnection(SMTPTransport.java:856)
    at org.apache.geronimo.javamail.transport.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:385)
    ... 40 more

私のコードは

package com.soa.util;

import java.util.*;

import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMailSSL {
    public static boolean sendMail(String msg, String subject,
            List<String> recipients) {

        Address[] emails = new InternetAddress[recipients.size()];
        for (int i = 0; i < recipients.size(); i++) {
            try {
                //System.out.println(recipients.get(i));
                emails[i] = new InternetAddress(recipients.get(i));
            } catch (AddressException e) {
                e.printStackTrace();
            }
        }

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.auth", "true");
        props.setProperty("mail.smtp.port", "587");
        props.put("mail.smtp.starttls.enable", "true");

        Session session = Session.getDefaultInstance(props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(
                                "my_mail_id@gmail.com", "password");
                    }
                });

        try {
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress("my_mail_id@gmail.com"));// Sender
                                                                            // Id.
            message.addRecipients(Message.RecipientType.TO, emails);
            message.setSubject(subject);
            message.setText(msg);

            // send message.
            //Transport.send(message);
            Transport transport = session.getTransport("smtp");
            transport.connect("smtp.gmail.com", 587, "my_mail_id@gmail.com", "password");
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
            System.out.println("message sent successfully");
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
            System.out.println("failed");
        }catch (Exception e) {
            e.printStackTrace();
            System.out.println("failed :(");
        }
        return false;
    }
}

アプリケーションを機能させるにはどうすればよいですか?

またTransport.send(message);、Transportのインスタンスを作成する代わりに使用すると、エラーメッセージは表示されませんが、電子メールは送信されません。

どうすれば修正できますか。誰かplが私を助けてくれます。

4

1 に答える 1

1

ついに答えが見つかりました...問題は、Googleでは外部メールID(Gmail以外またはGoogle以外のメールID)の使用が許可されていないため、トランスポートオブジェクトへの接続プロパティを構成できないことでした。

message.setFrom()でアプリエンジンのadmin mail-idを指定し、Transport.send();を使用して送信するだけです。

私の場合、Transport.send()は何もしていませんでした。これは、ローカルのEclipseプロジェクトから送信しようとしたからです。Googleは、デプロイされたアプリケーションからのみメールを送信します。

そのため、アプリケーションをコーディングし、エラーがない場合は、アプリエンジンにデプロイします。その後、アプリはメールの送信を開始します。

詳細については、このGoogleデベロッパーページを参照してください。

さらに、すべてのOraclejavax.mailjarを削除します。App Engine jarには、デフォルトでapp-engine固有のjavax.mailクラスがあります

于 2012-11-13T13:48:54.603 に答える