diff --git a/htdocs/admin/sms.php b/htdocs/admin/sms.php index 27507e8a53c..dd3459b1b9c 100755 --- a/htdocs/admin/sms.php +++ b/htdocs/admin/sms.php @@ -43,12 +43,14 @@ $substitutionarrayfortest=array( '__FIRSTNAME__' => 'TESTFirstname' ); +$action=GETPOST('action'); + /* * Actions */ -if (isset($_POST["action"]) && $_POST["action"] == 'update' && empty($_POST["cancel"])) +if ($action == 'update' && empty($_POST["cancel"])) { dolibarr_set_const($db, "MAIN_DISABLE_ALL_SMS", $_POST["MAIN_DISABLE_ALL_SMS"],'chaine',0,'',$conf->entity); @@ -65,61 +67,63 @@ if (isset($_POST["action"]) && $_POST["action"] == 'update' && empty($_POST["can /* * Send sms */ -if ($_POST['action'] == 'send' && ! $_POST['cancel']) +if ($action == 'send' && ! $_POST['cancel']) { $error=0; - $email_from=''; - if (! empty($_POST["fromname"])) $email_from=$_POST["fromname"].' '; - if (! empty($_POST["fromsms"])) $email_from.='<'.$_POST["fromsms"].'>'; - - $errors_to = $_POST["errorstosms"]; - $sendto = $_POST["sendto"]; - $body = $_POST['message']; - $deliveryreceipt= $_POST["deliveryreceipt"]; + $smsfrom=''; + if (! empty($_POST["fromsms"])) $smsfrom=GETPOST("fromsms"); + if (empty($smsfrom)) $smsfrom=GETPOST("fromname"); + $sendto = GETPOST("sendto"); + $body = GETPOST('message'); + $deliveryreceipt= GETPOST("deliveryreceipt"); + $deferred = GETPOST('deferred'); + $priority = GETPOST('priority'); + $class = GETPOST('class'); + $errors_to = GETPOST("errorstosms"); // Create form object include_once(DOL_DOCUMENT_ROOT.'/core/class/html.formsms.class.php'); $formsms = new FormSms($db); - if (empty($_POST["fromsms"])) + if (empty($body)) + { + $message='
'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Message")).'
'; + $action='test'; + $error++; + } + if (empty($smsfrom) || ! str_replace('+','',$smsfrom)) { $message='
'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("SmsFrom")).'
'; - $_GET["action"]='test'; + $action='test'; $error++; } - if (empty($sendto)) + if (empty($sendto) || ! str_replace('+','',$sendto)) { $message='
'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("SmsTo")).'
'; - $_GET["action"]='test'; + $action='test'; $error++; } if (! $error) { - // Le message est-il en html - $msgishtml=0; // Message is not HTML - - // Pratique les substitutions sur le sujet et message - $subject=make_substitutions($subject,$substitutionarrayfortest,$langs); + // Make substitutions into message $body=make_substitutions($body,$substitutionarrayfortest,$langs); require_once(DOL_DOCUMENT_ROOT."/lib/CSMSFile.class.php"); - $smsfile = new CSMSFile($subject,$sendto,$email_from,$body, - $filepath,$mimetype,$filename, - $sendtocc, $sendtoccc, $deliveryreceipt, $msgishtml,$errors_to); - $result=$smsfile->sendfile(); + $smsfile = new CSMSFile($sendto, $smsfrom, $body, $deliveryreceipt, $deferred, $priority, $class); // This define OvhSms->login, pass, session and account + $result=$smsfile->sendfile(); // This send SMS if ($result) { - $message='
'.$langs->trans("SmsSuccessfulySent",$email_from,$sendto).'
'; + $message='
'.$langs->trans("SmsSuccessfulySent",$smsfrom,$sendto).'
'; } else { $message='
'.$langs->trans("ResultKo").'
'.$smsfile->error.' '.$result.'
'; } - $_GET["action"]=''; + $action=''; } } @@ -151,9 +155,10 @@ if ($message) print $message.'
'; // List of sending methods $listofmethods=$conf->sms_engine; +$listofmethods['']=''; +asort($listofmethods); - -if (isset($_GET["action"]) && $_GET["action"] == 'edit') +if ($action == 'edit') { $html=new Form($db); @@ -188,7 +193,7 @@ if (isset($_GET["action"]) && $_GET["action"] == 'edit') // From $var=!$var; - print ''.$langs->trans("MAIN_MAIL_SMS_FROM",ini_get('sendmail_from')?ini_get('sendmail_from'):$langs->transnoentities("Undefined")).''; + print ''.$langs->trans("MAIN_MAIL_SMS_FROM",$langs->transnoentities("Undefined")).''; print ''; @@ -228,15 +233,15 @@ else $var=!$var; print ''.$langs->trans("MAIN_SMS_SENDMODE").''; $text=$listofmethods[$conf->global->MAIN_SMS_SENDMODE]; - if (empty($text)) $text=$langs->trans("Undefined").img_warning(); + if (empty($text)) $text=$langs->trans("Undefined").' '.img_warning(); print $text; print ''; // From $var=!$var; - print ''.$langs->trans("MAIN_MAIL_SMS_FROM",ini_get('sendmail_from')?ini_get('sendmail_from'):$langs->transnoentities("Undefined")).''; + print ''.$langs->trans("MAIN_MAIL_SMS_FROM",$langs->transnoentities("Undefined")).''; print ''.$conf->global->MAIN_MAIL_SMS_FROM; - if (!empty($conf->global->MAIN_MAIL_SMS_FROM) && ! isValidPhone($conf->global->MAIN_MAIL_SMS_FROM)) print img_warning($langs->trans("ErrorBadPhone")); + if (!empty($conf->global->MAIN_MAIL_SMS_FROM) && ! isValidPhone($conf->global->MAIN_MAIL_SMS_FROM)) print ' '.img_warning($langs->trans("ErrorBadPhone")); print ''; // Autocopy to @@ -268,8 +273,14 @@ else print ''.$langs->trans("DoTestServerAvailability").''; }*/ - print ''.$langs->trans("DoTestSend").''; - + if (! empty($conf->global->MAIN_SMS_SENDMODE)) + { + print ''.$langs->trans("DoTestSend").''; + } + else + { + print ''.$langs->trans("DoTestSend").''; + } print ''; @@ -297,7 +308,7 @@ else }*/ // Affichage formulaire de TEST simple - if ($_GET["action"] == 'test') + if ($action == 'test') { print '
'; print_titre($langs->trans("DoTestSend")); @@ -313,10 +324,8 @@ else $formsms->withfrom=1; $formsms->witherrorsto=1; $formsms->withto=(isset($_POST['sendto'])?$_POST['sendto']:$user->user_mobile?$user->user_mobile:1); - $formsms->withtopic=(isset($_POST['subject'])?$_POST['subject']:$langs->trans("Test")); - $formsms->withtopicreadonly=0; $formsms->withfile=2; - $formsms->withbody=(isset($_POST['message'])?$_POST['message']:$langs->trans("ThisIsATestMessage")); + $formsms->withbody=(isset($_POST['message'])?(empty($_POST['message'])?1:$_POST['message']):$langs->trans("ThisIsATestMessage")); $formsms->withbodyreadonly=0; $formsms->withcancel=1; $formsms->withfckeditor=0; diff --git a/htdocs/core/class/html.formsms.class.php b/htdocs/core/class/html.formsms.class.php index 5258f7a7214..c3bf1ebac5a 100755 --- a/htdocs/core/class/html.formsms.class.php +++ b/htdocs/core/class/html.formsms.class.php @@ -62,8 +62,8 @@ class FormSms /** - * \brief Constructeur - * \param DB handler d'acces base de donnee + * Constructor + * @param DB handler d'acces base de donnee */ function FormSms($DB) { @@ -171,8 +171,7 @@ function limitChars(textarea, limit, infodiv) { print "".$langs->trans("SmsFrom").""; //print ''; - print ''; + $i=0; + while($resultsender[$i]) + { + print ''; + $i++; + } + print ''; } - print ''; + else print ''.$langs->trans("SmsNoPossibleRecipientFound").''; print ''; print "\n"; } @@ -207,7 +212,7 @@ function limitChars(textarea, limit, infodiv) } else { - print "withto) && ! is_numeric($this->withto)? (isset($_REQUEST["sendto"])?$_REQUEST["sendto"]:$this->withto):"+")."\">"; + print "withto) && $this->withto != '1'? (isset($_REQUEST["sendto"])?$_REQUEST["sendto"]:$this->withto):"+")."\">"; if ($this->withtosocid > 0) { $liste=array(); @@ -282,20 +287,20 @@ function limitChars(textarea, limit, infodiv) '.$langs->trans("DelayBeforeSending").': - '.$langs->trans("Type").' : + '.$langs->trans("Priority").' : + + + '.$langs->trans("Type").' : - - '.$langs->trans("Priority").' : - '; print '
'; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 45358a32ade..c57d15c2bf2 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -233,7 +233,7 @@ MAIN_MAIL_SMTPS_PW=SMTP Password if authentication required MAIN_MAIL_EMAIL_TLS= Use TLS (SSL) encrypt MAIN_DISABLE_ALL_SMS=Disable all SMS sendings (for test purposes or demos) MAIN_SMS_SENDMODE=Method to use to send SMS -MAIN_MAIL_SMS_FROM=Sender phone number for Sms sending +MAIN_MAIL_SMS_FROM=Default sender phone number for Sms sending FeatureNotAvailableOnLinux=Feature not available on Unix like systems. Test your sendmail program locally. SubmitTranslation=If translation for this language is not complete or you find errors, you can correct this by editing files into directory langs/%s and submit modified files on www.dolibarr.org forum. ModuleSetup=Module setup diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index cd1ba82423f..f29c3690434 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -234,7 +234,7 @@ MAIN_MAIL_SMTPS_PW= SMTP Authentification Password si authentification SMTP requ MAIN_MAIL_EMAIL_TLS= Utilisation du cryptage TLS (SSL) MAIN_DISABLE_ALL_SMS=Désactiver globalement tout envoi de Sms (pour mode test ou démos) MAIN_SMS_SENDMODE=Méthode d'envoi des SMS -MAIN_MAIL_SMS_FROM=Téléphone émetteur pour envoi Sms +MAIN_MAIL_SMS_FROM=Numéro de téléphone par défaut pour envoi Sms FeatureNotAvailableOnLinux= Fonctionnalité non disponible sous systèmes Unix. Tester votre sendmail localement. SubmitTranslation=Si la traduction pour cette langue est incomplète ou si vous trouvez des erreurs, vous pouvez les corriger en éditant les fichiers dans le répertoire langs/%s et soumettre les modifications sur le forum www.dolibarr.fr. ModuleSetup= Configuration du module diff --git a/htdocs/langs/fr_FR/sms.lang b/htdocs/langs/fr_FR/sms.lang index 9097f0268de..0510393aebc 100755 --- a/htdocs/langs/fr_FR/sms.lang +++ b/htdocs/langs/fr_FR/sms.lang @@ -50,4 +50,5 @@ SendSms=Envoyer SMS SmsInfoCharRemain=Nb de caractères restant SmsInfoNumero= (format international ex : +33899701761) DelayBeforeSending=Délai avant envoi (en minutes) +SmsNoPossibleRecipientFound=Aucun destinataire disponible. Vérifier la configuration de votre fournisseur de SMS. diff --git a/htdocs/lib/CSMSFile.class.php b/htdocs/lib/CSMSFile.class.php new file mode 100755 index 00000000000..b7f2735ebd7 --- /dev/null +++ b/htdocs/lib/CSMSFile.class.php @@ -0,0 +1,190 @@ + + * Copyright (C) 2003 Jean-Louis Bergamo + * Copyright (C) 2004-2011 Laurent Destailleur + * Copyright (C) 2005-2009 Regis Houssin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * or see http://www.gnu.org/ + * + * Lots of code inspired from Dan Potter's CSMSFile class + */ + +/** + * \file htdocs/lib/CSMSFile.class.php + * \brief File of class to send sms + * \version $Id$ + * \author Laurent Destailleur. + */ + +/** + * \class CSMSFile + * \brief Class to send SMS + * \remarks Usage: $smsfile = new CSMSFile($subject,$sendto,$replyto,$message,$filepath,$mimetype,$filename,$cc,$ccc,$deliveryreceipt,$msgishtml,$errors_to); + * \remarks $smsfile->sendfile(); + */ +class CSMSFile +{ + var $error=''; + + var $message; + var $addr_from; + var $addr_to; + var $deliveryreceipt; + var $deferred; + var $priority; + var $class; + + + /** + * CSMSFile + * @param to Recipients SMS + * @param from Sender SMS + * @param msg Message + * @param deliveryreceipt Ask a delivery receipt + */ + function CSMSFile($to,$from,$msg,$deliveryreceipt=0,$deferred=0,$priority=3,$class=1) + { + global $conf; + + // On definit fin de ligne + $this->eol="\n"; + if (preg_match('/^win/i',PHP_OS)) $this->eol="\r\n"; + if (preg_match('/^mac/i',PHP_OS)) $this->eol="\r"; + + // If ending method not defined + if (empty($conf->global->MAIN_SMS_SENDMODE)) + { + $this->error='No SMS Engine defined'; + return -1; + } + + dol_syslog("CSMSFile::CSMSFile: MAIN_SMS_SENDMODE=".$conf->global->MAIN_SMS_SENDMODE." charset=".$conf->file->character_set_client." from=$from, to=$to, errors_to=$errors_to", LOG_DEBUG); + dol_syslog("CSMSFile::CSMSFile: deliveryreceipt=".$deliveryreceipt." deferred=".$deferred." priority=".$priority." class=".$class, LOG_DEBUG); + + // Action according to choosed sending method + if ($conf->global->MAIN_SMS_SENDMODE == 'ovh') + { + $this->addr_from=$from; + $this->addr_to=$to; + $this->message=$msg; + $this->deliveryreceipt=$deliveryreceipt; + $this->deferred=$deferred; + $this->priority=$priority; + $this->class=$class; + } + else + { + // Send mail method not correctly defined + // -------------------------------------- + + return 'Bad value for MAIN_SMS_SENDMODE constant'; + } + } + + + /** + * Send mail that was prepared by constructor + * + * @return boolean True if mail sent, false otherwise + */ + function sendfile() + { + global $conf; + + $errorlevel=error_reporting(); + error_reporting($errorlevel ^ E_WARNING); // Desactive warnings + + $res=false; + + dol_syslog("CSMSFile::sendfile addr_to=".$this->addr_to, LOG_DEBUG); + dol_syslog("CSMSFile::sendfile message=\n".$this->message); + + $this->message=stripslashes($this->message); + + if (! empty($conf->global->MAIN_SMS_DEBUG)) $this->dump_sms(); + + if (empty($conf->global->MAIN_DISABLE_ALL_SMS)) + { + // Action according to choosed sending method + if ($conf->global->MAIN_SMS_SENDMODE == 'ovh') + { + dol_include_once('/ovh/class/ovhsms.class.php'); + $ovhsms=new OvhSms($this->db); + //$ovhsms->session=''; + //$ovhsms->account=''; + $ovhsms->expe=$this->addr_from; + $ovhsms->dest=$this->addr_to; + $ovhsms->message=$this->message; + //$ovhsms->validity=''; + $ovhsms->deferred=$this->deferred; + $ovhsms->priority=$this->priority; + $ovhsms->class=$this->class; + + $res=$ovhsms->SmsSend(); + + if (! $res) + { + $this->error="Failed to send SMS
Check your server logs and your firewalls setup"; + dol_syslog("CSMSFile::sendfile: mail end error=".$this->error, LOG_ERROR); + } + else + { + dol_syslog("CSMSFile::sendfile: mail end success", LOG_DEBUG); + } + } + else + { + // Send mail method not correctly defined + // -------------------------------------- + + return 'Bad value for MAIN_SMS_SENDMODE constant'; + } + } + else + { + $this->error='No mail sent. Feature is disabled by option MAIN_DISABLE_ALL_SMS'; + dol_syslog("CSMSFile::sendfile: ".$this->error, LOG_WARNING); + } + + error_reporting($errorlevel); // Reactive niveau erreur origine + + return $res; + } + + + /** + * Write content of a SMTP request into a dump file (mode = all) + * Used for debugging. + */ + function dump_sms() + { + global $conf,$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_sms.log","w"); + + fputs($fp, $this->message); + + fclose($fp); + if (! empty($conf->global->MAIN_UMASK)) + @chmod($outputfile, octdec($conf->global->MAIN_UMASK)); + } + } + +} + +?> \ No newline at end of file