Hallo iedereen,

ik heb op het internet een eenvoudig scriptje gevonden om in te tekenen op nieuwsbrieven, uit te schrijven en te versturen. Bij dat laatste krijg ik als admin de melding dat de nieuwsbrief verstuurd werd, maar niemand ontvangt iets. Iemand een idee wat ik over het hoofd zie? Alvast bedankt!

<?php
$file = "nieuws.log"; //de naam van het bestand waar de e-mailadressen inkomen

if(isset($_GET['aanmelden'])){
if(!isset($_POST['submit'])){
?>

<form action="" method="post">
Voer uw e-mailadres in waarop u de nieuwsbrief wilt ontvangen:<br>
<input type="text" name="mailadres"><br><br>
<input type="submit" name="submit" value="Aanmelden">
</form>

<?php
}else{
//eerst even controleren of alles correct ingevult is
if(empty($_POST['mailadres']) OR !strpos($_POST['mailadres'], "@") OR !strpos($_POST['mailadres'], ".")){
exit("U hebt een ongeldig e-mailadres opgegeven!");
}else{
//als er niks mis mee is in een flatfile plaatsen
$fp = fopen($file, 'a');
fwrite($fp, $_POST['mailadres']."; "); //we zetten naast het mailadres een ; als scheidingsteken
fclose($fp);
echo "U bent met succes aangemeld!";
}
}
}
elseif(isset($_GET['afmelden'])){
if(!isset($_POST['mailadres'])){
?>

<form action="" method="post">
Voer uw e-mailadres in waarop u zich wilt afmelden:<br>
<input type="text" name="mailadres"><br><br>
<input type="submit" name="submit" value="Aanmelden">
</form>

<?php
}else{
// weer controleren
if(empty($_POST['mailadres']) OR !strpos($_POST['mailadres'], "@") OR !strpos($_POST['mailadres'], ".")){
exit("U hebt een ongeldig e-mailadres opgegeven!");
}else{
$inhoud = file_get_contents($file); // opvragen van de emailadressen
if(strpos($inhoud, $_POST['mailadres'])){
$inhoud = str_replace($_POST['mailadres'].";", "", $inhoud); //adres met ; verwijderen
$fp = fopen($file, 'w'); // $file leeg openen voor schrijven
fwrite($fp, $inhoud); //andere adressen terug plaatsen
fclose($fp);
echo "U bent afgemeld!";
}else{
exit("Het opgegeven e-mailadres is niet aangemeld in ons systeem.");
}
}
}
}
elseif(isset($_GET['admin'])){
$w8w = "qwerty"; //het wachtwoord om in te loggen
//ter beveiliging een loginformpje
if(!isset($_POST['submit']) OR (isset($_POST['wachtw']) && $w8w != $_POST['wachtw'])){
?>

<form action="" method='post'>
Voer het wachtwoord in:<br>
<input type='text' name='wachtw'><br><br>
<input type='submit' value='Log In' name='submit'>
</form>

<?php
}elseif(isset($_POST['submit']) && isset($_POST['wachtw']) && $w8w == $_POST['wachtw']){
?>

Welkom admin.<br>
Hieronder kunt u een nieuwe nieuwsbrief verzenden.<br>
Deze maakt u in HTML, maar u hoeft geen <br> te gebruiken: dit wordt automatisch gedaan.<br><br>

<form action="" method='post'>
Onderwerp: <input type='text' name='onderwerp'><br><br>
Bericht:<br>
<textarea cols='50' rows='10' name='mail'></textarea><br><br>
<input type='submit' name='submit' value='Verzend'>
</form>

<?php
// het verzenden
}elseif(isset($_POST['onderwerp'])){
/* we hebben een bestand volgepropt met emailadressen
deze emailadressen moeten dus van elkaar gescheiden worden
en elk moet dezelfde mail ontvangen
dit gaan we doen met explode() en een for-loop
ook gaan we headers gebruiken, deze zie je hieronder
*/
// HTML gebruiken
$headers = "MIME-Version: 1.0 ";
$headers .= "Content-type: text/html; charset=iso-8859-1 ";
// hieronder het adres waar het vandaan lijkt te komen
$headers .= "From: Team XXXXXX <info@mijn gewijzigd emailadres.be> ";

$adressen = file_get_contents($file);
$adressen = explode(";", $adressen);
for($i=0;isset($adressen[$i]);$i++){
mail($adressen[$i], stripslashes($_POST['onderwerp']), nl2br($_POST['mail']), $headers); //het mailen
}
echo "De nieuwsbrief is verstuurd!";
}
}
?>
Debug het eens door een echo in je for-loop te plaatsen met de benidigde variabel uit mail(). Dan weet je in ieder geval of alle gegevens correct gebruikt worden.

Als test mag ik toch wel hopen dat je een test-lijst met mailadressen gebruikt.

Verder is mijn advies om liever phpMailer te gebruiken. Die is robuuster, en communiceert ook makkelijk via SMTP, wat de betere weg is om een e-mail te versturen.

Maar waarom gebruik je geen database? Dat is veel makkelijker te beheren dan een compleet tekstbestand, waarvan ik van harte hoop dat deze niet publiekelijk beschikbaar is. (Datalek!!)

En plaats graag code-tags om je lap code.
Heb het script net even getest. Het werkt gewoon. Mails worden verstuurd. Als je fakemailgenerator.com gebruikt voor een paar wegwerp email adressen dan zie je dat ze ook gewoon ontvangen worden.
Ik vermoed dat het probleem eerder zit in dat de emails als spam worden aangemerkt en je ze daarom nooit ziet.

