Hello All,

I am a new OpenSRS reseller and just finished customizing the API. I have
tested and everything works great...except SMTP mail. I have followed all the
instructions I could find to get the API functioning on an Win2000 server,
like adding the use Socket;  and edited the mail lines in the .conf file to
use SMTP instead of sendmail.

The problem is, nothing happens. It just skips the sendmail script. I even put
some die commands in...but, still nothing. Here is the code below that I
edited. In the common.pm. I get none of these die commands back. It just
continues on like the send_email command doesn't even exist. I am getting very
frustrated. Thanks for the help.

# generic method to send an email based on a template and a hash ref of
values
sub send_email {
    my ( $template, $href ) = @_;
    my ( $mail_type, $mail_prog );

    $mail_type = $OpenSRS::Util::ConfigJar::MAIL_SETTINGS{MAIL_TYPE};
    $mail_prog = $OpenSRS::Util::ConfigJar::MAIL_SETTINGS{MAILPROG};

    open (FILE, "<$template") or die "Couldn't open $template: $!\n";
    $/ = undef;
    my $message = <FILE>;
    $/ = "\n";
    close FILE;

    $message =~ s/{{(.*?)}}/$href->{$1}/g;

    my $mailto = $href->{mailto};
    my $mailfrom = $href->{mailfrom};

    if ($mail_type eq 'sendmail') {
        open (MAIL, "|$mail_prog") or die "Can't open $mail_prog: $!\n";
        print MAIL $message;
        close MAIL or return undef;
    } else {
        #OpenSRS::Util::Common::_send_smtp_mail(
        _send_smtp_mail(
  $mailto, $mailfrom, $message
 ) or die "Can't start emailer: $!\n";
    }
    return 1;
}

sub _send_smtp_mail {

    my ( $to, $from, $message ) = @_;
    my ( $iaddr, $paddr, $proto, $smtp_server, $smtp_port, $localhost );

    $smtp_server = $OpenSRS::Util::ConfigJar::MAIL_SETTINGS{SMTP_SERVER};
    $smtp_port   = $OpenSRS::Util::ConfigJar::MAIL_SETTINGS{SMTP_PORT};
    $localhost   = $OpenSRS::Util::ConfigJar::MAIL_SETTINGS{LOCALHOST};

    $iaddr = inet_aton( $smtp_server );
    $paddr = sockaddr_in( $smtp_port, $iaddr );
    $proto = getprotobyname( 'tcp' );
    socket( SOCK, PF_INET, SOCK_STREAM, $proto )   or die "Can't open socket:
$!\n";
    connect( SOCK, $paddr )                        or die "Can't connect:
$!\n";
    _receive_from_server( \*SOCK )                 or die "Can't rcv sock:
$!\n";
    _send_to_server( \*SOCK, "HELO $localhost" )   or die "Can't send Helo:
$!\n";
    _receive_from_server( \*SOCK )                 or die "Can't rcv srv:
$!\n";
    _send_to_server( \*SOCK, "MAIL FROM: <$from>") or die "Can't send
Mailfrom: $!\n";
    _receive_from_server( \*SOCK )                 or die "Can't rcv Mailfrom:
$!\n";
    _send_to_server( \*SOCK, "RCPT TO: <$to>" )    or die "Can't send rcpt:
$!\n";
    _receive_from_server( \*SOCK )                 or die "Can't rcv rcpt:
$!\n";
    _send_to_server( \*SOCK, "DATA" )              or die "Can't send Data:
$!\n";
    _receive_from_server( \*SOCK )                 or die "Can't rcv data:
$!\n";
    _send_to_server( \*SOCK, "$message\n." )       or die "Can't send message:
$!\n";
    _receive_from_server( \*SOCK )                 or die "Can't rcv message:
$!\n";
    _send_to_server( \*SOCK, "QUIT" )              or die "Can't send quit:
$!\n";
    _receive_from_server( \*SOCK )                 or die "Can't rcv quit:
$!\n";
    close( SOCK )                                  or die "Can't close sock:
$!\n";
    return 1;
}

sub _send_to_server {
    my( $socket )  = shift;
    my( $message ) = shift;
    send( $socket, "$message\n", 0 ) or die "Error in _send_to_server: $!\n";
    return 1;
}

sub _receive_from_server {
    my( $socket ) = shift;
    my( $reply );
    while( $reply = <$socket> ) {
        return 0 if $reply =~ /^5/;
        last      if $reply =~ /^\d+ /;
    }
    return 1;
}


Understand, I am not a Perl programmer. I learned how by trail and error over
the 2 weeks it took me to customize the API to my likes.

Reply via email to