Automatisch mail sturen
Ik vraag mij af of wat ik wil mogelijk is :).
In een MySQL-database staan een aantal agendapunten met data. Nu wil ik graag dat 2 dagen voor die datum (dus iets wat op 10 december gebeuren gaat, dat het op 8 december al verzonden word) een mail verstuurd word naar iedereen in de mailinglist.
Nu mijn vragen:
- Hoe verstuur je een mail naar meerdere personen (geen 2, maar een stuk of 50 tegelijk)
- Hoe kan ik zorgen dat deze mail 2 dagen vantevoren automatisch verzonden word?
Ik weet niet of ik beschikking heb tot Cron Jobs, maar dan meot dit ook weer checken welke data het verzonden moet worden.
Zelf leek me een kleine optie, als er netis is, de mail te versturen als iemand de site bezoekt, en dan in de db opslaan dat de mail verzonden is. Maar ik ben bang dat wanneer er dan 2 mense ntegelijk online komen op de site, de mail 2 maal verzonden word.
Ik hoop dat hier iemand een goeie oplossing heeft :).
BVD
Jorik
lynx --dump http://www.phphulp.nl/bestandje.php >/dev/null
Die run je ieder uur, en dat php bestandje kan je zelf maken. Die checked dan de database, kijkt naar de datum, en verstuurt een mailtje. Als dat mailtje verstuurd is zet je een '1' in de database achter de tabel 'verzonden' ofzo, zodat het ook maar één keer verstuurd word.
Die mail kan je op verschillende manieren doen. Oa met verschillende adressen gescheiden door een komma (als bcc dan, (blind carbon copy), dan zien mensen elkaars adres niet). Of in een loopje :).
Maar in een loopje, is dat niet wat belastend voor de mail-fucntie, omdat deze dan 50 keer oid uitgevoerd moet worden?
http://pear.php.net/package/Mail... Opzich is een loopje wel een grappig idee, pleur die database info in een array, en loop die array met persoonlijke gegevens 1 voor 1 langs. Maar dat is een beetje afhankelijk van de hoeveelheid mails die je wilt gaan verzenden.
Efficient is het niet, immers moet er dan voor ieder mailtje een socket geopend worden... Maar daar is een oplossing voor: Gewijzigd op 08/12/2005 17:22:00 door Arjan Kapteijn
Bij heel veel hosts werkt BCC prima, is mijn ervaring.
Ik ben momenteel aan het uitzoeken heo ik cron jobs werkend krijg, en daarna zal ik een scriptje gaan schrijven etc.
Voor BCC zal ik ook nog ff PHP.net raadplegen, maar ik ben bang dat dit niets word, aangezien dit niet specefiek hierover gaat, en ik er nooit alles van begrijp,
Iemand hier mss een goed voorbeeldje?
wat is dan de beste manier om automatisch te mailen zonder dat iets overbelast word omdat je een paar honderd mailtjes eruit gooit?
$str = 'BCC: [email protected], ';
//ervanuitgaand dat $arr de array met alle adressen is
$str .= implode(', ', $arr);
Volgens mij draait m'n script nu wel ongeveer.
Maar nu heb ik een probleem.
Als ik de e-mail verzend, krijg ik op m'n GMAIL account het volgende:
Content-type: text/html; charset=iso-8859-1
From: WPHarmonie <[email protected]>
Date: Thu, 08 Dec 2005 19:20:12 +0100
Message-Id: <[email protected]>
<html>
<head>
<title>E-mail</title>
<style>body,html { font-family: 'Arial, Sans-serif'; }</style> </head><body> Dit is een test van het automatisch op de hoogte houd systeem enzo. Grt. Jorik.
</body>
</html>
Op hotmail account, en nog wat anderen werkt het gewoon..
Code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?
ERROR_REPORTING(E_ALL);
if($_GET['code'] == "******") {
include("files/connect.php");
$sql = "SELECT * FROM agenda WHERE datum > DATE_SUB(NOW(),INTERVAL 3 DAY) AND mailsent = 0 ORDER BY datum ASC";
$query = mysql_query($sql) OR die(mysql_error());
while($rij = mysql_fetch_object($query)) {
$id = htmlspecialchars($rij->id);
$datum = htmlspecialchars($rij->datum);
$dag = htmlspecialchars($rij->dag);
$vantijd = htmlspecialchars($rij->vantijd);
$tottijd = htmlspecialchars($rij->tottijd);
$wat = htmlspecialchars($rij->wat);
$prioriteit = htmlspecialchars($rij->prioriteit);
$info = htmlspecialchars($rij->info);
$leden_info = htmlspecialchars($rij->leden_info);
$mailsent = htmlspecialchars($rij->mailsent);
$bericht = "<html>\n";
$bericht .= "<head>\n<title>E-mail</title>\n<style>body,html { font-family: 'Arial, Sans-serif'; }</style>\n</head>";
$bericht .= "<body>\n";
$bericht .= "Dit is een test van het automatisch op de hoogte houd systeem enzo. Grt. Jorik.";
#$bericht .= nl2br($_POST['bericht']);
$bericht .= "\n</body>\n</html>";
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "BCC: [email protected],[email protected],[email protected]\r\n";
$sql = "SELECT email,mailagenda FROM leden WHERE mailagenda = 1 ORDER BY email ASC";
$query = mysql_query($sql);
$tellen = mysql_num_rows($query);
while($rij = mysql_fetch_object($query)) {
#$email = htmlspecialchars($rij->email);
#$headers .= "Bcc: ".$email."\r\n";
}
$headers .= "From: WPHarmonie <[email protected]>";
$mail = mail("[email protected]","WPHarmonie: Agendawaarschuwing",$bericht,$headers);
if($mail == TRUE) {
echo "Mail verzonden!";
}else{
echo "error!";
}
}
}else{
echo "Dit script wordt automatisch gestart met een code. Er is geen code ingevoerd of de ingevoerde code is onjuist.";
}
?>
ERROR_REPORTING(E_ALL);
if($_GET['code'] == "******") {
include("files/connect.php");
$sql = "SELECT * FROM agenda WHERE datum > DATE_SUB(NOW(),INTERVAL 3 DAY) AND mailsent = 0 ORDER BY datum ASC";
$query = mysql_query($sql) OR die(mysql_error());
while($rij = mysql_fetch_object($query)) {
$id = htmlspecialchars($rij->id);
$datum = htmlspecialchars($rij->datum);
$dag = htmlspecialchars($rij->dag);
$vantijd = htmlspecialchars($rij->vantijd);
$tottijd = htmlspecialchars($rij->tottijd);
$wat = htmlspecialchars($rij->wat);
$prioriteit = htmlspecialchars($rij->prioriteit);
$info = htmlspecialchars($rij->info);
$leden_info = htmlspecialchars($rij->leden_info);
$mailsent = htmlspecialchars($rij->mailsent);
$bericht = "<html>\n";
$bericht .= "<head>\n<title>E-mail</title>\n<style>body,html { font-family: 'Arial, Sans-serif'; }</style>\n</head>";
$bericht .= "<body>\n";
$bericht .= "Dit is een test van het automatisch op de hoogte houd systeem enzo. Grt. Jorik.";
#$bericht .= nl2br($_POST['bericht']);
$bericht .= "\n</body>\n</html>";
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "BCC: [email protected],[email protected],[email protected]\r\n";
$sql = "SELECT email,mailagenda FROM leden WHERE mailagenda = 1 ORDER BY email ASC";
$query = mysql_query($sql);
$tellen = mysql_num_rows($query);
while($rij = mysql_fetch_object($query)) {
#$email = htmlspecialchars($rij->email);
#$headers .= "Bcc: ".$email."\r\n";
}
$headers .= "From: WPHarmonie <[email protected]>";
$mail = mail("[email protected]","WPHarmonie: Agendawaarschuwing",$bericht,$headers);
if($mail == TRUE) {
echo "Mail verzonden!";
}else{
echo "error!";
}
}
}else{
echo "Dit script wordt automatisch gestart met een code. Er is geen code ingevoerd of de ingevoerde code is onjuist.";
}
?>
Zo te zien is er met de headers niets mis. Blijkbaar ondersteunt GMail geen html. Gelukkig ontvang ik GMail in mijn emailclient die dat wel doet :)
Ja, dat doe ik ook, maar die doet het dus bij gmail ook ff niet... :S
Het volgende doet niet wat ik wil:
Code (php)
1
2
3
2
3
<?
SELECT * FROM agenda WHERE datum > DATE_SUB(NOW(),INTERVAL 3 DAY) AND mailsent = 0 ORDER BY datum ASC
?>
SELECT * FROM agenda WHERE datum > DATE_SUB(NOW(),INTERVAL 3 DAY) AND mailsent = 0 ORDER BY datum ASC
?>
Het is de bedoeling dat dit selecteert waar de datum over drie dagen is.. maar doet doet ie niet. (drie dagen tot nu om precies te zijn dan).
Dus moet het iets zijn van datum is groter dan nu met max. 3 groter. Hoe de * dit te doen?
Misschien? Ben niet zo god in datum sql's,
ik houd het bij de timestamps ^^
Code (php)
1
2
3
2
3
<?
SELECT * FROM agenda WHERE DATE_ADD(NOW(),INTERVAL 3 DAY) > datum AND mailsent = 0 ORDER BY datum ASC
?>
SELECT * FROM agenda WHERE DATE_ADD(NOW(),INTERVAL 3 DAY) > datum AND mailsent = 0 ORDER BY datum ASC
?>
soms is het té simpel...