Verder, Vroeger waren php programmeurs een stuk knapper dan nu. Ik kan die oude spaghetti niet lezen dus eerst maar eens wat leesbaarder gemaakt.

Tenslotte, mijn advies. Na het testen dit script onmiddellijk wegsmijten. Er is zoveel mis mee dat ik niet eens zou weten waar te beginnen....

<?php

$file = "nieuws.log"; //de naam van het bestand waar de e-mailadressen inkomen

if(isset($_GET['aanmelden']))
{
	if(!isset($_POST['submit']))
	{

		echo <<<ANM

		<form action="" method="post">
			Voer uw e-mailadres in waarop u de nieuwsbrief wilt ontvangen:<br>
			<input type="text" name="mailadres"><br><br>
			<input type="submit" name="submit" value="Aanmelden">
		</form>

ANM;
	}
	else
	{
		//eerst even controleren of alles correct ingevult is
		if(empty($_POST['mailadres']) OR !strpos($_POST['mailadres'], "@") OR !strpos($_POST['mailadres'], "."))
		{
			exit("U hebt een ongeldig e-mailadres opgegeven!");
		}
		else
		{
			//als er niks mis mee is in een flatfile plaatsen
			$fp = fopen($file, 'a');
			fwrite($fp, $_POST['mailadres']."; "); //we zetten naast het mailadres een ; als scheidingsteken
			fclose($fp);
			echo "U bent met succes aangemeld!";
		}
	}
}
elseif(isset($_GET['afmelden']))
{
	if(!isset($_POST['mailadres']))
	{
		echo <<<AFM
			<form action="" method="post">
				Voer uw e-mailadres in waarop u zich wilt afmelden:<br>
				<input type="text" name="mailadres"><br><br>
				<input type="submit" name="submit" value="Aanmelden">
			</form>
AFM;

	}
	else
	{
		// weer controleren
		if(empty($_POST['mailadres']) OR !strpos($_POST['mailadres'], "@") OR !strpos($_POST['mailadres'], ".")){
			exit("U hebt een ongeldig e-mailadres opgegeven!");
		}
		else
		{
			$inhoud = file_get_contents($file); // opvragen van de emailadressen
			if(strpos($inhoud, $_POST['mailadres']))
			{
				$inhoud = str_replace($_POST['mailadres'].";", "", $inhoud); //adres met ; verwijderen
				$fp = fopen($file, 'w'); // $file leeg openen voor schrijven
				fwrite($fp, $inhoud); //andere adressen terug plaatsen
				fclose($fp);
				echo "U bent afgemeld!";
			}
			else
			{
				exit("Het opgegeven e-mailadres is niet aangemeld in ons systeem.");
			}
		}
	}
}
elseif(isset($_GET['admin']))
{
	$w8w = "qwerty"; //het wachtwoord om in te loggen
	//ter beveiliging een loginformpje
	if(!isset($_POST['submit']) OR (isset($_POST['wachtw']) && $w8w != $_POST['wachtw']))
	{
		echo <<<WWF
		<form action="" method='post'>
			Voer het wachtwoord in:<br>
			<input type='text' name='wachtw'><br><br>
			<input type='submit' value='Log In' name='submit'>
		</form>
WWF;

	}
	elseif(isset($_POST['submit']) && isset($_POST['wachtw']) && $w8w == $_POST['wachtw'])
	{
		echo <<<ADM
		Welkom admin.<br>
		Hieronder kunt u een nieuwe nieuwsbrief verzenden.<br>
		Deze maakt u in HTML, maar u hoeft geen <br> te gebruiken: dit wordt automatisch gedaan.<br><br>

		<form action="" method='post'>
			Onderwerp: <input type='text' name='onderwerp'><br><br>
			Bericht:<br>
			<textarea cols='50' rows='10' name='mail'></textarea><br><br>
			<input type='submit' name='submit' value='Verzend'>
		</form>
ADM;

	
	}
	elseif(isset($_POST['onderwerp']))
	{
		// het verzenden
		/* we hebben een bestand volgepropt met emailadressen
		deze emailadressen moeten dus van elkaar gescheiden worden
		en elk moet dezelfde mail ontvangen
		dit gaan we doen met explode() en een for-loop
		ook gaan we headers gebruiken, deze zie je hieronder
		*/
		// HTML gebruiken
		$headers = "MIME-Version: 1.0 ";
		$headers .= "Content-type: text/html; charset=iso-8859-1 ";
		// hieronder het adres waar het vandaan lijkt te komen
		$headers .= "From: Team XXXXXX <info@mijn gewijzigd emailadres.be> ";

		$adressen = file_get_contents($file);
		$adressen = explode(";", $adressen);
		for($i=0;isset($adressen[$i]);$i++)
		{
			mail($adressen[$i], stripslashes($_POST['onderwerp']), nl2br($_POST['mail']), $headers); //het mailen
		}
		echo "De nieuwsbrief is verstuurd!";
	}
}
?>


Ik vraag me af of dit script ook onder PHP 4.3 nog zou draaien.
file_get_contents() is het nieuwste in het script, na $_GET en $_POST wat uit 4.1 stamt.

Heredoc zie je ook niet echt heel vaak meer.
en stripslashes()? Waar zouden de slashes vandaan moeten komen? die magie is al heel lang geleden standaard uitgezet in PHP settings en ook al best veel jaren geleden geheel overboord gegaan.
Leuk script voor in het PHP-museum.

Reageren