繁体   English   中英

从Perl发送邮件有效,但不能从Java发送邮件

[英]Sending Mail works from Perl but not from Java

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

  1. 当我们使用GMail SMTP时,发送电子邮件的功能有效。
  2. 当我尝试使用我们自己的服务器时,该功能不起作用。

我收到以下错误

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脚本

在下面粘贴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";
    }
}

您将收到一个java.net.ConnectException因此Java VM无法连接到邮件服务器。 这实际上不是邮件问题,因为Java无法看到邮件服务器。

你说:

使用来自Perl脚本的相同凭据和配置参数,一切都可以正常工作。

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

如果Perl脚本在同一系统上运行,请仔细检查脚本是否按照您的预期进行操作,也许使用netstat命令之类的方法。 如果服务器具有多个网络接口,请检查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规则。 例如,网络连接可能受到用户ID的限制。 您是否以与Tomcat相同的用户身份运行Perl脚本?

这个问题很简单,由于Perl脚本发送空的AUTH参数,所以我们从来没有想到过

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

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

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

我不确定这种做法在从内部SMTP服务器发送电子邮件时不使用身份验证的优缺点。

感谢您的所有帮助。

问候,

Shardul。

您是否已正确配置您的tomcat服务器以使用Javamail进行连接?

我认为您需要在context.xml中设置资源,并在web.xml中设置资源引用。

查看此帖子以获取步骤:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM