Προς το περιεχόμενο

περίεργη συμπεριφορά server σε μαζική αποστολή email μέσω php


doctorized

Προτεινόμενες αναρτήσεις

Έστειλα κάποια ενημερωτικά email, περί τα 800, σε κάποια άτομα τα οποία έχουν δώσει την έγκρισή τους για ενημέρωση.

Χρησιμοποίησα PHPMailer 6.3.0 στον παρακάτω κώδικα:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;

require 'PHPMailer6/src/Exception.php';
require 'PHPMailer6/src/PHPMailer.php';
require 'PHPMailer6/src/SMTP.php';

echo "initializing...<br>";
$body = "<html>\n"; 
$body .= "<body style=\"font-family:Verdana, Verdana, Geneva, sans-serif; font-size:18px;\">\n"; 
$body .= "<το κείμενό μου </body>\n</html>\n";

echo "entering sending loop....<br>";
$fn = fopen("mails.txt","r");
while (! feof($fn)){
	$result = fgets($fn);
	echo $result;
	
	$mail = new PHPMailer(true);

    $mail->isSMTP(); 
    //$mail->SMTPDebug = 2; // 0 = off (for production use) - 1 = client messages - 2 = client and server messages
    $mail->Host = 'websitemail'; 
    $mail->SMTPSecure = 'tls';

	$mail->SMTPOptions = array(
	'ssl' => array(
	'verify_peer' => false,
	'verify_peer_name' => false,
	'allow_self_signed' => true
	)
	);
    //$mail->Port = 465; <- Could be 587 or 25
    $mail->SMTPAuth = true;
    $mail->Username = 'το όνομα';
    $mail->Password = 'κωδικός'; 
	$mail -> CharSet = 'utf-8';
     /* Set the mail sender. */
    $mail->setFrom('η διεύθυνση αποστολέα', 'όνομα αποστολέα'); 
    $mail->addAddress($result); 
	$mail->Body = $body;
	$mail->IsHTML(true);
	$mail->Subject = 'το θέμα';
    if (!$mail -> Send()){
		echo " ERROR!";	
	}
	echo "<br>";
}
fclose($fn);
echo "<br>";
echo "ENDED!";
?>

Τα email των παραληπτών βρίσκονται στο αρχείο mails.txt με 1 διεύθυνση ανά γραμμή.

Τρέχω το php αρχείο και την πρώτη φορά στέλνει 243 emails, τα πρώτα 243 από το αρχείο.

Σβήνω τα email αυτά και ξανατρέχω. Στην προσπάθεια αυτή έστειλε γύρω στα 75.

Σβήνω και πάλι τις διευθύνσεις που είπε ότι πήραν και τρέχω ξανά. Στην προσπάθεια αυτή πήγαν όλα τα υπόλοιπα emails, 480 περίπου, και σιγουρεύτηκα καθώς είχα βάλει τελευταίο το δικό μου και έλαβα κανονικά mail.

Ξέρει κάποιος να μου πει γιατί συνέβη αυτό; Γιατί δεν πήγαν όλα τα email μαζί ή έστω με κάποιον ομοιόμορφο τρόπο ώστε να σπάσω τη λίστα των mails σε 3 ή 4 κομμάτια; Πρέπει να αλλάξω ή να προσθέσω κάτι;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

10 ώρες πριν, youraccount είπε

Timeout.

Και σε ποιο χρόνο κάνει timeout; Στην πρώτη προσπάθεια έκανε timeout στο μισό λεπτό περίπου. Τη δεύτερη φορά έκανε στα 10 δευτερόλεπτα περίπου, εξού και τα 75 emails αλλά στην τρίτη προσπάθεια πήρε σίγουρα γύρω στο λεπτό ίσως και παραπάνω. Γι αυτό ρωτάω γιατί δεν φαίνεται να έχει κάποια λογική. Αν κρατούσαν και οι 3 προσπάθειες τον ίδιο χρόνο και στέλνονταν ο ίδιος, πάνω-κάτω, αριθμός emails κάθε φορά τότε δεν θα το συζητούσαμε.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το μήνυμα "ENDED!" το βλέπεις στον browser σου; Εάν ναι τότε δεν είναι σίγουρα timeout. Πιθανότατα ο webhost σου να έχει και κάποιο rate limit στις αποστολές e-mails, καλύτερα να μιλήσεις μαζί τους για να το κοιτάξουν.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Τέτοιες ενέργειες χρειάζονται να τρέχουν μέσω CLI είτε με την χρήση CRON είτε μέσω Queues είτε μέσω κάποιου background process. 10sec η 30sec είναι too much time για web app, bulk ενέργειες όπως γίνονται μέσω CLI παρά μέσω WEB/Browser.
 

