technique email

15 réponses
AuteurMessage

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 !Ouvrir dans une nouvelle fenetre avant qu'il ne fasse le casting pour la star on the net academyOuvrir dans une nouvelle fenetre ou qu'il ne s'empiffre de bonbons à gogoOuvrir dans une nouvelle fenetre

Geo 113 | Geoffrey
Modérateur

Photo de Geo 113

Inscrit le : 04/05/2005

# Le 28/08/2006 à 18:30

envoyer la nuit si c'est pas urgent

CosmixOuvrir dans une nouvelle fenetre
Rendez imprévisible l'Economie; Mentez aux sondages

flush | Jean-Philippe
Modérateur

Photo de flush

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

Photo de Limit

Inscrit le : 11/05/2005

# Le 28/08/2006 à 23:17

tu parles de combien de mails là?

Forum GratuitOuvrir dans une nouvelle fenetre - Blog gratuitOuvrir dans une nouvelle fenetre

superfc | Florent
Membre

Photo de superfc

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.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

radins | Tobias
Modérateur

Photo de radins

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 !Ouvrir dans une nouvelle fenetre avant qu'il ne fasse le casting pour la star on the net academyOuvrir dans une nouvelle fenetre ou qu'il ne s'empiffre de bonbons à gogoOuvrir dans une nouvelle fenetre

Zalex14 | Alexandre
Modérateur

Photo de Zalex14

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...Ouvrir dans une nouvelle fenetre
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

Photo de superfc

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.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

flush | Jean-Philippe
Modérateur

Photo de flush

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 !Ouvrir dans une nouvelle fenetre avant qu'il ne fasse le casting pour la star on the net academyOuvrir dans une nouvelle fenetre ou qu'il ne s'empiffre de bonbons à gogoOuvrir dans une nouvelle fenetre

superfc | Florent
Membre

Photo de superfc

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.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

flush | Jean-Philippe
Modérateur

Photo de flush

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

Photo de superfc

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.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

superfc | Florent
Membre

Photo de superfc

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...Ouvrir dans une nouvelle fenetre

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.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

superfc | Florent
Membre

Photo de superfc

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.comOuvrir dans une nouvelle fenetre

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...Ouvrir dans une nouvelle fenetre
$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.phpOuvrir dans une nouvelle fenetre
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.phpOuvrir dans une nouvelle fenetre
// split function reference : http://www.php.net/manual/en/function.split.phpOuvrir dans une nouvelle fenetre
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...Ouvrir dans une nouvelle fenetre
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.phpOuvrir dans une nouvelle fenetre
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.frOuvrir dans une nouvelle fenetre
Gtalk : superfc@gmail.com

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 10:00:22 | Généré en 11.89ms | Contacts | Mentions légales |