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

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

Δημοσ.

Καλησπέρα στο forum!

Έχω ένα πρόβλημα προς επίλυση.
Λοιπόν, έχουμε ένα σύστημα αυτόματης αποστολής e-mail.
Τα e-mails προς αποστολή στους χρήστες, αποθηκεύονται στον πίνακα emails, ο οποίος έχει μεταξύ άλλων το column "after_x_weeks" (άλλα columns του που δεν μας ενδιαφέρουν είναι τα emailid AUTO_INCR, emailbody, subject κτλ).
Το after_x_weeks παίρνει τιμές 1,2,3 κτλ κτλ, δλδ αριθμό εβδομάδων, που σημαίνει ότι το τάδε e-mail θα σταλεί στους χρήστες Χ εβδομάδες μετά την εγγραφή τους και ΟΧΙ επαναλαμβανόμενα.

Μπορεί για παράδειγμα ο διαχειριστής να αποθηκεύσει ένα e-mail που θα σταλεί 2 εβδομάδες μετά την εγγραφή του χρήστη και ένα άλλο 3 εβδομάδες μετά την εγγραφή του.
Οπότε ο χρήστης θα λάβει το πρώτο e-mail όταν συμπληρώσει 2 εβδομάδες από την εγγραφή του και άλλο ένα όταν συμπληρώσει 3 εβδομάδες. Δηλαδή όταν συμπληρώσει 3 εβδομάδες, θα έχει λάβει ήδη το e-mail των 2 εβδομάδων, δεν πρέπει να το ξανά λάβει, και ασφαλώς τότε θα λάβει και το e-mail των 3ων εβδομάδων.

- Ας πούμε ότι η στιγμή εγγραφής των χρηστών είναι στον πίνακα users, στο column registration_date (= είναι UNIX TIMESTAMP).
- Όταν τρέχει το cronjob αποστολής e-mail (κάθε 24 ώρες), σημειώνει σε έναν πίνακα με όνομα sentemails, το κάθε e-mail που στάλθηκε. Το structure αυτού του πίνακα είναι:

itemid
emailid
userid
sentdate (= UNIX TIMESTAMP)

 

Προσοχή στο ότι το emailid είναι του πίνακα emails (ο οποίος πίνακας έχει και τα subject, emailbody κτλ), και όχι το emailid που στάλθηκε (για το email που στάλθηκε έβαλα το itemid).

 

Έχουμε λοιπόν όλα τα δεδομένα που χρειαζόμαστε στη βάση.

Θέλω τη βοήθειά σας στο εξής. Ποιες if και κώδικα πρέπει να τρέξω στο cronjob για να στέλνονται σωστά τα e-mail στο σωστό χρόνο και χωρίς επανάληψη? Φυσικά μια χρονική καθυστέρηση μέχρι 24 ωρών, δεν μας ενοχλεί, μιας που κάθε 24 ώρες ελέγχει το cronjob σε ποιους είναι να στείλει.
Προσοχή στο ότι το after_x_weeks είναι αριθμός εβδομάδων, οπότε ίσως πρέπει να κάνουμε κάποια μετατροπή σε unix timestamps.

 

 

Για να μη φανώ και τεμπέλης, να πω ότι προσπαθώ το εξής:

Αρχικά τραβάω τα στοιχεία του πίνακα emails και ύστερα τα εξάγω με μια while ($email = fetch_array(emails)).
Μέσα σε αυτή τη while τραβάω τα στοιχεία του πίνακα users και πάλι με μια while ($user = fetch_array($users)) και κάνω το εξής:
$check = $timenow - $email['after_x_weeks'] * 7 * 86400;
if ($user['registration_date'] < $check)
{
  // στέλνει το email
  // καταχωρεί τα στοιχεία στον πίνακα sentmails
}

To $timenow είναι timestamp του τώρα.

Δεν ξέρω πως να ελέγξω αν το τάδε email έχει ήδη σταλλεί. Προσπάθησα να κάνω κάποιο JOIN του user με τον sentmails, όμως το μόνο κοινό που έχουν είναι το userid.
Δοκίμασα στο SELECT query των users να βάλω IF(sentmails .itemid,1,0) AS has_receive,
και προσθέτω:
if ($user['registration_date'] < $check AND !$user['has_receive'])
{
  // στέλνει το email
  // καταχωρεί τα στοιχεία στον πίνακα sentmails
}
... όμως όπως είπα το μόνο κοινό είναι το userid, οπότε στέλνει μόνο το πρώτο email που εντοπίζει, όχι τα υπόλοιπα.