Μπορείς με ποικίλους τρόπους να κάνεις bypass το πρόβλημά σου, ο απλός γρήγορος και βρώμικος (5min job ασ πομύμε) είναι μέσω της ταπεινής system:

system("php send_emails.php&");

Που όλο το email sending logic είναι στο αρχείο send_emails.php.  ΠΡΟΣΟΧΗ το command σου στην system πρέπει να τελειώνει με & που σε GNU/Linux υποδεικνύει ότι η εντολή αυτή θα τρέξει στο background.

Εναλλακτικά αξιοποίησε cronjob που σου δίνει ο πάροχός σου στο hosting σε GNU/Linux VPS/Server που έχεις SSH/Shell access τρέξε:

crontab -e

Και διάβασε το https://phoenixnap.com/kb/set-up-cron-job-linux τέλος υπάρχει και το https://crontab.guru/ που βοηθά as well.

Στην περίπτωση των Queues υπάρχουν αρκετές λύσεις όπως beanstalk η rabbitMQ και πάντα γίνετε με συνδιασμό με τον supervisor. Το concept είτε ότι τρέχεις ένα Script(s) μέσω supervisor που ακούν για μυνήματα μέσω beanstalk ή RabbitMQ όταν λάβουν τα μυνήματα στένουν email.

 

Οπως και να έχει στο send_emails.php που είναι το background process καταγράφεις μια βάση δεδομένων (έστω σε μια εφήμερη SQLITE) ποια email έχεις στείλει και σε κάθε εκτέλεση skipαρε από την λούπα σου τα emails αυτά. Σε περίπτωση Exception κατέγραφέ σε ένα Log FIle ή αξιοποίησε και υπηρεσίες όπως το https://sentry.io ώστε να έχεις μια καλή εικόνα του σε ποια email δεν μπόρεσες να στείλεις.

Μετά μπορείς να λάβεις το progres μέσω των εξής μεθόδων:

  • είτε μέσω Websocket αλλα χρειάζετε να έχεις τον δικόν σου websocket server
  • είτε μέσω ajax polling (εάν και σκοτώνεις το browser με αυτόν τον τρόπο).
  • Είτε μέσω FireBase να λαμβάνεις Live update αλλά χρειάζετε σε JS να έχεις έναν Listener και μέσω PHP να αποστέλνεις μυνήματα σχετικά με το progress σε αυτό.  Το Javascript Κομμάτι είναι το https://firebase.google.com/docs/web/setup ενώ τπο PHP Κομμάτι είναι το https://github.com/plokko/firebase-php

Τέλος υπάρχει και άλλος τρόπος ο οποίος είναι η Χρήση Marketing Λιστών όπως μέσω υπηρεσιών MAILCHIMP και MOOSEND. εγγραφεις τους χρήστες σε μια λίστα και αποστέλλεις το email σου. Μάλιστα εάν είναι One-Off ίσως η λύση αυτή σου δίνει μια καλή ευκαιρία χωρίς κώδικα να αποστέλλεις μαζικά email η να δίνεις ένα ωραίο web panel και να πασάρεις το μπαλάκι της αποστολής email σε άλλους εάν είσαι σε εταιρεία ;). Παράλληλα οι υπηρεσίες αυτές έχουν ΚΑΙ API εάν θες να κάνεις κάποια Automations στον τομέα των emails as well. Το  (-) είναι ότι οι Mailing List Solutions είναι επί πληρωμή και πολλές φορές αντικαθιστούν όποια URL με δικά τους που σε κάνουν redirect πάλι στο URL του Site. Αυτό ίσως να εγείρει issues με GDPR.

 

