Hallo ich bin versucht, mehrere E-Mails mit PhpMailer für ein Benachrichtigungssystem zu senden. Um Probleme mit der Zeitverzögerung zu vermeiden, wenn ein Benutzer ein Formular abschickt, habe ich beschlossen, alle E-Mails, die sie in einer mysql-Tabelle speichern, in Warteschlange zu stellen. Dann benutze ich einen Cron-Job, um die Warteschlange zu senden. Dies ist das Skript, das ich mit Cron-Job renneBenutze Cron Job für Hintergrund php
include('config/config.php');
require_once(ROOT_PATH.'/helper/phpmailer/PHPMailerAutoload.php');
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->isHTML(true);
$mail->Host = SSE_HOST;
$mail->Username = SSE_USER;
$mail->Password = SSE_PASSWORD;
$mail->SMTPSecure = SSE_SECURE;
$mail->Port = 465;
$mail->SetFrom(SSE_FROM, SSE_FROM_NAME);
$mail->addReplyTo(SSE_REPLY, 'Invia Risposta');
$result = mysqli_query($conn, "SELECT queue_emails_email, queue_emails_subject, queue_emails_body FROM queue_emails WHERE queue_emails_status = '1' ");
foreach ($result as $row) {
$mail->addAddress($row['queue_emails_email']);
$subject = $row['queue_emails_subject'];
$mail->Subject = $subject;
$mail->MsgHTML($row['queue_emails_body']);
if (!$mail->send()) {
echo "Mailer Error (" . str_replace("@", "@", $row["queue_emails_email"]) . ') ' . $mail->ErrorInfo . '<br />';
break; //Abandon sending
} else {
echo "Message sent to :" . $row['queue_emails_email'] . ' (' . str_replace("@", "@", $row['queue_emails_email']) . ')<br />';
//Mark it as sent in the DB
mysqli_query($conn, "UPDATE queue_emails SET queue_emails_status = '0' WHERE queue_emails_email = '" .
mysqli_real_escape_string($conn, $row['queue_emails_email']) . "'");
}
// Clear all addresses and attachments for next loop
$mail->clearAddresses();
}
Diese die MySQL-Tabelle ist queue_emails Struktur:
queue_emails_id int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
queue_emails_email varchar(255) NOT NULL,
queue_emails_status int(2) DEFAULT '1',
queue_emails_subject TEXT NOT NULL,
queue_emails_body TEXT NOT NULL
Nun meine Frage: Wenn ich mehr als eine Nachricht habe mit anderer Körper aber dieselbe E-Mail-Adresse, was passiert, wenn der Cron-Job-Prozess unterbrochen wird? Ich habe auf meinem localhost mit Mailtrap getestet und es scheint gut zu funktionieren, aber ich würde gerne wissen, ist diese Methode kann auf einem Live-Server gut sein. Ich glaube nicht, dass meine Warteschlange größer als 200-300 E-Mails sein würde. Vielen Dank für Ihre Hilfe
Warum fügen Sie nicht einfach eine ID-Spalte zu Ihrer Tabelle und UPDATE basierend auf dieser ID, nicht die E-Mail-Adresse? –
Hallo @ TodorSimeonov danke für Ihre schnelle Antwort. Entschuldigung, ich verstehe nicht, was Sie meinen, indem Sie eine ID hinzufügen (ist das die Benutzer-ID)? – pippo
In Ihrer DB-Tabelle 'queue_emails' - fügen Sie dort eine Spalte hinzu, die AUTO INCREMENT sein kann, und es wird eine eindeutige ID jeder E-Mail-Nachricht sein, die Sie senden müssen. Dann können Sie mit 'queue_emails_status = '0' genau diese Zeile mit der E-Mail-Nachricht aktualisieren, die Sie gerade gesendet haben, aber alle anderen Nachrichten an diesen Benutzer (Adresse) bleiben in der Warteschlange. Es spielt keine Rolle, ob die gesamte Tabelle mit der gleichen E-Mail-Adresse gefüllt ist. –