2
0
forked from Wavyzz/dolibarr

New: SMS sending now works with OVH

This commit is contained in:
Laurent Destailleur
2011-03-06 19:41:19 +00:00
parent 7bd68a7b9a
commit 936f65de1a
6 changed files with 263 additions and 58 deletions

View File

@@ -43,12 +43,14 @@ $substitutionarrayfortest=array(
'__FIRSTNAME__' => 'TESTFirstname' '__FIRSTNAME__' => 'TESTFirstname'
); );
$action=GETPOST('action');
/* /*
* Actions * 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); 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 * Send sms
*/ */
if ($_POST['action'] == 'send' && ! $_POST['cancel']) if ($action == 'send' && ! $_POST['cancel'])
{ {
$error=0; $error=0;
$email_from=''; $smsfrom='';
if (! empty($_POST["fromname"])) $email_from=$_POST["fromname"].' '; if (! empty($_POST["fromsms"])) $smsfrom=GETPOST("fromsms");
if (! empty($_POST["fromsms"])) $email_from.='<'.$_POST["fromsms"].'>'; if (empty($smsfrom)) $smsfrom=GETPOST("fromname");
$sendto = GETPOST("sendto");
$errors_to = $_POST["errorstosms"]; $body = GETPOST('message');
$sendto = $_POST["sendto"]; $deliveryreceipt= GETPOST("deliveryreceipt");
$body = $_POST['message']; $deferred = GETPOST('deferred');
$deliveryreceipt= $_POST["deliveryreceipt"]; $priority = GETPOST('priority');
$class = GETPOST('class');
$errors_to = GETPOST("errorstosms");
// Create form object // Create form object
include_once(DOL_DOCUMENT_ROOT.'/core/class/html.formsms.class.php'); include_once(DOL_DOCUMENT_ROOT.'/core/class/html.formsms.class.php');
$formsms = new FormSms($db); $formsms = new FormSms($db);
if (empty($_POST["fromsms"])) if (empty($body))
{ {
$message='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("SmsFrom")).'</div>'; $message='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Message")).'</div>';
$_GET["action"]='test'; $action='test';
$error++; $error++;
} }
if (empty($sendto)) if (empty($smsfrom) || ! str_replace('+','',$smsfrom))
{
$message='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("SmsFrom")).'</div>';
$action='test';
$error++;
}
if (empty($sendto) || ! str_replace('+','',$sendto))
{ {
$message='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("SmsTo")).'</div>'; $message='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("SmsTo")).'</div>';
$_GET["action"]='test'; $action='test';
$error++; $error++;
} }
if (! $error) if (! $error)
{ {
// Le message est-il en html // Make substitutions into message
$msgishtml=0; // Message is not HTML
// Pratique les substitutions sur le sujet et message
$subject=make_substitutions($subject,$substitutionarrayfortest,$langs);
$body=make_substitutions($body,$substitutionarrayfortest,$langs); $body=make_substitutions($body,$substitutionarrayfortest,$langs);
require_once(DOL_DOCUMENT_ROOT."/lib/CSMSFile.class.php"); 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) if ($result)
{ {
$message='<div class="ok">'.$langs->trans("SmsSuccessfulySent",$email_from,$sendto).'</div>'; $message='<div class="ok">'.$langs->trans("SmsSuccessfulySent",$smsfrom,$sendto).'</div>';
} }
else else
{ {
$message='<div class="error">'.$langs->trans("ResultKo").'<br>'.$smsfile->error.' '.$result.'</div>'; $message='<div class="error">'.$langs->trans("ResultKo").'<br>'.$smsfile->error.' '.$result.'</div>';
} }
$_GET["action"]=''; $action='';
} }
} }
@@ -151,9 +155,10 @@ if ($message) print $message.'<br>';
// List of sending methods // List of sending methods
$listofmethods=$conf->sms_engine; $listofmethods=$conf->sms_engine;
$listofmethods['']='';
asort($listofmethods);
if ($action == 'edit')
if (isset($_GET["action"]) && $_GET["action"] == 'edit')
{ {
$html=new Form($db); $html=new Form($db);
@@ -188,7 +193,7 @@ if (isset($_GET["action"]) && $_GET["action"] == 'edit')
// From // From
$var=!$var; $var=!$var;
print '<tr '.$bc[$var].'><td>'.$langs->trans("MAIN_MAIL_SMS_FROM",ini_get('sendmail_from')?ini_get('sendmail_from'):$langs->transnoentities("Undefined")).'</td>'; print '<tr '.$bc[$var].'><td>'.$langs->trans("MAIN_MAIL_SMS_FROM",$langs->transnoentities("Undefined")).'</td>';
print '<td><input class="flat" name="MAIN_MAIL_SMS_FROM" size="32" value="' . $conf->global->MAIN_MAIL_SMS_FROM; print '<td><input class="flat" name="MAIN_MAIL_SMS_FROM" size="32" value="' . $conf->global->MAIN_MAIL_SMS_FROM;
print '"></td></tr>'; print '"></td></tr>';
@@ -228,15 +233,15 @@ else
$var=!$var; $var=!$var;
print '<tr '.$bc[$var].'><td>'.$langs->trans("MAIN_SMS_SENDMODE").'</td><td>'; print '<tr '.$bc[$var].'><td>'.$langs->trans("MAIN_SMS_SENDMODE").'</td><td>';
$text=$listofmethods[$conf->global->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 $text;
print '</td></tr>'; print '</td></tr>';
// From // From
$var=!$var; $var=!$var;
print '<tr '.$bc[$var].'><td>'.$langs->trans("MAIN_MAIL_SMS_FROM",ini_get('sendmail_from')?ini_get('sendmail_from'):$langs->transnoentities("Undefined")).'</td>'; print '<tr '.$bc[$var].'><td>'.$langs->trans("MAIN_MAIL_SMS_FROM",$langs->transnoentities("Undefined")).'</td>';
print '<td>'.$conf->global->MAIN_MAIL_SMS_FROM; print '<td>'.$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 '</td></tr>'; print '</td></tr>';
// Autocopy to // Autocopy to
@@ -268,8 +273,14 @@ else
print '<a class="butActionRefused" href="#" title="'.$langs->trans("FeatureNotAvailableOnLinux").'">'.$langs->trans("DoTestServerAvailability").'</a>'; print '<a class="butActionRefused" href="#" title="'.$langs->trans("FeatureNotAvailableOnLinux").'">'.$langs->trans("DoTestServerAvailability").'</a>';
}*/ }*/
if (! empty($conf->global->MAIN_SMS_SENDMODE))
{
print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=test&amp;mode=init">'.$langs->trans("DoTestSend").'</a>'; print '<a class="butAction" href="'.$_SERVER["PHP_SELF"].'?action=test&amp;mode=init">'.$langs->trans("DoTestSend").'</a>';
}
else
{
print '<a class="butActionRefused" href="#">'.$langs->trans("DoTestSend").'</a>';
}
print '</div>'; print '</div>';
@@ -297,7 +308,7 @@ else
}*/ }*/
// Affichage formulaire de TEST simple // Affichage formulaire de TEST simple
if ($_GET["action"] == 'test') if ($action == 'test')
{ {
print '<br>'; print '<br>';
print_titre($langs->trans("DoTestSend")); print_titre($langs->trans("DoTestSend"));
@@ -313,10 +324,8 @@ else
$formsms->withfrom=1; $formsms->withfrom=1;
$formsms->witherrorsto=1; $formsms->witherrorsto=1;
$formsms->withto=(isset($_POST['sendto'])?$_POST['sendto']:$user->user_mobile?$user->user_mobile: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->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->withbodyreadonly=0;
$formsms->withcancel=1; $formsms->withcancel=1;
$formsms->withfckeditor=0; $formsms->withfckeditor=0;

View File

@@ -62,8 +62,8 @@ class FormSms
/** /**
* \brief Constructeur * Constructor
* \param DB handler d'acces base de donnee * @param DB handler d'acces base de donnee
*/ */
function FormSms($DB) function FormSms($DB)
{ {
@@ -171,7 +171,6 @@ function limitChars(textarea, limit, infodiv)
{ {
print "<tr><td>".$langs->trans("SmsFrom")."</td><td>"; print "<tr><td>".$langs->trans("SmsFrom")."</td><td>";
//print '<input type="text" name="fromname" size="30" value="'.$this->fromsms.'">'; //print '<input type="text" name="fromname" size="30" value="'.$this->fromsms.'">';
print '<select name="fromsms" id="valid" class="flat">';
if ($conf->global->MAIN_SMS_SENDMODE == 'ovh') if ($conf->global->MAIN_SMS_SENDMODE == 'ovh')
{ {
dol_include_once('/ovh/class/ovhsms.class.php'); dol_include_once('/ovh/class/ovhsms.class.php');
@@ -182,12 +181,18 @@ function limitChars(textarea, limit, infodiv)
{ {
$resultsender[0]->number=$this->fromsms; $resultsender[0]->number=$this->fromsms;
} }
if (sizeof($resultsender) > 0)
{
print '<select name="fromsms" id="valid" class="flat">';
$i=0; $i=0;
while($resultsender[$i]){ while($resultsender[$i])
{
print '<option value="'.$resultsender[$i]->number.'">'.$resultsender[$i]->number.'</option>'; print '<option value="'.$resultsender[$i]->number.'">'.$resultsender[$i]->number.'</option>';
$i++; $i++;
} }
print '</select>'; print '</select>';
}
else print '<span class="error">'.$langs->trans("SmsNoPossibleRecipientFound").'</span>';
print '</td>'; print '</td>';
print "</tr>\n"; print "</tr>\n";
} }
@@ -207,7 +212,7 @@ function limitChars(textarea, limit, infodiv)
} }
else else
{ {
print "<input size=\"16\" name=\"sendto\" value=\"".(! is_array($this->withto) && ! is_numeric($this->withto)? (isset($_REQUEST["sendto"])?$_REQUEST["sendto"]:$this->withto):"+")."\">"; print "<input size=\"16\" name=\"sendto\" value=\"".(! is_array($this->withto) && $this->withto != '1'? (isset($_REQUEST["sendto"])?$_REQUEST["sendto"]:$this->withto):"+")."\">";
if ($this->withtosocid > 0) if ($this->withtosocid > 0)
{ {
$liste=array(); $liste=array();
@@ -282,20 +287,20 @@ function limitChars(textarea, limit, infodiv)
<td>'.$langs->trans("DelayBeforeSending").':</td> <td>'.$langs->trans("DelayBeforeSending").':</td>
<td> <input name="deferred" id="deferred" size="4" value="0"></td></tr> <td> <input name="deferred" id="deferred" size="4" value="0"></td></tr>
<tr><td>'.$langs->trans("Priority").' :</td><td>
<select name="priority" id="valid" class="flat">
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3" selected="selected">3</option>
</select></td></tr>
<tr><td>'.$langs->trans("Type").' :</td><td> <tr><td>'.$langs->trans("Type").' :</td><td>
<select name="class" id="valid" class="flat"> <select name="class" id="valid" class="flat">
<option value="0">Flash</option> <option value="0">Flash</option>
<option value="1" selected="selected">Standard</option> <option value="1" selected="selected">Standard</option>
<option value="2">SIM</option> <option value="2">SIM</option>
<option value="3">ToolKit</option> <option value="3">ToolKit</option>
</select></td></tr>
<tr><td>'.$langs->trans("Priority").' :</td><td>
<select name="class" id="valid" class="flat">
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3" selected="selected">3</option>
</select></td></tr>'; </select></td></tr>';
print '<tr><td align="center" colspan="2"><center>'; print '<tr><td align="center" colspan="2"><center>';

View File

@@ -233,7 +233,7 @@ MAIN_MAIL_SMTPS_PW=SMTP Password if authentication required
MAIN_MAIL_EMAIL_TLS= Use TLS (SSL) encrypt MAIN_MAIL_EMAIL_TLS= Use TLS (SSL) encrypt
MAIN_DISABLE_ALL_SMS=Disable all SMS sendings (for test purposes or demos) MAIN_DISABLE_ALL_SMS=Disable all SMS sendings (for test purposes or demos)
MAIN_SMS_SENDMODE=Method to use to send SMS 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. 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 <b>langs/%s</b> and submit modified files on www.dolibarr.org forum. SubmitTranslation=If translation for this language is not complete or you find errors, you can correct this by editing files into directory <b>langs/%s</b> and submit modified files on www.dolibarr.org forum.
ModuleSetup=Module setup ModuleSetup=Module setup

View File

@@ -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_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_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_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. 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 <b>langs/%s</b> et soumettre les modifications sur le forum www.dolibarr.fr. 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 <b>langs/%s</b> et soumettre les modifications sur le forum www.dolibarr.fr.
ModuleSetup= Configuration du module ModuleSetup= Configuration du module

View File

@@ -50,4 +50,5 @@ SendSms=Envoyer SMS
SmsInfoCharRemain=Nb de caractères restant SmsInfoCharRemain=Nb de caractères restant
SmsInfoNumero= (format international ex : +33899701761) SmsInfoNumero= (format international ex : +33899701761)
DelayBeforeSending=Délai avant envoi (en minutes) DelayBeforeSending=Délai avant envoi (en minutes)
SmsNoPossibleRecipientFound=Aucun destinataire disponible. Vérifier la configuration de votre fournisseur de SMS.

190
htdocs/lib/CSMSFile.class.php Executable file
View File

@@ -0,0 +1,190 @@
<?php
/* Copyright (C) 2000-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2003 Jean-Louis Bergamo <jlb@j1b.org>
* Copyright (C) 2004-2011 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2005-2009 Regis Houssin <regis@dolibarr.fr>
*
* 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<br>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));
}
}
}
?>