Επεξ/σία από PC_MAGAS
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@CyberCr33p οχι δεν το βλέπω. Αν το έβλεπα θα ήξερα ότι τελείωσε έχοντας στείλει όλα τα emails. Όσο  για το limit που λες, τα ακανόνιστα νούμερα δεν βοηθούν για εξαγωγή τέτοιου συμπεράσματος. 

 

Αν αφήσουμε έξω όσα λέτε περί βάσης δεδομένων και Firebase, πώς μπορώ να κάνω αποστολή μέσω cli; Δεν είμαι γνώστης του συγκεκριμένου αντικειμένου οπότε πάσα βοήθεια με βήματα καλοδεχουμενη. 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

55 λεπτά πριν, doctorized είπε

@CyberCr33p οχι δεν το βλέπω. Αν το έβλεπα θα ήξερα ότι τελείωσε έχοντας στείλει όλα τα emails. Όσο  για το limit που λες, τα ακανόνιστα νούμερα δεν βοηθούν για εξαγωγή τέτοιου συμπεράσματος. 

 

Αν αφήσουμε έξω όσα λέτε περί βάσης δεδομένων και Firebase, πώς μπορώ να κάνω αποστολή μέσω cli; Δεν είμαι γνώστης του συγκεκριμένου αντικειμένου οπότε πάσα βοήθεια με βήματα καλοδεχουμενη. 

Σου απάντησε ο @PC_MAGAS

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όπως σου είπαν και οι άλλοι μην φορτώνεις το front end με τέτοιες διαδικασίες που μπορεί να μην τελειώσουν ή να τελειώσουν μετά από πολύ χρόνο. Αν θες να τα στέλνεις με web interface κάνε ένα ασύγχρονο request και όταν τελειώσει το script σου άμα τελειώσει 😀 δείχνει τα αποτελέσματα ή τα errors.

Διάβασε το documentation του php mailer πως στέλνεις μήπως κάνεις κάτι λάθος. Εμένα πχ μου φένεται παράξενο που σε κάθε loop φτιάχνεις καινούργιο mail object και το δεν το διαγράφεις ποτέ. Κανονικά πρέπει να κάνεις ένα και στο βρόγχο να αλλάζεις τα attributes. Μήπως επίσης θα μπορούσες να κάνεις εμαιλ list στο to αντί να στέλνεις πολλά εμαιλς.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 2/4/2021 στις 10:34 ΜΜ, ΠάρηςΓ είπε

Σου απάντησε ο @PC_MAGAS

To θέμα είναι πως δεν είμαι σχετικός και δεν κατάλαβα τίποτα από ότι είπε ο άνθρωπος. Ξέρω να γράψω έναν απλό κώδικα σε html και php, βρήκα έναν έτοιμο κώδικα που δείχνει πώς να χρησιμοποιήσω το PHPMailer οπότε έπαιξα πάνω σε αυτόν. Δεν ξέρω τι είναι το cli (υποθέτω είναι τα αρχικά γράμματα της λέξης client ή κάποιο interface) οπότε χρειάζομαι περισσότερες πληροφορίες. Ναι, θέλω να μάθω πράγματα, απλώς χρειάζεται να με βάλει κάποιος στη σωστή κατεύθυνση.

Αν αφήσω προς το παρόν στην άκρη τον κώδικα php, υπάρχει μήπως κάποιο πρόγραμμα που να κάνει την δουλειά αυτή; Επειδή πρέπει να στείλω και κάποιες βεβαιώσεις παρακολούθησης από σεμινάρια, θα πρέπει να μπορώ να προσθέσω συνημμένο αρχείο pdf, κάτι το οποίο δεν κάνει η συγχώνευση αλληλογραφίας του MS Word.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

@doctorized

PHP μπορείς και εκτελείς KAI σε περιβάλλον εντολών (aka shell, cli ή γραμμή εντολών). Εάν πχ. έχεις ένα linux περιβάλλον μπορείς να κάνεις ένα απλό script και να το τρέχεις μέσω γραμμής εντολών. Πχ έαν έχεις ένα script έστω εν ονόματι send_email.php μπορείς να το τρέχεις ως εξής:

php send_email.php

