发送邮件可以从Perl运行,但不能从Java运行

时间:2012-03-23 10:02:38

标签: java perl email

我有一个场景,我将使用我们自己的SMTP服务器使用Java发送电子邮件。我在Tomcat 6上部署了一个应用程序。

  1. 当我们使用GMail SMTP时,发送电子邮件的功能正常。
  2. 当我尝试使用自己的服务器时,该功能无效。
  3. 我收到以下错误

    MailException occured while sending emailMail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: 172.16.16.1, port: 25;
      nested exception is:
        java.net.ConnectException: Connection timed out. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: 172.16.16.1, port: 25;
      nested exception is:
        java.net.ConnectException: Connection timed out
    

    问题是使用Perl脚本中相同的凭据和配置参数,一切正常。

    我正在使用Debain系统。

    我怀疑是否存在某种访问权限问题。我是Linux新手,知识非常有限。

    有人可以帮忙吗?

    Perl SCRIPT

    将Perl脚本粘贴在下面以供参考

    #!/usr/bin/env perl
    
    # System Modules
    use strict;
    use warnings;
    use Mail::Sender;
    
    my $subject = q/Testing Mail Server./;
    my $smtp = q/localhost/;
    my $from = 'Test <no-reply@xxxx.com>';
    my $to   = 'shardul@xxxx.com';
    my $msg = q/Hi Testing.../;
    my $auth    = q{};
    my $authid  = q{};
    my $authpwd = q{};
    
    eval {
        sendmail( $smtp, $from, $to, q{}, $subject, $msg, $auth, $authid, $authpwd );
    };
    if ( $@ ) {
        print STDERR "Confirmation Mail Sending to $to Failed.\n";
        print STDERR 'ERROR: ' . $@;
    }
    
    sub sendmail {
        my ( $smtp, $from, $to, $bcc, $subject, $msg, $auth, $authid, $authpwd ) = @_;
        my $sender = new Mail::Sender { smtp => $smtp, from => $from };
        $sender->Body( 0, 0, 'text/html' );
        my $result = $sender->MailMsg(
            {
                replyto   => 'test@xxxxxx.com',
                to        => $to,
                bcc       => $bcc,
                subject   => $subject,
                msg       => $msg,
                auth      => $auth,
                authid    => $from,
                authpwd   => $authpwd,
            }
        );
        if ( $result < 0 ) {
            die "$Mail::Sender::Error\n";
        }
    }
    

3 个答案:

答案 0 :(得分:1)

您收到java.net.ConnectException,因此Java VM无法连接到邮件服务器。这不是真正的邮件问题,因为Java无法看到邮件服务器。

你说:

  

使用Perl脚本中相同的凭据和配置参数,一切正常。

Perl脚本是否在与Java相同的系统上运行?如果不是,它看起来像Java主机和邮件服务器之间的网络连接问题。

如果Perl脚本在同一系统上运行,请仔细检查脚本是否正在执行您认为的操作,可能使用类似netstat命令的操作。如果服务器有多个网络接口,请检查Java VM是否绑定到无法联系邮件服务器的Java VM。

更新 - 您的Perl脚本使用172.16.16.1处的邮件服务器发送邮件。你可以从这一行看到:

my $smtp = q/localhost/;

脚本通过与脚本在同一主机上运行的邮件服务器发送邮件。

它看起来像网络问题。尝试运行以下命令:

telnet 172.16.16.1 25

如果您在端口25上具有到邮件服务器的网络连接,您将看到如下内容:

$ telnet smtp.gmail.com 25
Trying 173.194.67.109...
Connected to gmail-smtp-msa.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP fw5sm12835658wib.0

如果您没有网络连接,您会看到如下内容:

$ telnet 172.16.16.1 25
Trying 172.16.16.1...
telnet: connect to address 172.16.16.1: Operation timed out
telnet: Unable to connect to remote host

如果确实有连接,那么本地系统上必须有一些东西阻止JVM连接,可能是iptables规则。例如,网络连接可能受用户标识限制。您是否以与Tomcat相同的用户身份运行Perl脚本?

答案 1 :(得分:0)

您是否正确配置了tomcat服务器以连接以使用javamail?

我认为你需要在context.xml中设置一个Resource,在web.xml中设置一个resource-ref。

查看此帖子了解步骤:

http://haveacafe.wordpress.com/2008/09/26/113/

答案 2 :(得分:0)

这个问题很简单,不知怎的,我们从未想过,因为Perl脚本正在发送空的AUTH参数

my $auth    = q{};
my $authid  = q{};
my $authpwd = q{};

SMTP可能不需要任何身份验证来发送电子邮件。

在Java程序中,我们将用户名和密码设置为BLANK,因此Java程序失败了。当我们禁用身份验证时,通过将mail.smtp.auth设置为false,它运行正常。

我不确定这种做法在从内部SMTP服务器发送电子邮件时不使用身份验证有多好/坏。

感谢您的帮助。

此致

Shardul。