Отправка почты работает из Perl, но не из Java - PullRequest
1 голос
/ 23 марта 2012

У меня есть сценарий, в котором я должен отправлять электронную почту, используя наш собственный SMTP-сервер, используя Java. У меня есть приложение, развернутое на 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 и обладаю очень ограниченными знаниями.

Может кто-нибудь помочь, пожалуйста?

The 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 ]

1 голос
/ 23 марта 2012

Вы получаете java.net.ConnectException, поэтому Java VM не может подключиться к почтовому серверу.Это не проблема почты, так как Java не видит почтовый сервер.

Вы говорите:

все работает нормально, используя те же учетные данные и параметры конфигурации, что и в Perl Script.

Работает ли Perl-скрипт в той же системе, что и Java?Если нет, то это похоже на проблему с сетевым подключением между хостом Java и почтовым сервером.

Если скрипт Perl работает в той же системе, дважды проверьте, что скрипт выполняет то, что вы думаете, возможно, используя что-то вроде netstat команда.Если сервер имеет несколько сетевых интерфейсов, проверьте, что виртуальная машина Java не привязана к той, которая не может связаться с почтовым сервером.

Обновление - Ваш сценарий 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.Например, сетевое подключение может быть ограничено идентификатором пользователя.Вы запускаете Perl-скрипт от имени того же пользователя, что и Tomcat?

0 голосов
/ 11 апреля 2012

Проблема была проста, почему-то нам никогда не приходило в голову, что, поскольку скрипт Perl отправляет пустые параметры AUTH

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

возможно, что SMTP не требует никакой аутентификации для отправки электронной почты.

В Программе Java мы задавали имя пользователя и пароль как ПУСТО, и поэтому Программа Java терпела неудачу. Когда мы отключили Аутентификацию, установив для mail.smtp.auth значение false, все работало нормально.

Я не уверен, насколько хорош / плох этот метод не использовать аутентификацию при отправке электронных писем с внутреннего SMTP-сервера.

Спасибо за помощь.

С уважением,

Shardul.

0 голосов
/ 23 марта 2012

Правильно ли настроен ваш сервер Tomcat для подключения к использованию javamail?

Я думаю, вам нужно настроить ресурс в вашем context.xml и ref-ресурс в вашем web.xml.

Проверьте это сообщение для шагов:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...