aiuto per mailing list

annazampa

Nuovo Utente
3 Feb 2012
3
0
0
Ciao a tutti, sono nuova sia per il forum sia per il php
Purtroppo dalla grafica mi tocca imparare anche la programmazione... cosa non si fa pur di lavorare! E una settimana che sto facendo tentativi su tentativi per fare uno script che mi invii in automatico un messaggio html (e fin qui ci sono arrivata), il problema è che gli utenti sono circa un migliaio!!! chiedendo aiuto in giro mi hanno suggerito swiftmailer che dopo molti tentativi sono riuscita a fare qualcosina, tuttavia non va ancora bene, nel senso che una volta che inoltro i dati la pagina continua ad andare e non finisce di spedire tutti i messaggi (o almeno credo).

Posto lo script, se qualcuno gentilmente mi può dare suggerimenti

PHP:
<?php
require_once '/lib/swift_required.php';

if($_POST["send"]) {


$where = "idconfig = 1";
$mysql = new queryclass("mamba_newsletter_config", "", $where);
$mysql->select();
$config_admin_name = $mysql->result["config_admin_name"][1];
$config_admin_email = $mysql->result["config_admin_email"][1];
$config_label1 = $mysql->result["config_label1"][1];
$config_label2 = $mysql->result["config_label2"][1];
unset($mysql);

//riempo l'array con tutti gli indirizzi email:
$to[] = "tutti gli indirizzi email";

//dati smtp
$smtp_config = array(
'newsletter_title'=>'xxxxxxxx',
'name_from'=>'xxxxxxxx',
'email_from'=>'xxxxxxxx',
'email_to'=>'xxxxxxxxx',
'connection'=>'smtp.xxxxxxxxxxx',
'username'=>'xxxxxxxxxxxx',
'password'=>'xxxxxxxx',
'port'=> 25,
'encryption'=>false);

//Create the Transport
if(!$smtp_config['encryption']) {
$transport = Swift_SmtpTransport::newInstance($smtp_config['connection'], $smtp_config['port'])
->setUsername($smtp_config['username'])
->setPassword($smtp_config['password']);
} else {
$transport = Swift_SmtpTransport::newInstance($smtp_config['connection'], $smtp_config['port'])
->setUsername($smtp_config['username'])
->setPassword($smtp_config['password'])
->setEncryption($smtp_config['encryption']);
}

$mailer = new Swift_Mailer($transport);

$mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100, 30));
Swift_Preferences::getInstance()->setCacheType('null');

// Create email
$message = Swift_Message::newInstance();
$message->setSubject($smtp_config['newsletter_title']);
$message->setFrom(array($smtp_config['email_from'] => $smtp_config['name_from']));
$message->setMaxLineLength(1000);
$message->setEncoder(Swift_Encoding::get8BitEncoding());

//Send the message
$failedRecipients = array();
$numSent = 0;

foreach($to as $address => $name) {
if (is_int($address)) {
$message->setTo($name);
} else {
$message->setTo(array($address => $name));
}
$message->setBody($message_body,'text/html');
$numSent += $mailer->send($message, $failedRecipients);
}
echo '<div id="newsletter_wait">';
printf("Sent %d messages\n", $numSent);
echo '</div>';
};
?>


piu o meno è questo.

grazie!
annazampa
 
Ultima modifica di un moderatore:
ciao
intendi che lo script si arresta senza finire il ciclo foreach e quindi non invia a tutti gli indirizzi?
se è così ho avuto anche io lo stesso problema è ho risolto:
1. mettendo nel ciclo usleep(500000) che lo arresta tra un invio e l'altro di mezzo secondo, questo per cercare di impedire l'intasamento del server di invio
2. usualmente il tempo di vita di uno script è 30 secondi (ini.php di default), quindi uno script che supera tale limite si arresta, quindi ho allungato
tale limite con l'istruzione set_time_limit
fatto questo a me a cominciato a funziare

PHP:
<?php
//set_time_limit allunga il tempo di vita dello script
//dovresti mettere (al posto di 240) il valore risultante da numero_indirizzi * 0.5 sec + un tot
set_time_limit(240);
//....

//.....
foreach($to as $address => $name) {
	if (is_int($address)) {
		$message->setTo($name);
	} else {
		$message->setTo(array($address => $name));
	}
	$message->setBody($message_body,'text/html');
	$numSent += $mailer->send($message, $failedRecipients);
	usleep(500000);//arresta il ciclo per mezzo secondo tra un invio e l'eltro
}
echo '<div id="newsletter_wait">';
printf("Sent %d messages\n", $numSent);
echo '</div>';
};
?>
certo io lavoravo in locale
prova, al massimo non funzia
 
borgo, non è più semplice scrivere:
PHP:
set_time_limit(0);
Per disabilitare completamente il limite di tempo?

Altra cosa: puoi risparmiare tempo togliendo la chiamata a setBody dal ciclo.
PHP:
$message->setBody($message_body, 'text/html');
foreach ($to as $address => $name) {
    if (is_int($address)) {
        $message->setTo($name);
    } else {
        $message->setTo(array($address => $name));
    }

    $numSent += $mailer->send($message, $failedRecipients);
}
 
ciao
@alex: hai ragione, poi un'altra cosa (ma io uso phpmailler):
quando mi ero fatto lo script ho dovuto mettere
$Emailmessaggio->ClearAddresses();
perche altrimenti al primo mi inviava
pinco
al secondo
pinco e pallo
el terzo
pinco, pallo e sempronio
non è da prevedere anche con Swift?
 
Grazie davvero ragazzi!
ho provato a inserire i suggerimenti di borgo italia, vediamo cosa succede quando inviano la prossima newsletter.

grazie anche ad alessandro1997
purtroppo non posso spostare il setBody perché ho inserito il link personalizzato per ogni utente per cancellarsi dalla newsletter :-)

vi spiego meglio cosa succedeva:
cliccando il pulsante invia il php esegue lo script ma la pagina non finisce di caricarsi (rimane la "rotellina") e non conclude il caricamento.
Il cliente ha dei dubbi che i messaggi non partono :-(
magari con i suggerimenti di borgo funziona meglio!

ho sentito parlare anche dell'invio in batch o qualcosa di simile, che a quel che ho capito lo script esegue l'invio in background dopo l'invio…
ho capito giusto?

grazie annazampa
 

Discussioni simili