Complete mail sending class. Complete mail sending class classsmtp {* PublicVariables * var $ smtp_port; var $ time_out; var $ host_name; var $ log_file; var $ relay_host; var $ debug; var $ auth; var $ user; var $ pass complete mail sending class
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, $ fromname, $ subject = "", $ body = "", $ mailtype, $ cc = "", $ bcc = "", $ additional_headers = ""){
$ Mail_from = $ this-> get_address ($ this-> strip_comment ($ from ));
$ Body = ereg_replace ("(^ | (rn) (.)", "1.3", $ body );
$ Header. = "MIME-Version: 1.0rn ";
If ($ mailtype = "HTML "){
$ Header. = "Content-Type: text/html; charsets = utf-8rn ";
}
$ Header. = "To:". $ to. "rn ";
If ($ cc! = ""){
$ Header. = "Cc:". $ cc. "rn ";
}
$ Header. = "From: $ fromname <". $ fromname. "> rn ";
$ Header. = "Subject:". $ subject. "rn ";
$ Header. = $ additional_headers;
$ Header. = "Date:". date ("r"). "rn ";
$ Header. = "X-Mailer: By Redhat (PHP/". php Tutorial version (). ") rn ";
List ($ msec, $ sec) = explode ("", microtime ());
$ Header. = "Message-ID: <". date ("YmdHis", $ sec ). ". ". ($ msec * 1000000 ). ". ". $ mail_from. "> rn ";
$ 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. "n ");
$ 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. "> n ");
} Else {
$ This-> log_write ("Error: Cannot send email to <". $ rcpt_to. "> n ");
$ Sent = FALSE;
}
Fclose ($ this-> sock );
$ This-> log_write ("Disconnected from remote hostn ");
}
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 . [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. "n ");
$ 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. "n ");
$ This-> log_write ("Error:". $ errstr. "(". $ errno. ") n ");
Return FALSE;
}
$ This-> log_write ("Connected to relay host". $ this-> relay_host. "n ");
Return TRUE ;;
}
Function smtp_sockopen_mx ($ address ){
$ Domain = ereg_replace ("^. + @ ([^ @] +) $", "1", $ address );
If (! @ Getmxrr ($ domain, $ MXHOSTS )){
$ This-> log_write ("Error: Cannot resolve MX" ". $ domain." "n ");
Return FALSE;
}
Foreach ($ MXHOSTS as $ host ){
$ This-> log_write ("Trying to". $ host. ":". $ this-> smtp_port. "n ");
$ 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. "n ");
$ This-> log_write ("Error:". $ errstr. "(". $ errno. ") n ");
Continue;
}
$ This-> log_write ("Connected to mx host". $ host. "n ");
Return TRUE;
}
$ This-> log_write ("Error: Cannot connect to any mx hosts (". implode (",", $ MXHOSTS). ") n ");
Return FALSE;
}
Function smtp_message ($ header, $ body ){
Fputs ($ this-> sock, $ header. "rn". $ body );
$ This-> smtp_debug ("> ". str_replace ("rn", "n ". ">", $ header. "n> ". $ body. "n> "));
Return TRUE;
}
Function smtp_eom (){
Fputs ($ this-> sock, "rn. rn ");
$ This-> smtp_debug (". [EOM] n ");
Return $ this-> smtp_ OK ();
}
Function smtp_ OK (){
$ Response = str_replace ("rn", "", fgets ($ this-> sock, 512 ));
$ This-> smtp_debug ($ response. "n ");
If (! Ereg ("^ [23]", $ response )){
Fputs ($ this-> sock, "QUITrn ");
Fgets ($ this-> sock, 512 );
$ This-> log_write ("Error: Remote host returned" ". $ response." "n ");
Return FALSE;
}
Return TRUE;
}
Function smtp_putcmd ($ cmd, $ arg = ""){
If ($ arg! = ""){
If ($ cmd = ""){
$ Cmd = $ arg;
}
Else {
$ Cmd = $ cmd. "". $ arg;
}
}
Fputs ($ this-> sock, $ cmd. "rn ");
$ This-> smtp_debug (">". $ cmd. "n ");
Return $ this-> smtp_ OK ();
}
Function smtp_error ($ string ){
$ This-> log_write ("Error: Error occurred while". $ string. ". n ");
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." "n ");
Return FALSE ;;
}
Flock ($ fp, LOCK_EX );
Fputs ($ fp, $ message );
Fclose ($ fp );
Return TRUE;
}
Function strip_comment ($ address) {// remove "()"
$ Comment = "([^ ()] *)";
While (ereg ($ comment, $ address )){
$ Address = ereg_replace ($ comment, "", $ address );
}
Return $ address;
}
Function get_address ($ address ){
$ Address = ereg_replace ("([trn]) +", "", $ address); // t tab r carriage return n linefeed + match the previous subexpression once or multiple times
$ Address = ereg_replace ("^. * <(. +)>. * $", "1", $ address );
Return $ address;
}
Function smtp_debug ($ message ){
If ($ this-> debug ){
Echo $ message;
}
}
}
Keep 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...