Fix: Sending mail with SMTPS was not working.

This commit is contained in:
Laurent Destailleur 2009-11-01 14:16:30 +00:00
parent dd3aaa3062
commit bf0e21e37b
5 changed files with 99 additions and 53 deletions

View File

@ -52,8 +52,9 @@ if (isset($_POST["action"]) && $_POST["action"] == 'update')
dolibarr_set_const($db, "MAIN_MAIL_SENDMODE", $_POST["MAIN_MAIL_SENDMODE"],'chaine',0,'',0);
dolibarr_set_const($db, "MAIN_MAIL_SMTP_PORT", $_POST["MAIN_MAIL_SMTP_PORT"],'chaine',0,'',0);
dolibarr_set_const($db, "MAIN_MAIL_SMTP_SERVER", $_POST["MAIN_MAIL_SMTP_SERVER"],'chaine',0,'',0);
if (isset($_POST["MAIN_MAIL_SMTPS_ID"])) dolibarr_set_const($db, "MAIN_MAIL_SMTPS_ID", $_POST["MAIN_MAIL_SMTPS_ID"],'chaine',0,'',0);
if (isset($_POST["MAIN_MAIL_SMTPS_PW"])) dolibarr_set_const($db, "MAIN_MAIL_SMTPS_PW", $_POST["MAIN_MAIL_SMTPS_PW"],'chaine',0,'',0);
if (isset($_POST["MAIN_MAIL_SMTPS_ID"])) dolibarr_set_const($db, "MAIN_MAIL_SMTPS_ID", $_POST["MAIN_MAIL_SMTPS_ID"],'chaine',0,'',0);
if (isset($_POST["MAIN_MAIL_SMTPS_PW"])) dolibarr_set_const($db, "MAIN_MAIL_SMTPS_PW", $_POST["MAIN_MAIL_SMTPS_PW"],'chaine',0,'',0);
if (isset($_POST["MAIN_MAIL_EMAIL_TLS"])) dolibarr_set_const($db, "MAIN_MAIL_EMAIL_TLS", $_POST["MAIN_MAIL_EMAIL_TLS"],'chaine',0,'',0);
dolibarr_set_const($db, "MAIN_MAIL_EMAIL_FROM", $_POST["MAIN_MAIL_EMAIL_FROM"],'chaine',0,'',$conf->entity);
Header("Location: ".$_SERVER["PHP_SELF"]."?mainmenu=home&leftmenu=setup");
@ -190,7 +191,8 @@ if (! $server) $server='127.0.0.1';
* View
*/
llxHeader();
$wikihelp='EN:First_setup|FR:Premiers_paramétrages|ES:Primeras_configuraciones';
llxHeader($langs->trans("Setup"),'',$wikihelp);
print_fiche_titre($langs->trans("EMailsSetup"),'','setup');
@ -199,6 +201,12 @@ print "<br>\n";
if ($message) print $message.'<br>';
// List of sending methods
$listofmethods=array();
$listofmethods['mail']='PHP mail function';
$listofmethods['simplemail']='Simplemail class';
$listofmethods['smtps']='SMTP/SMTPS socket library';
if (isset($_GET["action"]) && $_GET["action"] == 'edit')
{
@ -223,10 +231,7 @@ if (isset($_GET["action"]) && $_GET["action"] == 'edit')
// Method
$var=!$var;
print '<tr '.$bc[$var].'><td>'.$langs->trans("MAIN_MAIL_SENDMODE").'</td><td>';
$listofmethods=array();
$listofmethods['mail']='PHP mail function';
$listofmethods['simplemail']='Simplemail class';
$listofmethods['smtps']='SMTP/SMTP-AUTH socket library';
// SuperAdministrator access only
if ((empty($conf->global->MAIN_MODULE_MULTICOMPANY)) || ($user->admin && !$user->entity))
{
@ -234,10 +239,8 @@ if (isset($_GET["action"]) && $_GET["action"] == 'edit')
}
else
{
if ($conf->global->MAIN_MAIL_SENDMODE == 'mail') $text = 'PHP mail function';
elseif ($conf->global->MAIN_MAIL_SENDMODE == 'simplemail') $text = 'Simplemail class';
elseif ($conf->global->MAIN_MAIL_SENDMODE == 'smtps') $text = 'SMTPS library';
else { $text = $langs->trans("Undefined"); }
$text = $listofmethods[$conf->global->MAIN_MAIL_SENDMODE];
if (empty($text)) $text = $langs->trans("Undefined");
$htmltext = $langs->trans("ContactSuperAdminForChange");
print $html->textwithpicto($text,$htmltext,1,'superadmin');
print '<input type="hidden" name="MAIN_MAIL_SENDMODE" value="'.$conf->global->MAIN_MAIL_SENDMODE.'">';
@ -343,8 +346,15 @@ if (isset($_GET["action"]) && $_GET["action"] == 'edit')
// TLS
$var=!$var;
print '<tr '.$bc[$var].'><td>'.$langs->trans("MAIN_MAIL_EMAIL_TLS").'</td><td>';
//print '<input class="flat" name="MAIN_MAIL_EMAIL_TLS" size="32" value="'.$conf->global->MAIN_MAIL_EMAIL_TLS.'">';
print $langs->trans("NotSupported");
if ($conf->global->MAIN_MAIL_SENDMODE == 'smtps')
{
if (function_exists('openssl_open'))
{
print $html->selectyesno('MAIN_MAIL_EMAIL_TLS',$conf->global->MAIN_MAIL_EMAIL_TLS,1);
}
else print yn(0).' ('.$langs->trans("YourPHPDoesNotHaveSSLSupport").')';
}
else print yn(0).' ('.$langs->trans("NotSupported").')';
print '</td></tr>';
// From
@ -374,10 +384,9 @@ else
// Method
$var=!$var;
print '<tr '.$bc[$var].'><td>'.$langs->trans("MAIN_MAIL_SENDMODE").'</td><td>';
if ($conf->global->MAIN_MAIL_SENDMODE == 'mail') print 'PHP mail function';
elseif ($conf->global->MAIN_MAIL_SENDMODE == 'simplemail') print 'Simplemail class';
elseif ($conf->global->MAIN_MAIL_SENDMODE == 'smtps') print 'SMTPS library';
else { print $langs->trans("Undefined"); }
$text=$listofmethods[$conf->global->MAIN_MAIL_SENDMODE];
if (empty($text)) $text=$langs->trans("Undefined");
print $text;
print '</td></tr>';
// Server
@ -419,8 +428,15 @@ else
// TLS
$var=!$var;
print '<tr '.$bc[$var].'><td>'.$langs->trans("MAIN_MAIL_EMAIL_TLS").'</td><td>';
//print '<input class="flat" name="MAIN_MAIL_EMAIL_TLS" size="32" value="'.$conf->global->MAIN_MAIL_EMAIL_TLS.'">';
print $langs->trans("NotSupported");
if ($conf->global->MAIN_MAIL_SENDMODE == 'smtps')
{
if (function_exists('openssl_open'))
{
print yn($conf->global->MAIN_MAIL_EMAIL_TLS);
}
else print yn(0).' ('.$langs->trans("YourPHPDoesNotHaveSSLSupport").')';
}
else print yn(0).' ('.$langs->trans("NotSupported").')';
print '</td></tr>';
// From
@ -458,13 +474,15 @@ else
print '</div>';
// Affichage formulaire de TEST
// Run the test to connect
if ($_GET["action"] == 'testconnect')
{
print '<br>';
print_titre($langs->trans("DoTestServerAvailability"));
// Cree l'objet formulaire mail
// If we use SSL/TLS
if (! empty($conf->global->MAIN_MAIL_EMAIL_TLS)) $server='ssl://'.$server;
include_once(DOL_DOCUMENT_ROOT."/lib/CMailFile.class.php");
$mail = new CMailFile('','','','');
$result=$mail->check_server_port($server,$port);

View File

@ -624,9 +624,12 @@ class SMTPs
// We have to make sure the HOST given is valid
// This is done here because '@fsockopen' will not give me this
// information if it failes to connect because it can't find the HOST
if ( (gethostbyname ( $this->getHost() )) == $this->getHost() )
$host=$this->getHost();
$host=preg_replace('@tcp://@i','',$host); // Remove prefix
$host=preg_replace('@ssl://@i','',$host); // Remove prefix
if ( (gethostbyname ( $host )) == $host )
{
$this->_setErr ( 99, $this->getHost() . ' is either offline or is an invalid host name.' );
$this->_setErr ( 99, $host . ' is either offline or is an invalid host name.' );
$_retVal = false;
}
else
@ -642,8 +645,7 @@ class SMTPs
// Sometimes the SMTP server takes a little longer to respond
// so we will give it a longer timeout for the first read
// Windows still does not have support for this timeout function
if( function_exists('socket_set_timeout') )
socket_set_timeout($this->socket, $this->_smtpTimeout, 0);
if (function_exists('stream_set_timeout')) stream_set_timeout($this->socket, $this->_smtpTimeout, 0);
// Check response from Server
if ( $_retVal = $this->server_parse($this->socket, "220") )
@ -684,7 +686,10 @@ class SMTPs
// Send the RFC2554 specified EHLO.
// This improvment as provided by 'SirSir' to
// accomodate both SMTP AND ESMTP capable servers
if ( $_retVal = $this->socket_send_str('EHLO ' . $this->getHost(), '250') )
$host=$this->getHost();
$host=preg_replace('@tcp://@i','',$host); // Remove prefix
$host=preg_replace('@ssl://@i','',$host); // Remove prefix
if ( $_retVal = $this->socket_send_str('EHLO ' . $host, '250') )
{
// Send Authentication to Server
// Check for errors along the way
@ -700,7 +705,7 @@ class SMTPs
}
else
{
$this->_setErr ( 126, '"' . $this->getHost() . '" does not support secure connections.' );
$this->_setErr ( 126, '"' . $host . '" does not support authenticated connections.' );
}
return $_retVal;
@ -753,7 +758,10 @@ class SMTPs
else
{
// Send the RFC821 specified HELO.
$_retVal = $this->socket_send_str('HELO ' . $this->getHost(), '250');
$host=$this->getHost();
$host=preg_replace('@tcp://@i','',$host); // Remove prefix
$host=preg_replace('@ssl://@i','',$host); // Remove prefix
$_retVal = $this->socket_send_str('HELO ' . $host, '250');
}
// Well, did we get to the server?
@ -1854,10 +1862,14 @@ class SMTPs
if ( $this->getBCC() )
$_header .= 'Bcc: ' . $this->getBCC() . "\r\n";
$host=$this->getHost();
$host=preg_replace('@tcp://@i','',$host); // Remove prefix
$host=preg_replace('@ssl://@i','',$host); // Remove prefix
//NOTE: Message-ID should probably contain the username of the user who sent the msg
$_header .= 'Subject: ' . $this->getSubject() . "\r\n"
. 'Date: ' . date("r") . "\r\n"
. 'Message-ID: <' . time() . '.SMTPs@' . $this->getHost() . ">\r\n";
. 'Message-ID: <' . time() . '.SMTPs@' . $host . ">\r\n";
// . 'Read-Receipt-To: ' . $this->getFrom( 'org' ) . "\r\n"
// . 'Return-Receipt-To: ' . $this->getFrom( 'org' ) . "\r\n";
@ -1963,7 +1975,7 @@ class SMTPs
$content = 'Content-Type: ' . $_msgData['mimeType'] . '; charset="' . $this->getCharSet() . '"' . "\r\n"
. 'Content-Transfer-Encoding: ' . $this->getTransEncodeType() . "\r\n"
. 'Content-Disposition: inline' . "\r\n"
. 'Content-Description: ' . $this->_msgContent[0] . ' message' . "\r\n";
. 'Content-Description: message' . "\r\n";
if ( $this->getMD5flag() )
$content .= 'Content-MD5: ' . $_msgData['md5'] . "\r\n";
@ -2499,6 +2511,9 @@ class SMTPs
/**
* $Log$
* Revision 1.10 2009/11/01 14:16:30 eldy
* Fix: Sending mail with SMTPS was not working.
*
* Revision 1.9 2009/10/20 13:14:47 hregis
* Fix: function "split" is deprecated since php 5.3.0
*

View File

@ -726,6 +726,7 @@ PreviousDumpFiles=Available database backup dump files
WeekStartOnDay=First day of week
RunningUpdateProcessMayBeRequired=Running the upgrade process seems to be required (Programs version %s differs from database version %s)
YouMustRunCommandFromCommandLineAfterLoginToUser=You must run this command from command line after login to a shell with user <b>%s</b>.
YourPHPDoesNotHaveSSLSupport=SSL functions not available in your PHP
##### Module password generation
PasswordGenerationStandard=Return a password generated according to internal Dolibarr algorithm: 8 characters containing shared numbers and characters in lowercase.

View File

@ -726,6 +726,7 @@ PreviousDumpFiles=Fichiers disponibles de sauvegarde de la base de donnée
WeekStartOnDay=Premier jour de la semaine
RunningUpdateProcessMayBeRequired=Le lancement du processus de mise a jour semble requis (La version des programme %s differe de la version de la base %s)
YouMustRunCommandFromCommandLineAfterLoginToUser=Vous devez exécuter la commande sous un shell après vous etres logués avec le compte <b>%s</b>.
YourPHPDoesNotHaveSSLSupport=Fonctions SSL non présentes dans votre PHP
##### Module password generation = undefined
PasswordGenerationStandard = Renvoie un mot de passe généré selon algorithme interne Dolibarr: 8 caractères, chiffres et caractères en minuscules mélangés.

View File

@ -421,12 +421,12 @@ class CMailFile
$dest=$this->getValidAddress($this->addr_to,2);
if (! $dest)
{
$this->error="Failed to send mail to SMTP=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Recipient address '$dest' invalid";
$this->error="Failed to send mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Recipient address '$dest' invalid";
dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERROR);
}
else
{
dol_syslog("CMailFile::sendfile: mail start SMTP=".ini_get('SMTP').", PORT=".ini_get('smtp_port'), LOG_DEBUG);
dol_syslog("CMailFile::sendfile: mail start HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port'), LOG_DEBUG);
$bounce = '';
if ($conf->global->MAIN_MAIL_ALLOW_SENDMAIL_F)
@ -445,7 +445,7 @@ class CMailFile
if (! $res)
{
$this->error="Failed to send mail to SMTP=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Check your server logs and your firewalls setup";
$this->error="Failed to send mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Check your server logs and your firewalls setup";
dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERROR);
}
else
@ -482,7 +482,7 @@ class CMailFile
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);
dol_syslog("CMailFile::sendfile: mail start SMTP=".ini_get('SMTP').", PORT=".ini_get('smtp_port'), LOG_DEBUG);
dol_syslog("CMailFile::sendfile: mail start HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port'), LOG_DEBUG);
$this->message=stripslashes($this->message);
@ -492,7 +492,7 @@ class CMailFile
if (! $res)
{
$this->error="Failed to send mail to SMTP=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Check your server logs and your firewalls setup";
$this->error="Failed to send mail to HOST=".ini_get('SMTP').", PORT=".ini_get('smtp_port')."<br>Check your server logs and your firewalls setup";
dol_syslog("CMailFile::sendfile: mail end error ".$this->error, LOG_ERR);
dol_syslog("CMailFile::sendfile: ".$this->simplemail->error_log, LOG_ERR);
}
@ -522,8 +522,12 @@ class CMailFile
if (empty($conf->global->MAIN_MAIL_SMTP_SERVER)) $conf->global->MAIN_MAIL_SMTP_SERVER=ini_get('SMTP');
if (empty($conf->global->MAIN_MAIL_SMTP_PORT)) $conf->global->MAIN_MAIL_SMTP_PORT=ini_get('smtp_port');
$this->smtps->setHost($conf->global->MAIN_MAIL_SMTP_SERVER);
$this->smtps->setPort($conf->global->MAIN_MAIL_SMTP_PORT); //587 or 25;
// If we use SSL/TLS
$server=$conf->global->MAIN_MAIL_SMTP_SERVER;
if (! empty($conf->global->MAIN_MAIL_EMAIL_TLS)) $server='ssl://'.$server;
$this->smtps->setHost($server);
$this->smtps->setPort($conf->global->MAIN_MAIL_SMTP_PORT); // 25, 465...;
if (! empty($conf->global->MAIN_MAIL_SMTPS_ID)) $this->smtps->setID($conf->global->MAIN_MAIL_SMTPS_ID);
if (! empty($conf->global->MAIN_MAIL_SMTPS_PW)) $this->smtps->setPW($conf->global->MAIN_MAIL_SMTPS_PW);
@ -532,7 +536,7 @@ class CMailFile
$dest=$this->smtps->getFrom('org');
if (! $dest)
{
$this->error="Failed to send mail to SMTP=".$conf->global->MAIN_MAIL_SMTP_SERVER.", PORT=".$conf->global->MAIN_MAIL_SMTP_PORT."<br>Recipient address '$dest' invalid";
$this->error="Failed to send mail to HOST=".$server.", PORT=".$conf->global->MAIN_MAIL_SMTP_PORT."<br>Recipient address '$dest' invalid";
dol_syslog("CMailFile::sendfile: mail end error=".$this->error, LOG_ERR);
}
else
@ -727,11 +731,11 @@ class CMailFile
}
// Make RFC821 Compliant, replace bare linefeeds
$strContent = preg_replace("/(?<!\r)\n/si", "\r\n", $strContent );
$strContent = preg_replace("/(?<!\r)\n/si", "\r\n", $strContent );
$strContent = rtrim(wordwrap($strContent));
$strContent = rtrim(wordwrap($strContent));
$out.=$strContent.$this->eol;
$out.=$strContent.$this->eol;
return $out;
}
@ -787,7 +791,7 @@ class CMailFile
$out.= '</style>';
}
return $out;
return $out;
}
/**
@ -863,28 +867,35 @@ class CMailFile
}
/**
* Try to create a socket connection
*
* @param unknown_type $host. Add ssl:// for SSL/TLS.
* @param unknown_type $port. Example: 25, 465
* @return Socket id if ok, 0 if KO
*/
function check_server_port($host,$port)
{
$_retVal=0;
$timeout=5; // Timeout in seconds
if (function_exists('fsockopen'))
{
dol_syslog("Try socket connection to host=".$host." port=".$port);
//See if we can connect to the SMTP server
if ( $socket = @fsockopen($host, // Host to 'hit', IP or domain
if ( $socket = @fsockopen($host, // Host to test, IP or domain. Add ssl:// for SSL/TLS.
$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
$errno, // actual system level error
$errstr, // and any text that goes with the error
$timeout) ) // 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);
if (function_exists('stream_set_timeout')) stream_set_timeout($socket, $timeout, 0);
dol_syslog("Now we wait for answer 220");
// Check response from Server
if ( $_retVal = $this->server_parse($socket, "220") )
$_retVal = $socket;
if ( $_retVal = $this->server_parse($socket, "220") ) $_retVal = $socket;
}
else
{
@ -896,7 +907,7 @@ class CMailFile
// This function has been modified as provided
// by SirSir to allow multiline responses when
// using SMTP Extensions
// using SMTP Extensions.
//
function server_parse($socket, $response)
{
@ -932,9 +943,9 @@ class CMailFile
}
/**
\brief Recherche la presence d'images dans le message html
\param images_dir Emplacement des images
\return int >0 if OK, <0 if KO
* \brief Recherche la presence d'images dans le message html
* \param images_dir Emplacement des images
* \return int >0 if OK, <0 if KO
*/
function findHtmlImages($images_dir)
{