Page 1 of 1

Need help setting Newsletter sending time

Posted: Wed Sep 23, 2009 5:53 am
by dejansoftware
Newsletter for announcements (Training schedule, Interviews schedule and Exams schedule) which are showing day in future when they will be published. The problem is because the my newsletter will send this training, Interviews or Exams one (1) day after the schedule has passed, but I would like if they can be sent at least one day before that term, otherwise, they are useless and they are just provoke our customers.
FYI
This Newsletter works fine with other informations published on site, the problem is just for articles schedules for future publishing
Here is newsletter.php

Code: Select all

<?php
    function auto_newsletter(){
        global $webpath, $path, $prefix, $admin_mail, $title, $lang;
        $lang = "latn";
        $query = sprintf("SELECT datum FROM %s_logs WHERE sistem ='newsletter' LIMIT 1;", $prefix);
        $sql = mysql_query($query) or die(mysql_error());
        $data = mysql_fetch_array($sql, MYSQL_ASSOC);
        $sql = NULL;
        $time = 24;
        $Datum = mktime(date("H")-$time, date("i"), date("s"), date("m") , date("d"), date("Y"));
        $Datum = strtotime(date('Y-m-d H:i:s', $Datum));
//      $data["datum"] = "2008-03-07 08:00:00 ";
        $datum = strtotime(date('Y-m-d H:i:s', strtotime($data["datum"])));
        $datum2 = date('Y-m-d H:i:s', mktime(date("H", strtotime($data["datum"]))+$time, date("i", strtotime($data["datum"])), date("s", strtotime($data["datum"])), date("m", strtotime($data["datum"])) , date("d", strtotime($data["datum"])), date("Y", strtotime($data["datum"]))));
        if ($Datum > $datum) {
            
            // Ovaj blok koristim za promjenu viewa odredjenih vijesti
            // $prije = date('Y-m-d H:i:s', mktime(0, 0, 0, date("m")-3, date("d"), date("Y")));
            // $query = sprintf("UPDATE %s_vijesti SET prikaz=0 WHERE objavljen < %s AND kategorija=2; ", $prefix, quote_smart($prije));
            //  mysql_query($query) or die(zabrane("error", "Problem u skrivanju konkursa prije $prije"));
            // kraj bloka
            $query = sprintf("UPDATE %s_logs SET datum=%s WHERE sistem ='newsletter' LIMIT 1;", $prefix, quote_smart($datum2));
            $sql = mysql_query($query);
            // u ovom slucaju spamovanje naroda je ok, tako da treba sad skupiti vijesti za slanje
            $query = sprintf("SELECT * FROM %s_vijesti WHERE lang='$lang' AND objavljen BETWEEN %s AND %s ORDER BY objavljen DESC; ", $prefix, quote_smart($data["datum"]), quote_smart($datum2));
            $data = NULL;
            $sql = mysql_query($query);
            if (mysql_num_rows($sql) <> 0) {
            // postoji li razlog za slanje newslettera
            while ($data = mysql_fetch_array($sql, MYSQL_ASSOC)) {
                $kat = $data["kategorija"];
                if (file_exists($path."/docs/news/".$filename."-mala.jpg")) {
                $html .= "<img src='".$webpath."/docs/news/".$filename."-mala.jpg' alt='' title='' align='left' hspace='10' vspace='10' />";
            }
                $page = modul_page('news_categorised', $data["kategorija"]);
                $html .="<p><strong><a href='$webpath/$lang/?page=$page&kat=$kat&vijest=".$data["id"]."'>".$data["naslov"]."</a></strong>";
                $text =  "<p>".strip_tags($data["text"])."<hr />";
                $duzina = 400;
                while(substr($text, $duzina, 1)<>" " AND strlen($text)>$duzina){ $duzina++; }
                $html .= substr($text, 0, $duzina);
            }
            $html = "<h1>".convert("newsletter").": ".date('d.m.Y.', $datum)."</h1>".$html;
            $query = sprintf("SELECT mail FROM %s_korisnici WHERE alerts>0 AND nivo>0; ", $prefix);
            $sql = mysql_query($query) or die(mysql_error());
            if (mysql_num_rows($sql) <> 0) {
                require("$path/data/class.phpmailer.php");
                $html = sprintf(convert("notification_header"), $webpath, $webpath, $webpath, $title, $title).$html.convert("notification_footer");
                while ($data = mysql_fetch_array($sql, MYSQL_ASSOC)) {
                    $mejl = new PHPMailer();
                    $mejl->From     = $admin_mail;
                    $mejl->FromName = $title;
                    $mejl->Host     = "mail.vladars.net";
                    $mejl->Mailer   = "smtp";
                    $mejl->Subject  = convert("newsletter").": ".date('d.m.Y.', $datum);
                    $mejl->Body    = $html;
                    $mejl->AltBody = $title."\n________________________________\n".strip_tags($html);
                    $mejl->AddAddress($data["mail"]);
                //  $mejl->AddBCC("robot@grave-design.com");
//                  echo $data["mail"], " ";
                    if(!$mejl->Send()) zabrane("mailer", $data["mail"]);
                    $mejl->ClearAddresses();
                    $mejl->ClearAttachments();
                }
            }
            }
        }
         
    }
