通过jsp发送邮件时出现服务器错误

时间:2013-09-03 08:08:26

标签: java google-app-engine jsp email

我的应用程序上有一个按钮,必须检查输入的数据是否正确,将其添加到数据库并发送电子邮件,它由以下代码表示:

<%@ page import = "java.text.*" %>

<%@ page import="java.io.*,java.util.*,javax.mail.*, javax.mail.Service"%>
<%@ page import="javax.mail.internet.*,javax.activation.*"%>
<%@ page import="javax.servlet.http.*,javax.servlet.*" %>

[...]

<a href="javascript:void();" onclick="      
javascript:if(confirmaEnviar())$('#usuario').submit();
 <% String result;
// Recipient's email ID needs to be mentioned.
    String host = "smtp.gmail.com";
    String to = "existingdirection@gmail.com";
    String from = "existingdirection2@gmail.com";
    String subject = "test";
    String messageText = "body test";

    Properties props = System.getProperties();
    props.put("mail.host", host);
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.port", "25");

    // If using authentication, otherwise comment out
    props.put("mail.smtp.auth", "true");

    // Gmail requires TLS, your server may not
    props.put("mail.smtp.starttls.enable", "true");

    Session mailSession = Session.getDefaultInstance(props, null);

    Message msg = new MimeMessage(mailSession);
    msg.setFrom(new InternetAddress(from));
    InternetAddress[] address = {new InternetAddress(to)};
    msg.setRecipients(Message.RecipientType.TO, address);
    msg.setSubject(subject);
    msg.setSentDate(new Date());
    msg.setText(messageText);

    Transport transport = mailSession.getTransport("smtp");

    //connect with authentication
    transport.connect(host,"existingdirection2@gmail.com" , "password");


    transport.sendMessage(msg, address);

    transport.close();

 %>                                 
return false;" class="button button-alt">ENVIAR</a></div>

但是如果我上传并尝试执行它,我在浏览器中收到错误:错误:服务器错误 服务器遇到错误,无法完成您的请求。

我原以为可能是jsp代码无法以这种方式调用(在onclick中间)但是如果我把它放到代码的另一个地方(在html标签的中间)错误仍然再现。

我已经将java邮件库添加到java构建路径中,我还将它复制到了lib目录。

当然已经测试了失败的是与电子邮件相关的代码,如果我将其从应用程序中删除,剩下的就很好了。

密码的电子邮件说明也已经过检查。

我正在使用GAE来托管该应用程序。

对可能发生的事情有所了解?

我很感谢你的帮助。

编辑:这是堆栈跟踪,猜测它毕竟不是一个与代码相关的问题..

com.google.apphosting.api.ApiProxy $ FeatureNotEnabledException:在管理控制台中启用结算后,将为此应用启用套接字API。在java.lang.Thread.getStackTrace(Thread.java:1567)的com.google.apphosting.runtime.ApiProxyImpl.doSyncCall(ApiProxyImpl.java:259)com.google.apphosting.runtime.ApiProxyImpl.access $ 000(ApiProxyImpl。 java:68)at com.google.apphosting.runtime.ApiProxyImpl $ 1.run(ApiProxyImpl.java:202)at com.google.apphosting.runtime.ApiProxyImpl $ 1.run(ApiProxyImpl.java:199)at java.security.AccessController .doPrivileged(原生方法)位于com.google.apphosting.AunProxyImpl.makeSyncCall(ApiProxyImpl.java:68)的com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:199)com.google.apphosting .api.ApiProxy.makeSyncCall(ApiProxy.java:107)位于com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:56)com.google.appengine.api.socket.SocketApiHelper.apiProxyMakeSyncCall(SocketApiHelper.java) :90)com.google.appengine.api.socket.Expper.sap.Name上面的com.google.appengine.api.Socket.SocketApiHelper.makeSyncCall(SocketApiHelper.java:58)。(NameServiceIpi.java) :61)

Strnage的事实是,在Google Api的控制台中没有名为Socket API的API,我想我也会尝试联系Google顾问。

1 个答案:

答案 0 :(得分:0)

GAE附带自己的SMTP服务器,因此您无需设置自己的SMTP参数:https://developers.google.com/appengine/docs/java/mail/usingjavamail

但是,如果您设置了自己的SMTP参数,那么GAE将使用具有此limitations的套接字。这些适用于您的情况:

  1. 套接字仅适用于付费应用 - 这是产生错误的
  2. 端口25(SMTP)被阻止
  3. Google IP范围被屏蔽,但Gmail SMTPS:smtp.gmail.com port 465和587
  4. 除外