Εάν θες να τρέχεις το script στο background μπορείς να το κάνεις σε γραμμή εντολών Linux:

php send_email.php &


Στην απάντησή μου με την system (την πρώτη προσέγγιση ξέχνα queues ξέχνα τα πάντα) απλά σου λέω κάνε ένα php script που θα το εκτελεί ο webserver (όπως ξέρεις κανονικά) και αυτό κάντο να εκτελεί μια εντολή κέλυφους που η εντολή αυτή θα εκτελεί ένα php script στο background. Την firebase το έριξα σαν ιδέα επειδή αποτελεί  σύστημα για push notification ώστε να έχεις σε javascript λίγο κώδικα και μέσω browser να λαμβάνεις ενημερώσεις για το πότε στάλθηκαν τα email.

Σε php γράφεις απλό κώδικα και σε cli/command line interface απλά ΔΕΝ εκτυπώνεις html αλλά απλά output μέσω echo. Πχ εάν είχες ένα πρόγραμμα σε C όταν το έκανες compile με την printf θα εκτύπωνες κανονικά κάτι αντίστοιχο και με την echo θα κάνεις και στο PHP script σου και δεν θα βάζεις ΚΑΘΟΛΟΥ html.

 

Tέλος σαν εξτραδάκι, σε windows εάν τρέχεις XAMPP για να τρέχεις php μέσω cli πρέπει πρώτα να κάνεις τα ακολούθα αυτά τα βήματα https://fellowtuts.com/php/run-php-from-command-line-in-windows-and-xampp/, αν και προσωπικά, θα συνιστούσα είτε να πήγαινες είτε σε WSL ή να έστηνες Linux VM ή καλύτερα να αξιοποιούσες το Homestead  και αυτό γιατί το hosting σου 99,9999...999..9% θα τρέχει Linux έτσι θα αποφύγεις ασυμβατότητες και δεν λερώνεις το main σύστημα με ότι extra χρειάζετε το project σου.


Ευελπιστώ να έγινα ποιο επεξηγηματικός.

Στις 4/4/2021 στις 11:16 ΜΜ, doctorized είπε

Αν αφήσω προς το παρόν στην άκρη τον κώδικα php, υπάρχει μήπως κάποιο πρόγραμμα που να κάνει την δουλειά αυτή; Επειδή πρέπει να στείλω και κάποιες βεβαιώσεις παρακολούθησης από σεμινάρια, θα πρέπει να μπορώ να προσθέσω συνημμένο αρχείο pdf, κάτι το οποίο δεν κάνει η συγχώνευση αλληλογραφίας του MS Word.

Ναι υπάρχουν υπηρεσίες και μάλιστα 3:

  1. Moosend https://moosend.com/
  2. Mailchimp https://mailchimp.com/
  3. Amazon Workmail: https://docs.aws.amazon.com/workmail/latest/userguide/create_distribution_list.html

Που με αυτές σου δίνει δυνατότητες να ορίζεις email σε λίστες και να στέλνεις email αποστέλλοντας απλά στην λίστα. Bέβαια το πληρώνεις. Τα email μπορείς να τα περάσεις μέσω web panel. Κάνεις μια λίστα πχ. σε Moosend και μετά κάνεις import τα email μέσω XLS ή και CSV https://help.moosend.com/hc/en-us/articles/210665469-Can-I-import-my-contacts-from-a-CSV-file- η κάνοντας copy-paste από το mails.txt που το script σου κάνει. Το Moosend σαν υπηρεσία το αξιοποιώ στην εργασία και ναι έχω καταναλώσει και τα APIS του.

Επεξ/σία από PC_MAGAS
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

17 ώρες πριν, PC_MAGAS είπε

@doctorized

PHP μπορείς και εκτελείς KAI σε περιβάλλον εντολών (aka shell, cli ή γραμμή εντολών). Εάν πχ. έχεις ένα linux περιβάλλον μπορείς να κάνεις ένα απλό script και να το τρέχεις μέσω γραμμής εντολών. Πχ έαν έχεις ένα script έστω εν ονόματι send_email.php μπορείς να το τρέχεις ως εξής:


php send_email.php

Εάν θες να τρέχεις το script στο background μπορείς να το κάνεις σε γραμμή εντολών Linux:


