From 2f6f53b8e3d4ef62b0a83a7a4a1e98d5063e638c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 15 Nov 2008 00:52:42 +0000 Subject: [PATCH] Doxygen --- htdocs/lib/CMailFile.class.php | 586 ++++++++++++++++----------------- 1 file changed, 293 insertions(+), 293 deletions(-) diff --git a/htdocs/lib/CMailFile.class.php b/htdocs/lib/CMailFile.class.php index 2456f02fb0e..250ebfb4167 100644 --- a/htdocs/lib/CMailFile.class.php +++ b/htdocs/lib/CMailFile.class.php @@ -22,70 +22,70 @@ */ /** -* \file htdocs/lib/CMailFile.class.php -* \brief Fichier de la classe permettant d'envoyer des mail avec attachements -* \version $Id$ -* \author Dan Potter. -* \author Eric Seigne -* \author Laurent Destailleur. -*/ + * \file htdocs/lib/CMailFile.class.php + * \brief Fichier de la classe permettant d'envoyer des mail avec attachements + * \version $Id$ + * \author Dan Potter. + * \author Eric Seigne + * \author Laurent Destailleur. + */ /** -* \class CMailFile -* \brief Classe d'envoi de mails et pieces jointes. Encapsule mail() avec d'eventuels attachements. -* \remarks Usage: $mailfile = new CMailFile($subject,$sendto,$replyto,$message,$filepath,$mimetype,$filename,$cc,$ccc,$deliveryreceipt,$msgishtml,$errors_to); -* \remarks $mailfile->sendfile(); -*/ + * \class CMailFile + * \brief Classe d'envoi de mails et pieces jointes. Encapsule mail() avec d'eventuels attachements. + * \remarks Usage: $mailfile = new CMailFile($subject,$sendto,$replyto,$message,$filepath,$mimetype,$filename,$cc,$ccc,$deliveryreceipt,$msgishtml,$errors_to); + * \remarks $mailfile->sendfile(); + */ class CMailFile { - var $subject; - var $addr_from; - var $errors_to; - var $addr_to; - var $addr_cc; - var $addr_bcc; - - var $mime_boundary; - var $deliveryreceipt; - - var $eol; - var $atleastonefile=0; - var $error=''; - + var $subject; + var $addr_from; + var $errors_to; + var $addr_to; + var $addr_cc; + var $addr_bcc; - /** - \brief CMailFile - \param subject sujet - \param to email destinataire (RFC 2822: "Nom prenom [, ...]" ou "email[, ...]" ou "[, ...]") - \param from email emetteur (RFC 2822: "Nom prenom [, ...]" ou "email[, ...]" ou "[, ...]") - \param msg message - \param filename_list tableau de fichiers attaches - \param mimetype_list tableau des types des fichiers attaches - \param mimefilename_list tableau des noms des fichiers attaches - \param addr_cc email cc - \param addr_bcc email bcc - \param deliveryreceipt demande accuse reception - \param msgishtml 1=String IS already html, 0=String IS NOT html, -1=Unknown need autodetection - */ - function CMailFile($subject,$to,$from,$msg, - $filename_list=array(),$mimetype_list=array(),$mimefilename_list=array(), - $addr_cc="",$addr_bcc="",$deliveryreceipt=0,$msgishtml=0,$errors_to='') - { - dolibarr_syslog("CMailFile::CMailfile: from=$from, to=$to, addr_cc=$addr_cc, addr_bcc=$addr_bcc, errors_to=$errors_to"); - dolibarr_syslog("CMailFile::CMailfile: subject=$subject, deliveryreceipt=$deliveryreceipt, msgishtml=$msgishtml"); + var $mime_boundary; + var $deliveryreceipt; - // Define if there is at least one file - foreach ($filename_list as $i => $val) - { - if ($filename_list[$i]) - { - $this->atleastonefile=1; - dolibarr_syslog("CMailFile::CMailfile: filename_list[$i]=".$filename_list[$i].", mimetype_list[$i]=".$mimetype_list[$i]." mimefilename_list[$i]=".$mimefilename_list[$i]); + var $eol; + var $atleastonefile=0; + var $error=''; + + + /** + \brief CMailFile + \param subject sujet + \param to email destinataire (RFC 2822: "Nom prenom [, ...]" ou "email[, ...]" ou "[, ...]") + \param from email emetteur (RFC 2822: "Nom prenom [, ...]" ou "email[, ...]" ou "[, ...]") + \param msg message + \param filename_list tableau de fichiers attaches + \param mimetype_list tableau des types des fichiers attaches + \param mimefilename_list tableau des noms des fichiers attaches + \param addr_cc email cc + \param addr_bcc email bcc + \param deliveryreceipt demande accuse reception + \param msgishtml 1=String IS already html, 0=String IS NOT html, -1=Unknown need autodetection + */ + function CMailFile($subject,$to,$from,$msg, + $filename_list=array(),$mimetype_list=array(),$mimefilename_list=array(), + $addr_cc="",$addr_bcc="",$deliveryreceipt=0,$msgishtml=0,$errors_to='') + { + dolibarr_syslog("CMailFile::CMailfile: from=$from, to=$to, addr_cc=$addr_cc, addr_bcc=$addr_bcc, errors_to=$errors_to"); + dolibarr_syslog("CMailFile::CMailfile: subject=$subject, deliveryreceipt=$deliveryreceipt, msgishtml=$msgishtml"); + + // Define if there is at least one file + foreach ($filename_list as $i => $val) + { + if ($filename_list[$i]) + { + $this->atleastonefile=1; + dolibarr_syslog("CMailFile::CMailfile: filename_list[$i]=".$filename_list[$i].", mimetype_list[$i]=".$mimetype_list[$i]." mimefilename_list[$i]=".$mimefilename_list[$i]); } } // On defini mime_boundary - $this->mime_boundary = md5(uniqid("dolibarr")); + $this->mime_boundary = md5(uniqid("dolibarr")); // On definit fin de ligne $this->eol="\n"; @@ -96,7 +96,7 @@ class CMailFile if ($msgishtml == -1) { $this->msgishtml = 0; - if (dol_textishtml($msg,1)) $this->msgishtml = 1; + if (dol_textishtml($msg,1)) $this->msgishtml = 1; } else { @@ -107,74 +107,74 @@ class CMailFile $mime_headers = ""; $text_body = ""; $text_encoded = ""; - - // En-tete dans $smtp_headers - $this->subject = $subject; - $this->addr_from = $from; + + // En-tete dans $smtp_headers + $this->subject = $subject; + $this->addr_from = $from; $this->errors_to = $errors_to; - $this->addr_to = $to; - $this->addr_cc = $addr_cc; - $this->addr_bcc = $addr_bcc; - $this->deliveryreceipt = $deliveryreceipt; - $smtp_headers = $this->write_smtpheaders(); + $this->addr_to = $to; + $this->addr_cc = $addr_cc; + $this->addr_bcc = $addr_bcc; + $this->deliveryreceipt = $deliveryreceipt; + $smtp_headers = $this->write_smtpheaders(); // En-tete suite dans $mime_headers - if ($this->atleastonefile) - { - $mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list); + if ($this->atleastonefile) + { + $mime_headers = $this->write_mimeheaders($filename_list, $mimefilename_list); } // Corps message dans $text_body - $text_body = $this->write_body($msg, $filename_list); - - // Corps message suite (fichiers attaches) dans $text_encoded - if ($this->atleastonefile) - { - $text_encoded = $this->write_files($filename_list,$mimetype_list,$mimefilename_list); - } + $text_body = $this->write_body($msg, $filename_list); + + // Corps message suite (fichiers attaches) dans $text_encoded + if ($this->atleastonefile) + { + $text_encoded = $this->write_files($filename_list,$mimetype_list,$mimefilename_list); + } // On defini $this->headers et $this->message - $this->headers = $smtp_headers . $mime_headers; - $this->message = $text_body . $text_encoded; + $this->headers = $smtp_headers . $mime_headers; + $this->message = $text_body . $text_encoded; - // On nettoie le header pour qu'il ne se termine pas par un retour chariot. - // Ceci evite aussi les lignes vides en fin qui peuvent etre interpretees + // On nettoie le header pour qu'il ne se termine pas par un retour chariot. + // Ceci evite aussi les lignes vides en fin qui peuvent etre interpretees // comme des injections mail par les serveurs de messagerie. $this->headers = eregi_replace("[\r\n]+$","",$this->headers); - } + } - /** - \brief Permet d'encoder un fichier - \param sourcefile - \return <0 si erreur, fichier encode si ok - */ - function _encode_file($sourcefile) - { - if (is_readable($sourcefile)) - { - $fd = fopen($sourcefile, "r"); - $contents = fread($fd, filesize($sourcefile)); - $encoded = chunk_split(base64_encode($contents), 68, $this->eol); - fclose($fd); - return $encoded; - } - else - { - $this->error="Error: Can't read file '$sourcefile'"; - dolibarr_syslog("CMailFile::encode_file: ".$this->error); - return -1; - } - } + /** + \brief Permet d'encoder un fichier + \param sourcefile + \return <0 si erreur, fichier encode si ok + */ + function _encode_file($sourcefile) + { + if (is_readable($sourcefile)) + { + $fd = fopen($sourcefile, "r"); + $contents = fread($fd, filesize($sourcefile)); + $encoded = chunk_split(base64_encode($contents), 68, $this->eol); + fclose($fd); + return $encoded; + } + else + { + $this->error="Error: Can't read file '$sourcefile'"; + dolibarr_syslog("CMailFile::encode_file: ".$this->error); + return -1; + } + } - /** - \brief Envoi le mail - \return boolean true si mail envoye, false sinon - */ + /** + \brief Envoi le mail + \return boolean true si mail envoye, false sinon + */ function sendfile() { global $conf; - + dolibarr_syslog("CMailFile::sendfile addr_to=".$this->addr_to.", subject=".$this->subject); dolibarr_syslog("CMailFile::sendfile header=\n".$this->headers); //dolibarr_syslog("CMailFile::sendfile message=\n".$message); @@ -184,7 +184,7 @@ class CMailFile error_reporting($errorlevel ^ E_WARNING); // Desactive warnings $res=false; - + if (! $conf->global->MAIN_DISABLE_ALL_MAILS) { // Si Windows, addr_from doit obligatoirement etre defini @@ -197,7 +197,7 @@ class CMailFile // Forcage parametres if (! empty($conf->global->MAIN_MAIL_SMTP_SERVER)) ini_set('SMTP',$conf->global->MAIN_MAIL_SMTP_SERVER); if (! empty($conf->global->MAIN_MAIL_SMTP_PORT)) ini_set('smtp_port',$conf->global->MAIN_MAIL_SMTP_PORT); - + $dest=getValidAddress($this->addr_to,2); if (! $dest) { @@ -217,10 +217,10 @@ class CMailFile // La variable definie pose des pb avec certains sendmail securisee (option -f refusee car dangereuse) $bounce = $this->addr_from != '' ? "-f {$this->addr_from}" : ""; } - + $res = mail($dest,$this->subject,stripslashes($this->message),$this->headers, $bounce); - if (! $res) + if (! $res) { $this->error="Failed to send mail to SMTP=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."
Check your server logs and your firewalls setup"; dolibarr_syslog("CMailFile::sendfile: mail end error=".$this->error); @@ -230,7 +230,7 @@ class CMailFile dolibarr_syslog("CMailFile::sendfile: mail end success"); } } - + if (isset($_SERVER["WINDIR"])) { @ini_restore('sendmail_from'); @@ -252,181 +252,181 @@ class CMailFile } - /** - * \brief Ecrit le mail dans un fichier. Utilisation pour le debuggage. - */ - function dump_mail() - { - global $dolibarr_main_data_root; - - if (@is_writeable($dolibarr_main_data_root)) // Avoid fatal error on fopen with open_basedir - { - $fp = fopen($dolibarr_main_data_root."/dolibarr_mail","w"); - fputs($fp, $this->headers); - fputs($fp, $this->eol); // This eol is added by the mail function, so we add it in log - fputs($fp, $this->message); - fclose($fp); - if (! empty($conf->global->MAIN_UMASK)) - @chmod($outputfile, octdec($conf->global->MAIN_UMASK)); - - } - } + /** + * \brief Ecrit le mail dans un fichier. Utilisation pour le debuggage. + */ + function dump_mail() + { + global $dolibarr_main_data_root; + + if (@is_writeable($dolibarr_main_data_root)) // Avoid fatal error on fopen with open_basedir + { + $fp = fopen($dolibarr_main_data_root."/dolibarr_mail","w"); + fputs($fp, $this->headers); + fputs($fp, $this->eol); // This eol is added by the mail function, so we add it in log + fputs($fp, $this->message); + fclose($fp); + if (! empty($conf->global->MAIN_UMASK)) + @chmod($outputfile, octdec($conf->global->MAIN_UMASK)); + + } + } - /** - \brief Creation des headers smtp - */ - function write_smtpheaders() - { + /** + \brief Creation des headers smtp + */ + function write_smtpheaders() + { global $conf; $out = ""; // Sender - //$out .= "X-Sender: ".getValidAddress($this->addr_from,2).$this->eol; + //$out .= "X-Sender: ".getValidAddress($this->addr_from,2).$this->eol; $out .= "From: ".getValidAddress($this->addr_from,0).$this->eol; - $out .= "Return-Path: ".getValidAddress($this->addr_from,0).$this->eol; - if (isset($this->reply_to) && $this->reply_to) $out .= "Reply-To: ".getValidAddress($this->reply_to,2).$this->eol; - if (isset($this->errors_to) && $this->errors_to) $out .= "Errors-To: ".getValidAddress($this->errors_to,2).$this->eol; + $out .= "Return-Path: ".getValidAddress($this->addr_from,0).$this->eol; + if (isset($this->reply_to) && $this->reply_to) $out .= "Reply-To: ".getValidAddress($this->reply_to,2).$this->eol; + if (isset($this->errors_to) && $this->errors_to) $out .= "Errors-To: ".getValidAddress($this->errors_to,2).$this->eol; // Receiver - if (isset($this->addr_cc) && $this->addr_cc) $out .= "Cc: ".getValidAddress($this->addr_cc,2).$this->eol; - if (isset($this->addr_bcc) && $this->addr_bcc) $out .= "Bcc: ".getValidAddress($this->addr_bcc,2).$this->eol; + if (isset($this->addr_cc) && $this->addr_cc) $out .= "Cc: ".getValidAddress($this->addr_cc,2).$this->eol; + if (isset($this->addr_bcc) && $this->addr_bcc) $out .= "Bcc: ".getValidAddress($this->addr_bcc,2).$this->eol; - // Accuse reception - if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out .= "Disposition-Notification-To: ".getValidAddress($this->addr_from,2).$this->eol; + // Accuse reception + if (isset($this->deliveryreceipt) && $this->deliveryreceipt == 1) $out .= "Disposition-Notification-To: ".getValidAddress($this->addr_from,2).$this->eol; - //$out .= "X-Priority: 3".$this->eol; - $out .= "X-Mailer: Dolibarr version " . DOL_VERSION .$this->eol; - $out .= "MIME-Version: 1.0".$this->eol; - - if ($this->msgishtml) - { - if (! $this->atleastonefile) $out.= "Content-Type: text/html; charset=".$conf->character_set_client.$this->eol; - $out.= "Content-Transfer-Encoding: 8bit".$this->eol; - } - else - { - if (! $this->atleastonefile) $out.= "Content-Type: text/plain; charset=".$conf->character_set_client.$this->eol; - $out.= "Content-Transfer-Encoding: 8bit".$this->eol; + //$out .= "X-Priority: 3".$this->eol; + $out .= "X-Mailer: Dolibarr version " . DOL_VERSION .$this->eol; + $out .= "MIME-Version: 1.0".$this->eol; + + if ($this->msgishtml) + { + if (! $this->atleastonefile) $out.= "Content-Type: text/html; charset=".$conf->character_set_client.$this->eol; + $out.= "Content-Transfer-Encoding: 8bit".$this->eol; + } + else + { + if (! $this->atleastonefile) $out.= "Content-Type: text/plain; charset=".$conf->character_set_client.$this->eol; + $out.= "Content-Transfer-Encoding: 8bit".$this->eol; } - dolibarr_syslog("CMailFile::write_smtpheaders smtp_header=\n".$out); - return $out; - } + dolibarr_syslog("CMailFile::write_smtpheaders smtp_header=\n".$out); + return $out; + } - /** - \brief Creation header MIME - \param filename_list - \param mimefilename_list - */ - function write_mimeheaders($filename_list, $mimefilename_list) - { + /** + \brief Creation header MIME + \param filename_list + \param mimefilename_list + */ + function write_mimeheaders($filename_list, $mimefilename_list) + { $mimedone=0; - $out = ""; - for ($i = 0; $i < count($filename_list); $i++) - { - if ($filename_list[$i]) - { + $out = ""; + for ($i = 0; $i < count($filename_list); $i++) + { + if ($filename_list[$i]) + { if (! $mimedone) { $out.= "Content-Type: multipart/mixed; boundary=\"".$this->mime_boundary."\"".$this->eol; $mimedone=1; } - if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i]; - $out.= "X-attachments: $filename_list[$i]".$this->eol; - } - } - //$out.= $this->eol; - dolibarr_syslog("CMailFile::write_mimeheaders mime_header=\n".$out); - return $out; - } + if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i]; + $out.= "X-attachments: $filename_list[$i]".$this->eol; + } + } + //$out.= $this->eol; + dolibarr_syslog("CMailFile::write_mimeheaders mime_header=\n".$out); + return $out; + } - /** - \brief Permet d'ecrire le corps du message - \param msgtext - \param filename_list - */ - function write_body($msgtext, $filename_list) - { - global $conf; - - $out=''; - - if ($this->atleastonefile) - { - $out.= "--" . $this->mime_boundary . $this->eol; - if ($this->msgishtml) - { - $out.= "Content-Type: text/html; charset=".$conf->character_set_client.$this->eol; - } - else - { - $out.= "Content-Type: text/plain; charset=".$conf->character_set_client.$this->eol; - } - $out.= $this->eol; - } - if ($this->msgishtml) - { + /** + \brief Permet d'ecrire le corps du message + \param msgtext + \param filename_list + */ + function write_body($msgtext, $filename_list) + { + global $conf; + + $out=''; + + if ($this->atleastonefile) + { + $out.= "--" . $this->mime_boundary . $this->eol; + if ($this->msgishtml) + { + $out.= "Content-Type: text/html; charset=".$conf->character_set_client.$this->eol; + } + else + { + $out.= "Content-Type: text/plain; charset=".$conf->character_set_client.$this->eol; + } + $out.= $this->eol; + } + if ($this->msgishtml) + { // Check if html header already in message $htmlalreadyinmsg=0; if (eregi('^[ \t]*eol; - return $out; - } + } + else + { + $out.= $msgtext; + } + $out.= $this->eol; + return $out; + } - /** - \brief Permet d'attacher un fichier - \param filename_list Tableau - \param mimetype_list Tableau - \param mimefilename_list Tableau - \return out Chaine fichiers encodes - */ - function write_files($filename_list,$mimetype_list,$mimefilename_list) - { - $out = ''; - - for ($i = 0; $i < count($filename_list); $i++) - { - if ($filename_list[$i]) - { - dolibarr_syslog("CMailFile::write_files: i=$i"); - $encoded = $this->_encode_file($filename_list[$i]); - if ($encoded >= 0) - { - if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i]; - if (! $mimetype_list[$i]) { $mimetype_list[$i] = "application/octet-stream"; } + /** + \brief Permet d'attacher un fichier + \param filename_list Tableau + \param mimetype_list Tableau + \param mimefilename_list Tableau + \return out Chaine fichiers encodes + */ + function write_files($filename_list,$mimetype_list,$mimefilename_list) + { + $out = ''; - $out = $out . "--" . $this->mime_boundary . $this->eol; - $out.= "Content-Type: " . $mimetype_list[$i] . "; name=\"".$filename_list[$i]."\"".$this->eol; - $out.= "Content-Transfer-Encoding: base64".$this->eol; - $out.= "Content-Disposition: attachment; filename=\"".$filename_list[$i]."\"".$this->eol; - $out.= $this->eol; - $out.= $encoded; - $out.= $this->eol; -// $out.= $this->eol; - } - else - { - return $encoded; - } + for ($i = 0; $i < count($filename_list); $i++) + { + if ($filename_list[$i]) + { + dolibarr_syslog("CMailFile::write_files: i=$i"); + $encoded = $this->_encode_file($filename_list[$i]); + if ($encoded >= 0) + { + if ($mimefilename_list[$i]) $filename_list[$i] = $mimefilename_list[$i]; + if (! $mimetype_list[$i]) { $mimetype_list[$i] = "application/octet-stream"; } + + $out = $out . "--" . $this->mime_boundary . $this->eol; + $out.= "Content-Type: " . $mimetype_list[$i] . "; name=\"".$filename_list[$i]."\"".$this->eol; + $out.= "Content-Transfer-Encoding: base64".$this->eol; + $out.= "Content-Disposition: attachment; filename=\"".$filename_list[$i]."\"".$this->eol; + $out.= $this->eol; + $out.= $encoded; + $out.= $this->eol; + // $out.= $this->eol; + } + else + { + return $encoded; + } } - } + } // Fin de tous les attachements - $out = $out . "--" . $this->mime_boundary . "--" . $this->eol; - return $out; - } - - + $out = $out . "--" . $this->mime_boundary . "--" . $this->eol; + return $out; + } + + function check_server_port($host,$port) { $_retVal=0; @@ -434,19 +434,19 @@ class CMailFile if (function_exists('fsockopen')) { //See if we can connect to the SMTP server - if ( $socket = @fsockopen($host, // Host to 'hit', IP or domain - $port, // which Port number to use - $errno, // actual system level error - $errstr, // and any text that goes with the error - 5) ) // timeout for reading/writing data over the socket - { + if ( $socket = @fsockopen($host, // Host to 'hit', IP or domain + $port, // which Port number to use + $errno, // actual system level error + $errstr, // and any text that goes with the error + 5) ) // timeout for reading/writing data over the socket + { // Windows still does not have support for this timeout function if (function_exists('socket_set_timeout')) - socket_set_timeout($socket, 5, 0); + socket_set_timeout($socket, 5, 0); // Check response from Server if ( $_retVal = $this->server_parse($socket, "220") ) - $_retVal = $socket; + $_retVal = $socket; } else { @@ -462,16 +462,16 @@ class CMailFile // function server_parse($socket, $response) { - /** - * Default return value - * - * Returns constructed SELECT Object string or boolean upon failure - * Default value is set at TRUE - * - * @var mixed $_retVal Indicates if Object was created or not - * @access private - * @static - */ + /** + * Default return value + * + * Returns constructed SELECT Object string or boolean upon failure + * Default value is set at TRUE + * + * @var mixed $_retVal Indicates if Object was created or not + * @access private + * @static + */ $_retVal = true; $server_response = ''; @@ -491,39 +491,39 @@ class CMailFile } return $_retVal; - } + } } /** - \brief Renvoie une adresse acceptee par le serveur SMTP - \param adresses Exemple: 'John Doe ' ou 'john@doe.com' - \param format 0=Auto, 1=emails avec <>, 2=emails sans <> - \return string Renvoi: Si format 1: '' ou 'John Doe ' - Si format 2: 'john@doe.com' -*/ + \brief Renvoie une adresse acceptee par le serveur SMTP + \param adresses Exemple: 'John Doe ' ou 'john@doe.com' + \param format 0=Auto, 1=emails avec <>, 2=emails sans <> + \return string Renvoi: Si format 1: '' ou 'John Doe ' + Si format 2: 'john@doe.com' + */ function getValidAddress($adresses,$format) { global $conf; - + $ret=''; - + $arrayaddress=split(',',$adresses); // Boucle sur chaque composant de l'adresse foreach($arrayaddress as $val) { - if (eregi('^(.*)<(.*)>$',trim($val),$regs)) - { - $name = trim($regs[1]); - $email = trim($regs[2]); - } - else - { - $name = ''; - $email = trim($val); - } - + if (eregi('^(.*)<(.*)>$',trim($val),$regs)) + { + $name = trim($regs[1]); + $email = trim($regs[2]); + } + else + { + $name = ''; + $email = trim($val); + } + if ($email) { $newemail=''; @@ -545,7 +545,7 @@ function getValidAddress($adresses,$format) $ret=($ret ? $ret.',' : '').$newemail; } } - + return $ret; } ?>