我的应用程序上有一个按钮,必须检查输入的数据是否正确,将其添加到数据库并发送电子邮件,它由以下代码表示:
<%@ 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顾问。
答案 0 :(得分:0)
GAE附带自己的SMTP服务器,因此您无需设置自己的SMTP参数:https://developers.google.com/appengine/docs/java/mail/usingjavamail
但是,如果您设置了自己的SMTP参数,那么GAE将使用具有此limitations的套接字。这些适用于您的情况: