javax.mail.MessagingException:无法连接到 SMTP 主机:本地主机,端口:25
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19493904/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25
提问by Sri Niwash
I am getting issue while sending email.
我在发送电子邮件时遇到问题。
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)
I use below code snipet.
我使用下面的代码片段。
Properties props = new Properties();
props.put("mail.smtp.host", "10.101.3.229");
email send program is running on tomcat 5. Some times it is working fine and some times it results above exception. once it satart resulting above exception it results the same on every access. but as soon as i restart tomcat server it starts working fine again.
电子邮件发送程序在 tomcat 5 上运行。有时它工作正常,有时它会导致异常。一旦它启动导致上述异常,它在每次访问时都会产生相同的结果。但是一旦我重新启动 tomcat 服务器,它就会再次开始正常工作。
So i could not find what is reason. as sometimes same is working fine and sometimes results above exception.
所以我找不到原因。因为有时相同工作正常,有时结果高于异常。
Can anybody help me out this issue.
任何人都可以帮我解决这个问题。
回答by Arun
It is very clear from your exception that it is trying to connect to localhost
and not to 10.101.3.229
从您的异常中可以清楚地看出它正在尝试连接localhost
而不是10.101.3.229
exception snippet : Could not connect to SMTP host: localhost, port: 25;
异常片段: Could not connect to SMTP host: localhost, port: 25;
1.) Please check if there are any null check which is setting localhost as default value
1.) 请检查是否有任何空检查将 localhost 设置为默认值
2.) After restarting, if it is working fine, then it means that only at first-run, the proper value is been taken from Properties and from next run the value is set to default. So keep the property-object as a singleton one and use it all-over your project
2.) 重新启动后,如果它工作正常,那么这意味着只有在第一次运行时,才从属性中获取正确的值,并在下次运行时将该值设置为默认值。因此,将属性对象保持为单例对象,并在整个项目中使用它
回答by Pape Diop
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 = "[email protected]";//
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("[email protected]"));
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("[email protected]",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);}
}
}
}
回答by Swaprks
This should not happen. Can you try doing this? Use the system properties and set the property as below:
这不应该发生。你可以试试这样做吗?使用系统属性并设置属性如下:
Properties properties = System.getProperties();
// Setup mail server
properties.setProperty("mail.smtp.host", "10.101.3.229");
And if you have a port associated, then set this as well.
如果你有一个关联的端口,那么也设置它。
properties.setProperty("mail.smtp.port", "8080");
回答by freeman
Try to set the property when starting JVM, for example, add -Djava.net.preferIPv4Stack=true
.
尝试在启动 JVM 时设置该属性,例如添加-Djava.net.preferIPv4Stack=true
.
You can't set it when code running, as the java.net just read it when jvm starting.
你不能在代码运行时设置它,因为 java.net 只是在 jvm 启动时读取它。
And about the root cause, this article give some hint: Why do I need java.net.preferIPv4Stack=true only on some windows 7 systems?.
关于根本原因,本文给出了一些提示:为什么我只在某些 Windows 7 系统上需要 java.net.preferIPv4Stack=true ?.
回答by Ashwani Sharma
I was also facing the same error. The reason for this is that there is no smtp server on your environment. For creating a fake smtp server I used this fake-smtp.jar file for creating a virtual server and listening to all the requests. If you are facing the same error, I recommend you to use this jar and run it after extracting and then try to run your application.
我也面临同样的错误。原因是您的环境中没有 smtp 服务器。为了创建一个假的 smtp 服务器,我使用了这个 fake-smtp.jar 文件来创建一个虚拟服务器并监听所有的请求。如果您遇到同样的错误,我建议您使用此 jar 并在解压缩后运行它,然后尝试运行您的应用程序。
回答by Harsh Sharma
Just look at this solution, make sure you've turned access on to less secure apps on your google account :javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25
看看这个解决方案,确保你在你的谷歌帐户上打开了对安全性较低的应用程序的访问:javax.mail.MessagingException:无法连接到 SMTP 主机:本地主机,端口:25