连接到SMTP服务器时出现SocketException,但是telnet正在运行

时间:2013-12-06 09:31:02

标签: 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

我正在使用this little example program发送电子邮件。

但是在尝试使用

连接服务器时
telnet localhost 25

我能够建立连接。

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

可能是什么问题?


此处mail.debug的输出设置为"true"

DEBUG: JavaMail version 1.4.7
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "localhost", port 25, isSSL false

4 个答案:

答案 0 :(得分:2)

我不同意苛刻(对不起,不能评论我应该在哪里,没有足够的声誉)。在连接系统调用中发生权限被拒绝错误,所以它在客户端甚至可以尝试向服务器进行身份验证之前就已经存在了。

不幸的是,您没有提供有关您正在运行的系统的任何信息 - Windows,Linux,其他一些unix或完全不同的东西。

我曾经在一家公司遇到过这种问题,所有客户端PC上的本地McAffee都被配置为阻止所有流量到25端口,所以如果客户端遇到病毒,它仍然无法对其他人进行邮件拦截。也许这样的东西在你的系统上运行?

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

答案 1 :(得分:1)

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

将IP转发到SMTP服务器上。从此以后,您将能够发送邮件,并且不会因为权限被拒绝而获得例外

答案 2 :(得分:0)

您可以尝试使用程序检查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();
    }
}

答案 3 :(得分:0)

我有类似的问题。花了几个小时后,最后通过在代码中添加以下内容来解决问题:

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

默认情况下,Java使用ipv6,我正在传递ipv4地址。在上线后,它工作。