tybozz
| Membre
Inscrit le : 09/05/2005
|
# Le 28/08/2006 à 18:29
Bonjour,
J'ai de nombreux mails a envoyé et un serveur charge déjà énormément, j'en ai commandé un second mais ...
Y a t'il moyen de moins charger sendmail ?
Là le serveur a déjà un load average de 10 ... Elevez un dragon ! avant qu'il ne fasse le casting pour la star on the net academy ou qu'il ne s'empiffre de bonbons à gogo |
Geo 113
| Geoffrey Modérateur
Inscrit le : 04/05/2005
|
# Le 28/08/2006 à 18:30
envoyer la nuit si c'est pas urgent Cosmix
Rendez imprévisible l'Economie; Mentez aux sondages |
flush
| Jean-Philippe Modérateur
Inscrit le : 09/05/2005
|
# Le 28/08/2006 à 22:31
Un petit nice, mais ca ira forcément moins vite ... @+ Jean-Philippe |
Limit
| Cyril Membre
Inscrit le : 11/05/2005
|
# Le 28/08/2006 à 23:17
tu parles de combien de mails là? Forum Gratuit - Blog gratuit |
superfc
| Florent Membre
Inscrit le : 01/07/2006
|
# Le 29/08/2006 à 00:22
C'est à toi de faire des programmes de façon intelligente.
Tu peux par exemple mettre un cron qui s'execute toutes les 3 minutes un programme qui charge 200 par 200 les mails à envoyer que si la charge est inférieur à 2. (avec un nice 20 bien sur).
Tu sais que l'augmentation de charge est complètement nocive aux performances. Le serveur perd plus de temps à s'organiser pour savoir de quel côté il doit bosser que en travail efffectif. Et quand on attaque la swap comme mémoire de "travail", la notion de performances n'existe plus.
Est-ce que ça vaut vraiment le coup de prendre un autre serveur? Est-ce que tes mails sont urgents? A mon avis, ils peuvent s'envoyer sur 2 jours sans problème... En plus avec la baisse de charge du serveur la nuit, ça va permettre d'en envoyer plus.
Est-ce que ton script d'envoi de mail est vraiment optimisé?
Est-ce que ton serveur de mail est bien suffisament rapide? Exim est plus léger que PostFix, mais pour envoyer beaucoup de mails, il est moins performant. Est-ce que tu n'as pas configuré des options comme la synchronisation des envois (pour éviter la perte des mails mais qui ralentit le système), est-ce que tu as bien rêglé un nombre d'envoi de mails simultannés suffisament important ou peut-être trop important ?
Bref, faut que tu fasses une analyse (un bon moyenne c'est "top") de l'utilisation de tes ressources machines et que tu vois quel maillon de la chaîne d'envoi de mail étrangle ton serveur.
*SINON*
Tu as des solutions comme zmailer, qui sont des logiciels particulièrement faits pour le mass-mailing. C'est à dire qu'ils sont structurés pour que l'envoi soit le plus rapide possible.
*MAIS*
Tout dépend du nombre de mails que tu as à envoyer. Si c'est 10 000 mensuels ou hebdomadaires et non urgent, les envoyer lorsque la charge est basse est une bonne solution.
Si c'est plus, ça va commencer à être vraiment short. Mais à toi de voir pour les optimisations.
*AU FAIT*
N'oublie pas de prévoir un système de nettoyage des emails invalides. Florent Clairambault - http://florent.clairambault.fr
Gtalk : superfc@gmail.com |
radins
| Tobias Modérateur
Inscrit le : 09/05/2005
|
# Le 29/08/2006 à 00:26
[MODE PUB]Perso je te conseille de contacter Bool qui a pas mal d'expérience dans ce domaine.. il peut te "bricoler" un truc qui tient la route je pense :-)[/MODE PUB]
Sinon l'idée d'optimsier ton script est la bonne je pense.. enfin c'est ce que je fais pour ma newsletter. |
tybozz
| Thibaud Membre
Inscrit le : 09/05/2005
|
# Le 29/08/2006 à 09:12
Bon j'ai mis postfix sur le 2eme serveur je vais voir si c'est mieux que sendmail Elevez un dragon ! avant qu'il ne fasse le casting pour la star on the net academy ou qu'il ne s'empiffre de bonbons à gogo |
Zalex14
| Alexandre Modérateur
Inscrit le : 09/05/2005
|
# Le 29/08/2006 à 11:31
superfc a dit :
*AU FAIT*
N'oublie pas de prévoir un système de nettoyage des emails invalides.
Tu peux aussi nettoyer avant d'envoyer.
L'utilisation de classes de ce type : http://phpclasses.comrax.com/browse/package/13.htm...
sont très pratiques et font un premier tri bien utile qui allégera tes envois
Mieux vaut s'attendre au prévisible que d'être surpris par l'inattendu. |
superfc
| Florent Membre
Inscrit le : 01/07/2006
|
# Le 29/08/2006 à 12:07
Oui mais beaucoup de providers utilisent des serveurs intermédiaires qui ne servent qu'à relayer des mails. Donc ça fait énormément de mails qui sont acceptés puis renvoyés après.
Mais c'est clair qu'il vaut mieux le faire aussi. Mais ça pour le coup, ça ralentit pas mal, donc il vaut mieux le faire petit à petit (avant l'envoi de mail).
C'est sur que c'est mieux que sendmail. Les trucs comme sendmail ou qmail devraient plus exister. Florent Clairambault - http://florent.clairambault.fr
Gtalk : superfc@gmail.com |
flush
| Jean-Philippe Modérateur
Inscrit le : 09/05/2005
|
# Le 29/08/2006 à 14:05
Si tu veux faire le ménage dans ta base voilà une petite classe qui permet de faire des tests dans tous les sens sur les emails ou sur les hosts voir si ils sont valides.
/**
* @author Jean-Philippe
* @since 26/08/2006
* @class Email
*/
class Email
{
private $email;
private $host;
private $name;
public function __construct($email=null){
if($email!=null){
$this->email = $email;
list($this->name, $this->host) = explode('@', $this->email);
}
}
public function __toString(){
return $this->email;
}
public function setHost($host){
$this->host = $host;
}
public function isStrValid(){
if( (preg_match('/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/', $this->email)) ||
(preg_match('/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,4})(\]?)$/',$this->email)) )
return true;
return false;
}
public function isHostValid(){
if(checkdnsrr($this->host.'.', 'MX') ) return true;
return false;
}
public function isValid(){
if($this->isStrValid() && $this->isHostValid()) return true;
return false;
}
} @+ Jean-Philippe |
tybozz
| Thibaud Membre
Inscrit le : 09/05/2005
|
# Le 29/08/2006 à 14:49
intéressant merci de vos remarques Elevez un dragon ! avant qu'il ne fasse le casting pour la star on the net academy ou qu'il ne s'empiffre de bonbons à gogo |
superfc
| Florent Membre
Inscrit le : 01/07/2006
|
# Le 29/08/2006 à 14:55
Tu pourrais faire un petit :
isAcceptedByHost
Parce que y'a énormément d'adresses emails qui sont fausses en fait (genre "va-te-faire-mettre@aol.com").
Le test de isHostValid a une seule petite limitation, c'est quand les gens n'ont pas configuré de MX, l'envoi de mail va alors directement sur la machine, et c'est pourtant autorisé, genre m.dupont@recrutement.renault.fr. Pas sur qu'ils mettent toujours les MX dans ces cas là.
Mais bon, ça représente tellement peu de monde, que tu peux l'ignorer... Florent Clairambault - http://florent.clairambault.fr
Gtalk : superfc@gmail.com |
flush
| Jean-Philippe Modérateur
Inscrit le : 09/05/2005
|
# Le 30/08/2006 à 00:04
Tu as une solution pour gérer ce problème là superfc ?
Sinon pour faire une méthode isAcceptedByHost pourquoi pas mais cela me semble un peu difficile ... se basé sur un dictionnaire ?
N'hésitez pas à améliorer ma classe et nous la redistribué ;) @+ Jean-Philippe |
superfc
| Florent Membre
Inscrit le : 01/07/2006
|
# Le 30/08/2006 à 14:23
isAcceptedByHost :
La solution c'est d'ouvrir un socket et de tester les adresses, et au lieu d'envoyer le mail (avec la commande DATA) bah on se tire (QUIT). Tous les mails qui ont été répondus comme "OK", on peut les valider. Tous les mails qui ont été répondus comme "ERR User Doesn't Exists" (par exemple), on peut les supprimer.
Pour rêgler le problème, c'est assez simple. Il faut tester les MX et sinon tester la machine directement.
Donc en gros, il faudrait changer la classe pour qu'elle fasse de traitement :
- Verifier la chaine d'email
- Donner les MX du domaine (et aucun si pas possible)
- Se connecter aux MX (un à un jusqu'à ce que ça marche) et si y'en a pas, au host directement, pour tester les adresses email
L'inconvenient, c'est qu'en ouvrant des sockets, ça ralentit pas mal. Mais si c'est fait progressivement, c'est pas très grave.
L'avantage, c'est qu'on a pas une base de qualité. Et de nos jours, c'est important.
Florent Clairambault - http://florent.clairambault.fr
Gtalk : superfc@gmail.com |
superfc
| Florent Membre
Inscrit le : 01/07/2006
|
# Le 02/09/2006 à 14:07
Pour ceux que ça intéresse, voici une page qui propose la méthode dont je parle au dessus :
http://www.unifr.ch/weboffice/faq/detail.php?pid=0...
Le seul défaut de ce programme, c'est que ça teste seulement le premier MX. Mais bon, les MX sont pas sensé foirer. Et ça ne teste pas le host directement si le MX a foiré.
En le passant en classe, ça devrait permettre de faire le truc. Florent Clairambault - http://florent.clairambault.fr
Gtalk : superfc@gmail.com |
superfc
| Florent Membre
Inscrit le : 01/07/2006
|
# Le 02/09/2006 à 14:32
Bon en fait, je l'ai pas fait en classe mais en deux fonction (chacun sa vision de l'objet, mais la je trouve pas que c'est utile). J'ai changé les code de retour et
<code>
<?
/* =======================================================================
ifsnow's email valid check function SnowCheckMail Ver 0.1
funtion SnowCheckMail ($Email,$Debug=false)
$Email : E-Mail address to check.
$Debug : Variable for debugging.
* Can use everybody if use without changing the name of function.
Reference : O'REILLY - Internet Email Programming
HOMEPAGE : http://www.hellophp.com
ifsnow is korean phper. Is sorry to be unskillful to English. *^^*;;
========================================================================= */
function SnowCheckHost($Email, $ConnectAddress, $Debug=false) {
global $_SERVER;
// fsockopen function reference : http://www.php.net/manual/en/function.fsockopen.ph...
$Connect = fsockopen ( $ConnectAddress, 25 );
// Success in socket connection
if ($Connect) {
if ($Debug) echo "Connection succeeded to {$ConnectAddress} SMTP.<br>";
// Judgment is that service is preparing though begin by 220 getting string after connection .
// fgets function reference : http://www.php.net/manual/en/function.fgets.php
if ( ereg ( "^220", $Out = fgets ( $Connect, 1024 ) ) ) {
// Inform client's reaching to server who connect.
fputs ( $Connect, "HELO ".$_SERVER['HTTP_HOST']."\r\n" );
if ($Debug) echo "Run : HELO ".$_SERVER['HTTP_HOST']."<br />";
$Out = fgets ( $Connect, 1024 ); // Receive server's answering cord.
// Inform sender's address to server.
fputs ( $Connect, "MAIL FROM: <{$Email}>\r\n" );
if ($Debug) echo "Run : MAIL FROM: <{$Email}><br />";
$From = fgets ( $Connect, 1024 ); // Receive server's answering cord.
// Inform listener's address to server.
fputs ( $Connect, "RCPT TO: <{$Email}>\r\n" );
if ($Debug) echo "Run : RCPT TO: <{$Email}><br />";
$To = fgets ( $Connect, 1024 ); // Receive server's answering cord.
// Finish connection.
fputs ( $Connect, "QUIT\r\n");
if ($Debug) echo "Run : QUIT<br>";
fclose($Connect);
// Server's answering cord about MAIL and TO command checks.
// Server about listener's address reacts to 550 codes if there does not exist
// checking that mailbox is in own E-Mail account.
if ( !ereg ( "^250", $From ) || !ereg ( "^250", $To )) {
if ($Debug) echo "{$Email} is address done not admit in E-Mail server.<br>";
return false;
}
}
}
// Failure in socket connection
else {
if ($Debug) echo "Can not connect E-Mail server ({$ConnectAddress}).<br>";
return false;
}
return true;
}
function SnowCheckMail($Email,$Debug=false)
{
global $HTTP_HOST;
$Return =array();
// Variable for return.
// $Return[0] : [true|false]
// $Return[1] : Processing result save.
if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $Email)) {
if ($Debug) echo "Error : {$Email} is E-Mail form that is not right.<br>";
return false;
}
else if ($Debug) echo "Confirmation : {$Email} is E-Mail form that is not right.<br>";
// E-Mail @ by 2 by standard divide. if it is $Email this "lsm@ebeecomm.com"..
// $Username : lsm
// $Domain : ebeecomm.com
// list function reference : http://www.php.net/manual/en/function.list.php
// split function reference : http://www.php.net/manual/en/function.split.php
list ( $Username, $Domain ) = split ("@",$Email);
// That MX(mail exchanger) record exists in domain check .
// checkdnsrr function reference : http://www.php.net/manual/en/function.checkdnsrr.p...
if ( checkdnsrr ( $Domain, 'MX' ) ) {
if($Debug) echo "Confirmation : MX record about {$Domain} exists.<br>";
// If MX record exists, save MX record address.
// getmxrr function reference : http://www.php.net/manual/en/function.getmxrr.php
if ( getmxrr ($Domain, $MXHost)) {
if($Debug) {
echo "Confirmation : Is confirming address by MX LOOKUP.<br>";
for ( $i = 0,$j = 1; $i < count ( $MXHost ); $i++,$j++ ) {
echo " Result($j) - $MXHost[$i]<BR>";
}
}
}
for( $i = 0; $i < count( $MXHost) && ! $retour; $i++) {
$retour = SnowCheckHost( $Email, $MXHost[ $i ], $Debug );
}
if ( ! $retour )
$retour = SnowCheckHost( $Email, $Domain, $Debug );
return $retour;
}
else {
// If there is no MX record simply @ to next time address socket connection do .
$ConnectAddress = $Domain;
if ($Debug) echo 'Confirmation : MX record about '.$Domain.' does not exist.<br />';
}
if ( $Debug)
echo 'Aucun problè';
return true;
}
?>
</code>
Ca marche très bien, même si certains MX sont foireux (c'était le but). Florent Clairambault - http://florent.clairambault.fr
Gtalk : superfc@gmail.com |