|
Class smtp
{
/* Public variables */
Var $ smtp_port;
Var $ time_out;
Var $ host_name;
Var $ log_file;
Var $ relay_host;
Var $ debug;
Var $ auth;
Var $ user;
Var $ pass;
/* Private variables */
Var $ sock;
/* Constractor */
Function smtp ($ relay_host = "", $ smtp_port = 25, $ auth = false, $ user, $ pass)
{
$ This-> debug = false;
$ This-> smtp_port = $ smtp_port;
$ This-> relay_host = $ relay_host;
$ This-> time_out = 30; // is used in fsockopen ()
#
$ This-> auth = $ auth; // auth
$ This-> user = $ user;
$ This-> pass = $ pass;
#
$ This-> host_name = "localhost"; // is used in helo command
$ This-> log_file = "";
$ This-> sock = false;
}
/* Main function */
Function sendmail ($ to, $ from, $ subject = "", $ body = "", $ mailtype, $ cc = "", $ bcc = "", $ additional_headers = "")
{
$ Mail_from = $ this-> get_address ($ this-> strip_comment ($ from ));
$ Body = ereg_replace ("(^ | () (\.)", "\ 1. \ 3", $ body );
$ Header. = "maid: 1.0 ";
If ($ mailtype = "html "){
$ Header. = "content-type: text/html ";
}
$ Header. = "to:". $ ."";
If ($ cc! = ""){
$ Header. = "cc:". $ cc ."";
}
$ Header. = "from: $ from <". $ from. "> ";
$ Header. = "subject:". $ subject ."";
$ Header. = $ additional_headers;
$ Header. = "date:". date ("r ")."";
$ Header. = "x-mailer: by redhat (php/". phpversion ().")";
List ($ msec, $ sec) = explode ("", microtime ());
$ Header. = "message-id: <". date ("ymdhis", $ sec ). ". ". ($ msec * 1000000 ). ". ". $ mail_from. "> ";
$ To = explode (",", $ this-> strip_comment ($ ));
If ($ cc! = ""){
$ To = array_merge ($ to, explode (",", $ this-> strip_comment ($ cc )));
}
If ($ bcc! = ""){
$ To = array_merge ($ to, explode (",", $ this-> strip_comment ($ bcc )));
}
$ Sent = true;
Foreach ($ to as $ rcpt_to ){
$ Rcpt_to = $ this-> get_address ($ rcpt_to );
If (! $ This-> smtp_sockopen ($ rcpt_to )){
$ This-> log_write ("error: cannot send email to". $ rcpt_to ."");
$ Sent = false;
Continue;
}
If ($ this-> smtp_send ($ this-> host_name, $ mail_from, $ rcpt_to, $ header, $ body )){
$ This-> log_write ("e-mail has been sent to <". $ rcpt_to. "> ");
} Else {
$ This-> log_write ("error: cannot send email to <". $ rcpt_to. "> ");
$ Sent = false;
}
Fclose ($ this-> sock );
$ This-> log_write ("disconnected from remote host ");
}
Echo "<br> ";
// Echo $ header;
Return $ sent;
}
/* Private functions */
Function smtp_send ($ helo, $ from, $ to, $ header, $ body = "")
{
If (! $ This-> smtp_putcmd ("helo", $ helo )){
Return $ this-> smtp_error ("sending helo command ");
}
# Auth
If ($ this-> auth ){
If (! $ This-> smtp_putcmd ("auth login", base64_encode ($ this-> user ))){
Return $ this-> smtp_error ("sending helo command ");
}
If (! $ This-> smtp_putcmd ("", base64_encode ($ this-> pass ))){
Return $ this-> smtp_error ("sending helo command ");
}
}
#
If (! $ This-> smtp_putcmd ("mail", "from: <". $ from. "> ")){
Return $ this-> smtp_error ("sending mail from command ");
}
If (! $ This-> smtp_putcmd ("rcpt", "to: <". $ to. "> ")){
Return $ this-> smtp_error ("sending rcpt to command ");
}
If (! $ This-> smtp_putcmd ("data ")){
Return $ this-> smtp_error ("sending data command ");
}
If (! $ This-> smtp_message ($ header, $ body )){
Return $ this-> smtp_error ("sending message ");
}
If (! $ This-> smtp_eom ()){
Return $ this-> smtp_error ("sending <cr> <lf>. <cr> <lf> [eom]");
}
If (! $ This-> smtp_putcmd ("quit ")){
Return $ this-> smtp_error ("sending quit command ");
}
Return true;
}
Function smtp_sockopen ($ address)
{
If ($ this-> relay_host = ""){
Return $ this-> smtp_sockopen_mx ($ address );
} Else {
Return $ this-> smtp_sockopen_relay ();
}
}
Function smtp_sockopen_relay ()
{
$ This-> log_write ("trying to". $ this-> relay_host. ":". $ this-> smtp_port ."");
$ This-> sock = @ fsockopen ($ this-> relay_host, $ this-> smtp_port, $ errno, $ errstr, $ this-> time_out );
If (! ($ This-> sock & $ this-> smtp_ OK ())){
$ This-> log_write ("error: cannot connenct to relay host". $ this-> relay_host ."");
$ This-> log_write ("error:". $ errstr. "(". $ errno .")");
Return false;
}
$ This-> log_write ("connected to relay host". $ this-> relay_host ."");
Return true ;;
}
Function smtp_sockopen_mx ($ address)
{
$ Domain = ereg_replace ("^. + @ ([^ @] +) $", "\ 1", $ address );
If (! @ Getmxrr ($ domain, $ mxhosts )){
$ This-> log_write ("error: cannot resolve mx" ". $ domain .""");
Return false;
}
Foreach ($ mxhosts as $ host ){
$ This-> log_write ("trying to". $ host. ":". $ this-> smtp_port ."");
$ This-> sock = @ fsockopen ($ host, $ this-> smtp_port, $ errno, $ errstr, $ this-> time_out );
If (! ($ This-> sock & $ this-> smtp_ OK ())){
$ This-> log_write ("warning: cannot connect to mx host". $ host ."");
$ This-> log_write ("error:". $ errstr. "(". $ errno .")");
Continue;
}
$ This-> log_write ("connected to mx host". $ host ."");
Return true;
}
$ This-> log_write ("error: cannot connect to any mx hosts (". implode (",", $ mxhosts ).")");
Return false;
}
Function smtp_message ($ header, $ body)
{
Fputs ($ this-> sock, $ header. "". $ body );
$ This-> smtp_debug (">". str_replace ("", "". ">", $ header. ">". $ body. "> "));
Return true;
}
Function smtp_eom ()
{
Fputs ($ this-> sock ,".");
$ This-> smtp_debug (". [eom]");
Return $ this-> smtp_ OK ();
}
Function smtp_ OK ()
{
$ Response = str_replace ("", "", fgets ($ this-> sock, 512 ));
$ This-> smtp_debug ($ response ."");
If (! Ereg ("^ [23]", $ response )){
Fputs ($ this-> sock, "quit ");
Fgets ($ this-> sock, 512 );
$ This-> log_write ("error: remote host returned" ". $ response .""");
Return false;
}
Return true;
}
Function smtp_putcmd ($ cmd, $ arg = "")
{
If ($ arg! = ""){
If ($ cmd = "") $ cmd = $ arg;
Else $ cmd = $ cmd. "". $ arg;
}
Fputs ($ this-> sock, $ cmd ."");
$ This-> smtp_debug (">". $ cmd ."");
Return $ this-> smtp_ OK ();
}
Function smtp_error ($ string)
{
$ This-> log_write ("error: error occurred while". $ string .".");
Return false;
}
Function log_write ($ message)
{
$ This-> smtp_debug ($ message );
If ($ this-> log_file = ""){
Return true;
}
$ Message = date ("m d h: I: s"). get_current_user (). "[". getmypid (). "]:". $ message;
If (! @ File_exists ($ this-> log_file) |! ($ Fp = @ fopen ($ this-> log_file, ""))){
$ This-> smtp_debug ("warning: cannot open log file" ". $ this-> log_file .""");
Return false;
}
Flock ($ fp, lock_ex );
Fputs ($ fp, $ message );
Fclose ($ fp );
Return true;
}
Function strip_comment ($ address)
{
$ Comment = "\ ([^ ()] * \)";
While (ereg ($ comment, $ address )){
$ Address = ereg_replace ($ comment, "", $ address );
}
Return $ address;
}
Function get_address ($ address)
{
$ Address = ereg_replace ("([]) +", "", $ address );
$ Address = ereg_replace ("^. * <(. +)>. * $", "\ 1", $ address );
Return $ address;
}
Function smtp_debug ($ message)
{
If ($ this-> debug ){
Echo $ message. "<br> ";
}
}
Function get_attach_type ($ image_tag ){//
$ Filedata = array ();
$ Img_file_con = fopen ($ image_tag, "r ");
Unset ($ image_data );
While ($ tem_buffer = addslashes (fread ($ img_file_con, filesize ($ image_tag ))))
$ Image_data. = $ tem_buffer;
Fclose ($ img_file_con );
$ Filedata ['context'] = $ image_data;
$ Filedata ['filename'] = basename ($ image_tag );
$ Extension = substr ($ image_tag, strrpos ($ image_tag, "."), strlen ($ image_tag)-strrpos ($ image_tag ,"."));
Switch ($ extension ){
Case ". gif ":
$ Filedata ['type'] = "image/gif ";
Break;
Case ". gz ":
$ Filedata ['type'] = "application/x-gzip ";
Break;
Case ". htm ":
$ Filedata ['type'] = "text/html ";
Break;
Case ". html ":
$ Filedata ['type'] = "text/html ";
Break;
Case ". jpg ":
$ Filedata ['type'] = "image/jpeg ";
Break;
Case ". tar ":
$ Filedata ['type'] = "application/x-tar ";
Break;
Case ". txt ":
$ Filedata ['type'] = "text/plain ";
Break;
Case ". zip ":
$ Filedata ['type'] = "application/zip ";
Break;
Default:
$ Filedata ['type'] = "application/octet-stream ";
Break;
}
Return $ filedata;
}
} |