我在发送电子邮件时遇到问题。
javax.mail.SendFailedException: Sending failed;
nested exception is:
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25;
nested exception is:
java.net.ConnectException: Connection refused: connect
at javax.mail.Transport.send0(Transport.java:219)
at javax.mail.Transport.send(Transport.java:81)
at org.apache.jsp.online_005fScheme_005fSend_005fMail_jsp.sendMail(online_005fScheme_005fSend_005fMail_jsp.java:116)
at org.apache.jsp.online_005fScheme_005fSend_005fMail_jsp._jspService(online_005fScheme_005fSend_005fMail_jsp.java:416)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:619)
我使用以下代码狙击。
Properties props = new Properties();
props.put("mail.smtp.host", "10.101.3.229");
电子邮件发送程序在 Tomcat 5 上运行。有时它工作正常,有时它的结果高于异常。一旦它 Satart 导致上述异常,它在每次访问时都会产生相同的结果。但是一旦我重新启动Tomcat服务器,它就会再次开始正常工作。
所以我找不到什么是原因。 因为有时相同工作正常,有时结果高于异常。
任何人都可以帮助我解决这个问题。
package sn;
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
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 SendEmail {
public static void main(String[] args) {
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
// Get a Properties object
Properties props = System.getProperties();
props.setProperty("mail.smtp.host", "smtp.gmail.com");
props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth", "true");
props.put("mail.debug", "true");
props.put("mail.store.protocol", "pop3");
props.put("mail.transport.protocol", "smtp");
final String username = "xxxx@gmail.com";//
final String password = "0000000";
try{
Session session = Session.getDefaultInstance(props,
new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}});
// -- Create a new message --
Message msg = new MimeMessage(session);
// -- Set the FROM and TO fields --
msg.setFrom(new InternetAddress("xxxx@gmail.com"));
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("user120@example.com",false));
msg.setSubject("Hello");
msg.setText("How are you");
msg.setSentDate(new Date());
Transport.send(msg);
System.out.println("Message sent.");
}catch (MessagingException e){
System.out.println("Erreur d'envoi, cause: " + e);
}
}
}
从您的异常中可以清楚地看出,它正在尝试连接到localhost
而不是10.101.3.229
异常代码段:Could not connect to SMTP host: localhost, port: 25;
1.)请检查是否有任何空检查将本地主机设置为默认值
2.) 重新启动后,如果它工作正常,则意味着仅在第一次运行时,从"属性"中获取正确的值,从下次运行中将该值设置为默认值。因此,将属性对象保留为单例对象,并在整个项目中使用它
这不应该发生。你能试试这样做吗?使用系统属性并按如下所示设置属性:
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", "10.101.3.229");
如果您有关联的端口,则也设置此设置。
properties.setProperty("mail.smtp.port", "8080");
尝试在启动 JVM 时设置属性,例如,添加 -Djava.net.preferIPv4Stack=true
。
你不能在代码运行时设置它,因为 java.net 只是在 jvm 启动时读取它。
关于根本原因,本文给出了一些提示:为什么我只需要java.net.preferIPv4Stack=true在某些Windows 7系统上?
我也遇到了同样的错误。原因是您的环境中没有 smtp 服务器。为了创建一个假的smtp服务器,我使用了这个fake-smtp.jar文件来创建虚拟服务器并监听所有请求。如果您遇到同样的错误,我建议您使用此 jar 并在解压缩后运行它,然后尝试运行您的应用程序。
下载最新版本的假 smtp