Γενικά δεν μου έρχεται το πως μπορώ να χρησιμοποιήσω την τιμή sentdate.

 

---------------------------------

Update: Δοκίμασα το εξής μέσα στην while ($email = fetch_array(emails)), το οποίο απ' ότι φαίνεται δουλεύει (δεν χρησιμοποιώ καν την τιμή sentdate).

            SELECT users.*
            FROM users
            WHERE users.userid NOT IN (
             SELECT userid
             FROM sentmails
             WHERE emailid = " . intval($email['emailid']) . ")
Είναι όμως εντάξει σαν λύση από θέμα βελτιστοποίησης; Αν έχουμε 1000δες απεσταλμένα emails, αυτό το NOT IN δεν μου κάθεται καλά. Πιστεύω λάθος;

 

 

Θα ήθελα πολύ τη βοήθειά σας για το όλο πρόβλημα. Οποιαδήποτε παρατήρηση μπρος βελτίωση, ευπρόσδεκτη. :-) :-)
 

Δημοσ.

το after x weeks γιατί δεν το κάνεις και αυτό timestamp?

 

και αν το cron τρέχει μετά από αυτό το timestamp και υπάρχουν email που δεν έχουν σταλεί, να τα στέλνει

Δημοσ.

το after x weeks γιατί δεν το κάνεις και αυτό timestamp?

 

και αν το cron τρέχει μετά από αυτό το timestamp και υπάρχουν email που δεν έχουν σταλεί, να τα στέλνει

Αν δεις στο quote χρησιμοποιώ το $check

Αν και γενικά απ ότι καταλαβαίνω, το πρόβλημά μου είναι η σύνταξη του query.

Έχω παραθέσει στο τέλος κάτι που δουλεύει, όμως δεν ξέρω αν είναι οκ από θέμα βελτιστοποίησης. :fear:

Δημοσ.

βασικά το καλύτερο νομιζω θα ήταν στον ίδιο πίνακα να βάλεις άλλη μια στήλη status για να γλιτώσεις τα δύο select

 

μετά θα είναι κάπως έτσι

 

select * from users
where email_status = 0 and sent_data < utc_timestamp()
Δημοσ.

Ποιο όμως το νόημα του email_status?

Επίσης το sent_data τι περιέχει?

 

Απλά δεν μπορώ να καταλάβω σε τι χρειάζονται αυτές οι τιμές στον users. Ο διαχειριστής μπορεί να ορίσει πάνω από 1 emails για after_x_weeks.

 

thanks :-)

Δημοσ.

οπα sorry σκ@τ@ τα έκανα χαχαχααχ

εννοώ τους πίνακες email και sentmail να τους κάνεις έναν, το users μου ξέφυγε

το status θα είναι 0 ή 1 αν στάλθηκε ή όχι, ή boolean

το άλλο ήταν δοκάρι sent_date, όχι sent_data

Δημοσ.

Καταρχάς μιλάς για αποδοτικότητα αλλα δε εχεις δώσει κάποια νούμερα.

 

Επίσης καλύτερα να μας δώσεις  μερικές εγγραφές(για ασφάλεια μπορεις να αλλάξεις τα προσωπικά δεδομένα) απο του πίνακες που χρησιμοποιείς για να μπορέσουμε να κρίνουμε.

Δημοσ.

Εάν κατάλαβα κάλα αυτό που θες είναι να στέλνεις mails σε συγκεκριμένες χρονικές στιγμές στους users .


 


Για παράδειγμα το σημερινό 24ωρο είναι 1376456400 - 1376542800 . Τώρα εάν καποιανού χρήστη η έγγραφη αληθεύει μεταξύ αυτών των τιμών θα του έστελνα το email . 


 


ΠΧ για το email μιας της δεύτερης εβδομάδας : 


$uts = strtotime('+14 days', $user_registration_date_timestamp);


if($uts >= 1376456400 && $uts <= 1376542800){


//send mail …..


}


 


Αυτή είναι η λογική !!

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

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

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

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

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

Σύνδεση

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

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