?>
 

Re: Need help setting Newsletter sending time

Posted: Wed Sep 23, 2009 11:27 pm
by Robert07
Hello,
It looks like you are checking if the datum is earlier (less than) 24 hours ago. In that case, you will not send an email until it has been at least 24 hours past the event! Try changing:

Code: Select all

 
$Datum = mktime(date("H")-$time, date("i"), date("s"), date("m") , date("d"), date("Y"));
 
to

Code: Select all

 
$Datum = mktime(date("H")+$time, date("i"), date("s"), date("m") , date("d"), date("Y"));
 
Regards,
Robert

Re: Need help setting Newsletter sending time

Posted: Thu Sep 24, 2009 8:20 am
by dejansoftware
I am not sure what do you mean by that.
Here are couple more clarifications.

If I publish article/s from different categories, newsletter.php will check for new articles and all of them will be putted to the newsletter and automatically sent on 23:00 same day.

For example:
18th october is term for exam. Newsletter will be sent on 18th october in 23:00. So most of the customers will read it first thing in the morning (that's 19th), instead of at least 17th october.
So the problem is just with scheduled articles for future publishing (Training schedule, Interviews schedule and Exams schedule).

Re: Need help setting Newsletter sending time

Posted: Thu Sep 24, 2009 11:18 am
by Robert07
Is this the line where you decide whether to send an email or not?
if ($Datum > $datum) {

Is the script below scheduled to run every day at 23:00:00?

If the answer to those 2 questions yes, then try making the change I suggested - change date("H")-$time to date("H")+$time in the $Datum definition.

Re: Need help setting Newsletter sending time

Posted: Tue Jul 13, 2010 5:16 am
by dejansoftware
Solution is to copy a part of newsletter code and exclude this 3 category ID.
Look for kategorija in and kategorija not in (kategorija = category)

But I cannot find the bug, but shure it is there, please help me to fix this code.

Thanks

Code: Select all

<?php
function auto_newsletter(){
global $webpath, $path, $prefix, $admin_mail, $title, $lang;
		$lang = "latn";
$query = sprintf("SELECT datum FROM %s_logs WHERE sistem ='newsletter' LIMIT 1;", $prefix);
$sql = mysql_query($query) or die(mysql_error());
$data = mysql_fetch_array($sql, MYSQL_ASSOC);
$sql = NULL;
		$time = 24;
$Datum = mktime(date("H")-$time, date("i"), date("s"), date("m") , date("d"), date("Y"));
$Datum = strtotime(date('Y-m-d H:i:s', $Datum));
//		$data["datum"] = "2008-03-07 08:00:00 ";
$datum = strtotime(date('Y-m-d H:i:s', strtotime($data["datum"])));
		
$datum2 = date('Y-m-d H:i:s', mktime(date("H", strtotime($data["datum"]))+$time, date("i", strtotime($data["datum"])), date("s", strtotime($data["datum"])), date("m", strtotime($data["datum"])) , date("d", strtotime($data["datum"])), date("Y", strtotime($data["datum"]))));
if ($Datum > $datum) {
// Ovaj blok koristim za promjenu viewa odredjenih vijesti
// $prije = date('Y-m-d H:i:s', mktime(0, 0, 0, date("m")-3, date("d"), date("Y")));
// $query = sprintf("UPDATE %s_vijesti SET prikaz=0 WHERE objavljen < %s AND kategorija=2; ", $prefix, quote_smart($prije));
//  mysql_query($query) or die(zabrane("error", "Problem u skrivanju konkursa prije $prije"));
// kraj bloka
$query = sprintf("UPDATE %s_logs SET datum=%s WHERE sistem ='newsletter' LIMIT 1;", $prefix, quote_smart($datum2));
$sql = mysql_query($query);
// u ovom slucaju spamovanje naroda je ok, tako da treba sad skupiti vijesti za slanje
$query = sprintf("SELECT * FROM %s_vijesti WHERE lang='$lang' AND objavljen BETWEEN %s AND %s AND kategorija not in (10,11,12,16,17,18,19,20,21) ORDER BY objavljen DESC; ", $prefix, quote_smart($data["datum"]), quote_smart($datum2));
			$data = NULL;
$sql = mysql_query($query);
			if (mysql_num_rows($sql) <> 0) {
			// postoji li razlog za slanje newslettera
while ($data = mysql_fetch_array($sql, MYSQL_ASSOC)) {
$kat = $data["kategorija"];
if (file_exists($path."/docs/news/".$filename."-mala.jpg")) {
$html .= "<img src='".$webpath."/docs/news/".$filename."-mala.jpg' alt='' title='' align='left' hspace='10' vspace='10' />";
}
				$page = modul_page('news_categorised', $data["kategorija"]);
$html .="<p><strong><a href='$webpath/$lang/?page=$page&kat=$kat&vijest=".$data["id"]."'>".$data["naslov"]."</a></strong>";
$text =  "<p>".strip_tags($data["text"])."<hr />";
$duzina = 400;
while(substr($text, $duzina, 1)<>" " AND strlen($text)>$duzina){ $duzina++; }
$html .= substr($text, 0, $duzina);
}
$html = "<h1>".convert("newsletter").": ".date('d.m.Y.', $datum)."</h1>".$html;
			$query = sprintf("SELECT mail FROM %s_korisnici WHERE alerts>0 AND nivo>0; ", $prefix);
$sql = mysql_query($query) or die(mysql_error());
			if (mysql_num_rows($sql) <> 0) {
require("$path/data/class.phpmailer.php");
				$html = sprintf(convert("notification_header"), $webpath, $webpath, $webpath, $title, $title).$html.convert("notification_footer");
				while ($data = mysql_fetch_array($sql, MYSQL_ASSOC)) {
					$mejl = new PHPMailer();




$mejl->From     = $admin_mail;
$mejl->FromName = $title;
$mejl->Host     = "mail.vladar.net";
$mejl->Mailer   = "smtp";
$mejl->Subject  = convert("newsletter").": ".date('d.m.Y.', $datum);
					$mejl->Body    = $html;
$mejl->AltBody = $title."\n________________________________\n".strip_tags($html);
$mejl->AddAddress($data["mail"]);
//	$mejl->AddBCC("robot@grave-design.com");
//	echo $data["mail"], " ";
if(!$mejl->Send()) zabrane("mailer", $data["mail"]);
$mejl->ClearAddresses();
$mejl->ClearAttachments();
				}
			}
}
}
// najava 1
$sql = NULL;
$time = 48;
$Datum = mktime(date("H")-$time, date("i"), date("s"), date("m") , date("d"), date("Y"));
$datumOd = mktime(date("H")-$time, date("i"), date("s"), date("m") , date("d"), date("Y"));
$Datum = strtotime(date('Y-m-d H:i:s', $Datum));
//		$data["datum"] = "2008-03-07 08:00:00 ";
$datum = strtotime(date('Y-m-d H:i:s', strtotime($data["datum"])));
		
//$datum2 = date('Y-m-d H:i:s', mktime(date("H", strtotime($data["datum"]))+$time, date("i", strtotime($data["datum"])), date("s", strtotime($data["datum"])), date("m", strtotime($data["datum"])) , date("d", strtotime($data["datum"])), date("Y", strtotime($data["datum"]))));
$datum2 = date('Y-m-d H:i:s', mktime(date("H", strtotime($data["datum"])), date("i", strtotime($data["datum"])), date("s", strtotime($data["datum"])), date("m", strtotime($data["datum"])) , date("d", strtotime($data["datum"])), date("Y", strtotime($data["datum"]))));
if ($Datum > $datum) {
// Ovaj blok koristim za promjenu viewa odredjenih vijesti
// $prije = date('Y-m-d H:i:s', mktime(0, 0, 0, date("m")-3, date("d"), date("Y")));
// $query = sprintf("UPDATE %s_vijesti SET prikaz=0 WHERE objavljen < %s AND kategorija=2; ", $prefix, quote_smart($prije));
//  mysql_query($query) or die(zabrane("error", "Problem u skrivanju konkursa prije $prije"));
// kraj bloka
$query = sprintf("UPDATE %s_logs SET datum=%s WHERE sistem ='newsletter' LIMIT 1;", $prefix, quote_smart($datum2));
$sql = mysql_query($query);
// u ovom slucaju spamovanje naroda je ok, tako da treba sad skupiti vijesti za slanje
$query = sprintf("SELECT * FROM %s_vijesti WHERE lang='$lang' AND objavljen BETWEEN %s AND %s AND kategorija  in (10,11,12,16,17,18,19,20,21) ORDER BY objavljen DESC; ", $prefix, quote_smart($data["datum"]), quote_smart($datum2));
			$data = NULL;
$sql = mysql_query($query);
			if (mysql_num_rows($sql) <> 0) {
			// postoji li razlog za slanje newslettera
while ($data = mysql_fetch_array($sql, MYSQL_ASSOC)) {
$kat = $data["kategorija"];
if (file_exists($path."/docs/news/".$filename."-mala.jpg")) {
$html .= "<img src='".$webpath."/docs/news/".$filename."-mala.jpg' alt='' title='' align='left' hspace='10' vspace='10' />";
}
				$page = modul_page('news_categorised', $data["kategorija"]);
$html .="<p><strong><a href='$webpath/$lang/?page=$page&kat=$kat&vijest=".$data["id"]."'>".$data["naslov"]."</a></strong>";
$text =  "<p>".strip_tags($data["text"])."<hr />";
$duzina = 400;
while(substr($text, $duzina, 1)<>" " AND strlen($text)>$duzina){ $duzina++; }
$html .= substr($text, 0, $duzina);
}
$html = "<h1>".convert("newsletter").": ".date('d.m.Y.', $datum)."</h1>".$html;
			$query = sprintf("SELECT mail FROM %s_korisnici WHERE alerts>0 AND nivo>0; ", $prefix);
$sql = mysql_query($query) or die(mysql_error());
			if (mysql_num_rows($sql) <> 0) {
require("$path/data/class.phpmailer.php");
				$html = sprintf(convert("notification_header"), $webpath, $webpath, $webpath, $title, $title).$html.convert("notification_footer");
				while ($data = mysql_fetch_array($sql, MYSQL_ASSOC)) {
					$mejl = new PHPMailer();




$mejl->From     = $admin_mail;
$mejl->FromName = $title;
$mejl->Host     = "mail.vladar.net";
$mejl->Mailer   = "smtp";
$mejl->Subject  = convert("newsletter").": ".date('d.m.Y.', $datum);
					$mejl->Body    = $html;
$mejl->AltBody = $title."\n________________________________\n".strip_tags($html);
$mejl->AddAddress($data["mail"]);
//	$mejl->AddBCC("robot@grave-design.com");
//	echo $data["mail"], " ";
if(!$mejl->Send()) zabrane("mailer", $data["mail"]);
$mejl->ClearAddresses();
$mejl->ClearAttachments();
				}
			}
}
}
// kraj najava 1
}
?>

Re: Need help setting Newsletter sending time

Posted: Tue Jul 13, 2010 8:49 am
by Jade
The problem is with your logic. You're always calculating the time for today and then subtracting 24 hours from it, making the time yesterday. Yesterday, $Datum, will never be greater than today, $datum.

If you really want to do this I would suggest setting up a CRON job which checks your schedules and if the current date is 1 day == the scheduled date then send the newsletter out.