|
Description:
Frequently the mail functions of php are inaccessible due to no access to a sendmail or equivalent binary and/or non-configuration in php.ini on a given server. This code (function) allows sending mail in most all cases, the only requirement is the ability to open a socket in php!;)
Source: Text Source
<?php
function tinySendMail($sender,$receiver,$subject,$message
,$rcvsmtp=0,$rcvport=25,$sndhost=0,$verbose=0)
{
$textLineLimit=990;
if(!$sndhost)$sndhost=php_uname('n');
if(!$rcvsmtp)$rcvsmtp="mail.".substr(strstr($receiver,"@"),1);
$mailState_open=0;
$mailState_ehlo=1;
$mailState_rcpt=2;
$mailState_data=3;
$mailState_send=4;
$mailState_quit=5;
$mailState_return=6;
$curMailState=$mailState_open;
if(!($fp=fsockopen($rcvsmtp,$rcvport,$errno,&$errstr)))
{
infoPrint($verbose,"Could not open a socket to $rcvsmtp on port $rcvport<br>");
infoPrint($verbose,"Error#: $errno: $errstr<br>");
return(0);
}
infoPrint($verbose,"Opened connection to $rcvsmtp:$rcvport<br>");
$returncode=1;
while($curMailState != $mailState_return)
{
$ret=fgets($fp);
$cod=substr($ret,0,3);
if($curMailState == $mailState_ehlo)
{
if($cod == 250)
{
$ret=fgets($fp);
$contChar=substr($ret,3,1);
infoPrint($verbose,"ret: $ret<br>");
while($contChar == "-")
{
infoPrint($verbose,"ret: $ret<br>");
$ret=fgets($fp);
$contChar=substr($ret,3,1);
}
}
}
infoPrint($verbose,"ret: $ret<br>cod: $cod<br>");
switch($cod)
{
case 220:
switch($curMailState)
{
case $mailState_open:
$snd="EHLO $sndhost\r\n";
$curMailState=$mailState_ehlo;
break;
default:
$snd="QUIT\r\n";
$returncode=0;
$curMailState=$mailState_return;
}
break;
case 250:
switch($curMailState)
{
case $mailState_ehlo:
$snd="MAIL FROM:<$receiver>\r\n";
$curMailState=$mailState_rcpt;
break;
case $mailState_rcpt:
$snd="RCPT TO:<$receiver>\r\n";
$curMailState=$mailState_data;
break;
case $mailState_data:
$snd="DATA\r\n";
$curMailState=$mailState_send;
break;
case $mailState_quit:
$snd="QUIT\r\n";
$curMailState=$mailState_return;
break;
default:
$snd="QUIT\r\n";
$returncode=0;
$curMailState=$mailState_return;
}
break;
case 354:
switch($curMailState)
{
case $mailState_send;
$snd="From: $sender\n";
$snd.="To: $receiver\n";
$snd.="Subject: $subject\n";
$snd.="Date: ".date('r')."\n";
$snd.="Message-ID: <".
date('YmdHis').":".
php_uname('n').":".
getmypid().
":$sender>\n\n";
$snd.=wordwrap($message,$textLineLimit,"\n",1);
$sndArray=explode("\n",$snd);
$numLines=count($sndArray);
for($i=0; $i < $numLines; $i++)
{
fputs($fp,$sndArray[$i]."\r\n");
}
$snd="\r\n.\r\n";
$curMailState=$mailState_quit;
break;
default:
$snd="QUIT\r\n";
$returncode=0;
$curMailState=$mailState_return;
}
break;
default:
$snd="QUIT\r\n";
$returncode=0;
$curMailState=$mailState_return;
}
infoPrint($verbose,"snd: $snd<br>");
fputs($fp,$snd);
}
$ret=fgets($fp);
infoPrint($verbose,"ret: $ret<br>");
fclose($fp);
return($returncode);
}
function infoPrint($verbose,$msg)
{
if($verbose)
{
print($msg);
}
}
?>
Discussion:
|