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.