php send_email.php &


Στην απάντησή μου με την system (την πρώτη προσέγγιση ξέχνα queues ξέχνα τα πάντα) απλά σου λέω κάνε ένα php script που θα το εκτελεί ο webserver (όπως ξέρεις κανονικά) και αυτό κάντο να εκτελεί μια εντολή κέλυφους που η εντολή αυτή θα εκτελεί ένα php script στο background. Την firebase το έριξα σαν ιδέα επειδή αποτελεί  σύστημα για push notification ώστε να έχεις σε javascript λίγο κώδικα και μέσω browser να λαμβάνεις ενημερώσεις για το πότε στάλθηκαν τα email.

Σε php γράφεις απλό κώδικα και σε cli/command line interface απλά ΔΕΝ εκτυπώνεις html αλλά απλά output μέσω echo. Πχ εάν είχες ένα πρόγραμμα σε C όταν το έκανες compile με την printf θα εκτύπωνες κανονικά κάτι αντίστοιχο και με την echo θα κάνεις και στο PHP script σου και δεν θα βάζεις ΚΑΘΟΛΟΥ html.

 

Tέλος σαν εξτραδάκι, σε windows εάν τρέχεις XAMPP για να τρέχεις php μέσω cli πρέπει πρώτα να κάνεις τα ακολούθα αυτά τα βήματα https://fellowtuts.com/php/run-php-from-command-line-in-windows-and-xampp/, αν και προσωπικά, θα συνιστούσα είτε να πήγαινες είτε σε WSL ή να έστηνες Linux VM ή καλύτερα να αξιοποιούσες το Homestead  και αυτό γιατί το hosting σου 99,9999...999..9% θα τρέχει Linux έτσι θα αποφύγεις ασυμβατότητες και δεν λερώνεις το main σύστημα με ότι extra χρειάζετε το project σου.


Ευελπιστώ να έγινα ποιο επεξηγηματικός.

Ναι υπάρχουν υπηρεσίες και μάλιστα 3:

  1. Moosend https://moosend.com/
  2. Mailchimp https://mailchimp.com/
  3. Amazon Workmail: https://docs.aws.amazon.com/workmail/latest/userguide/create_distribution_list.html

Που με αυτές σου δίνει δυνατότητες να ορίζεις email σε λίστες και να στέλνεις email αποστέλλοντας απλά στην λίστα. Bέβαια το πληρώνεις. Τα email μπορείς να τα περάσεις μέσω web panel. Κάνεις μια λίστα πχ. σε Moosend και μετά κάνεις import τα email μέσω XLS ή και CSV https://help.moosend.com/hc/en-us/articles/210665469-Can-I-import-my-contacts-from-a-CSV-file- η κάνοντας copy-paste από το mails.txt που το script σου κάνει. Το Moosend σαν υπηρεσία το αξιοποιώ στην εργασία και ναι έχω καταναλώσει και τα APIS του.

Σε ευχαριστώ πολύ για τις πληροφορίες. Πιστεύω ότι με βοήθησες αρκετά. Ο σερβερ τρέχει Linux, redhat νομίζω, οπότε θα προσπαθήσω να βελτιώσω τον php κώδικα και να τον τρέξω σε γραμμή εντολών. Σαν απλός χρήστης, έχω μόνο το plesk να χρησιμοποιήσω, θα δω τι μπορώ να κάνω για να ανοίξω command line. 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 8/4/2021 στις 4:45 ΜΜ, doctorized είπε

 Σαν απλός χρήστης, έχω μόνο το plesk να χρησιμοποιήσω, θα δω τι μπορώ να κάνω για να ανοίξω command line. 

Μπορείς να κάνεις  μια σελίδα που θα τρέχει το php μέσω command line ;)

Η system είναι πρακτικά σαν να ανοίγεις command line και να το τρέχεις δηλαδή θα έχεις 2 php scripts:

  1. Το php script που τρέχει σε κέλυφος
  2. Το php script/σελίδα που τρέχει το παραπάνω script μέσω shell και θα το επισκέπτεσε μέσω browser. Σημείωση η εντολή που θα τρέξει η system να τελειώνει με &.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...