Java 连接到SMTP服务器时出现SocketException,但使用telnet it';他在工作

Java 连接到SMTP服务器时出现SocketException,但使用telnet it';他在工作,java,email,smtp,telnet,socketexception,Java,Email,Smtp,Telnet,Socketexception,我想通过Java发送电子邮件,但不幸的是,我遇到以下异常: javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25; nested exception is: java.net.SocketException: Permission denied: connect 我正在使用电子邮件 但是,在尝试使用连接到服务器时 telnet loc

我想通过Java发送电子邮件,但不幸的是,我遇到以下异常:

javax.mail.MessagingException: 
    Could not connect to SMTP host: localhost, port: 25;
        nested exception is:
            java.net.SocketException: Permission denied: connect
我正在使用电子邮件

但是,在尝试使用连接到服务器时

telnet localhost 25
我能建立联系

远程SMTP服务器也会出现同样的情况

有什么问题吗


在这里,
mail.debug
设置为
“true”
的输出:


要通过SMTP通过应用程序发送邮件,需要在SMTP服务器上中继计算机的IP

获取SMTP服务器上的Ip中继。从今往后,您将能够发送邮件,并且不会因为权限被拒绝而获得例外情况

我不同意harsh(对不起,我不能评论我应该评论的地方,声誉不够)。权限被拒绝的错误发生在connect系统调用中,因此在客户端甚至可以尝试向服务器进行身份验证之前就已经发生了

不幸的是,您没有提供任何关于您在哪个系统上运行的信息—windows、linux、其他unix或完全不同的系统

我曾经在一家公司遇到过这样的问题,所有客户端PC上的本地McAffe都配置为阻止所有到端口25的流量,因此如果一个客户端感染了病毒,它仍然无法邮寄炸弹攻击其他客户端。也许你的系统上正在运行类似的东西


或者,可能是ipv4(我假设您使用的是java)被阻止的问题,但ipv6是允许的。尝试在telnet连接后执行netstat,以确定它使用的是哪一个。但是,我还是认为这与您计算机上的防火墙设置有关,它可能允许一个IP协议,但不允许另一个。

您可以尝试以下程序来检查gmail smtp服务器(假设您有gmail帐户),如果这工作正常,您肯定对Mercury邮件服务器设置有一些问题:

public static void main(String[] args) throws Exception {
    String host = "smtp.gmail.com";
    String username = "your-gmail-username@gmail.com";
    String password = "gmail-password";
    Properties props = new Properties();
    props.put("mail.debug", true);
    Session session = Session.getInstance(props);
    MimeMessage msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress(username));
    msg.setRecipient(RecipientType.TO, new InternetAddress(username));
    msg.setSubject("This is the Subject Line!");
    msg.setContent("<h1>This is actual message</h1>",
                       "text/html" );
    Transport t = session.getTransport("smtps");
    try {
        t.connect(host, username, password);
        t.sendMessage(msg, msg.getAllRecipients());
    } finally {
        t.close();
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
String host=“smtp.gmail.com”;
String username=“您的gmail-username@gmail.com";
String password=“gmail密码”;
Properties props=新属性();
props.put(“mail.debug”,true);
Session=Session.getInstance(props);
MimeMessage msg=新MimeMessage(会话);
msg.setFrom(新的Internet地址(用户名));
msg.setRecipient(RecipientType.TO,新的InternetAddress(用户名));
msg.setSubject(“这是主题行!”);
msg.setContent(“这是实际的消息”,
“文本/html”);
传输t=session.getTransport(“smtps”);
试一试{
t、 连接(主机、用户名、密码);
t、 sendMessage(msg,msg.getAllRecipients());
}最后{
t、 close();
}
}

我也有类似的问题。在花费数小时后,通过在代码中添加以下行,最终解决了问题:

System.setProperty("java.net.preferIPv4Stack" , "true");

默认情况下,Java使用ipv6,我传递的是ipv4地址。放在上面一行之后,它工作了。

它清楚地统计了
权限被拒绝
,您需要传递身份验证信息才能连接到
SMTP
服务器,或者您的java
smpt
客户端配置有问题。@harsh我没有通过telnet传递任何身份验证信息,它正在工作。请尝试设置
props.put(“mail.debug”,“true”)
假设
props
是您的
Properties
实例,它将在控制台上打印smtp内部日志,这可能有助于调试further@harsh不幸的是,这并没有改变任何事情。检索此属性时,它的计算结果为
null
@hash,我错了:我将其设置为
false
,而不是
true
。但是输出没有太大帮助:
调试SMTP:尝试连接到主机“localhost”,端口25,isSSL false
防火墙问题在我看来不太可能(
主机:localhost,端口25
),除非harold对本地框进行了一些更改。。。而且
telnet
也能够连接。现在在
auth
上,它再次被排除在外,因为
telnet
客户端太多了,没有使用任何
auth
信息,我错过了这一点,而是基于
异常
@Harold,你在机器上安装的
smtp
服务器和任何特定的配置???@harsh我在一家公司内部运行Windows 7。我的本地Mercury Mail SMTP服务器以及远程测试服务器出现问题。@问题是IPv6已被阻止。我猜
telnet
没有使用
IPv6
,因此工作正常;记住一个好的指针。你能详细说明一下你的答案吗?如何配置?请告诉我您正在使用的SMTP服务器好吗?我正在使用Mercury Mail。请查看此链接,
System.setProperty("java.net.preferIPv4Stack" , "true");