E-Mailversand in Schritten funktioniert nicht richtig

lordcabeer

Grünschnabel
Ich habe ein kleines script programmiert mit dem ich den Mailversand in Schritten regeln möchte.
Jedoch bekommt nur jeder zweite user eine Mail und ich weiß nicht woran es liegt :/

getconfig('mailpro') entspricht in meinem fall 2

PHP:
<?php

if(!isset($_GET['step'])) { $prostep=0; }
else { $prostep=$_GET['step']; }

$sendressis = @mysql_fetch_array(@mysql_query("SELECT * FROM newsletter WHERE mail!='' LIMIT ".($prostep*getconfig('mailpro')).",".(1+($prostep*getconfig('mailpro'))).""));
$asendressis2 = @mysql_query("SELECT * FROM newsletter WHERE mail!='' LIMIT ".(1+($prostep*getconfig('mailpro'))).",".(getconfig('mailpro')-1)."");
$countmails = @mysql_num_rows(@mysql_query("SELECT * FROM newsletter WHERE mail!=''"));
$bccmails = "";
$bccmailids = "";
while($sendressis2 = @mysql_fetch_array($asendressis2)){
$bccmails .= "Bcc: ".$sendressis2['mail']."\r\n";
$bccmailids .= $sendressis2['id'].";";
}
$mailtext2 = create(getletter($_GET['id'],'betreff'),getletter($_GET['id'],'inhalt'));

$empfaenger = $sendressis['mail']; //Mailadresse
$absender   = getconfig('owner');
$betreff    = getletter($_GET['id'],'betreff');
$antwortan  = getconfig('owner');

$header  = "MIME-Version: 1.0\r\n";
$header .= "Content-type: text/html; charset=UTF-8\r\n";

$header .= "From: Newsletter <".$absender.">\r\n";
$header .= $bccmails;
$header .= "Reply-To: $antwortan\r\n";


 if(@mail($sendressis['mail'],$betreff,$mailtext2,$header)){
 if(@mysql_query("UPDATE newsletter_archiv SET send='".getletter($_GET['id'],'send').$bccmailids."' WHERE id='".$_GET['id']."'")){
 if((ceil($countmails/getconfig('mailpro'))-1) > $prostep){
 header("Location:".getconfig('pfad_url')."process/send.php?id=".$_GET['id']."&step=".($prostep+1));
 }
 }
 }

?>
 
Wenn du den header aus Teilen zusammensetzt, dann musst du trotzdem darauf achten, dass am Ende ein sinnvoller string dabei raus kommt.
Auf den ersten Blick sehe ich, dass

Code:
$bccmails .= "Bcc: ".$sendressis2['mail']."\r\n";

ungültig ist, weil du bei mehr als einem bcc Empfänger das "Bcc:" immer wiederholst und kein Semikolon zur Trennung drin hast.
Besser

Code:
$bccmails = "Bcc: ";
while($sendressis2 = @mysql_fetch_array($asendressis2)){ 
$bccmails .= $sendressis2['mail']."; "; 
}
$bccmails .= "\r\n";

Damit hast du aber immer noch ein Problem, wenn kein Bcc Empfänger existiert.

Mein Tipp:
Wenn solche zusammerngesetzten Sachen nicht funktionieren, ersetze die mail() Funktion durch

print $header;

dann siehst du meistens selber, wo das Problem ist.
 
Zuletzt bearbeitet:
Zwei Tipps am Rande.
1) Formatiere deinen Code! es ist mühsam Klammern zu zählen um zu wissen welche Schleife/Block wo endet
2) Verhindere zu verschachtelten Code. Du wirst dir keine Freude machen bei der Problemsuche

Zum Problem das Thomasio gefunden hat. Am suabersten alle bbc in einen Array abspitzen und diesen dann mit Trennzeichen in einen String setzen
PHP:
//Array initialiseren
$bccmailsA[] = array();
//Alle Adressen zum Array hinzufügen
while($sendressis2 = @mysql_fetch_array($asendressis2)){ 
	$bccmailsA[] = $sendressis2['mail']."; "; 
}
//Die Bcc in einen String pressen falls überhaubt Bcc vorhanden sind
if(count($bccmailsA) > 0){
	$bccmails = "Bcc: " . implode('; ', $bccmailsA) . "\n\n";
}
 
E-Mailversand in Schriten funktioniert nicht richtig

Okay danke das hat funktioniert :D

So ein ähnliches Script habe ich nochmal, nur dass für jeden Empfänger eine neue Mailfunktion verwendet wird.

Hierbei wird jedoch an den letzten User (die id), bei einem weiteren Aufruf des Scripts, welches sich nach jedem Versand nochmal öffnet und an die restlichen empfänger sendet (id NOT IN (...)...), nochmal eine E-Mail gesendet... ich habe bereits das ganze Script überprüft und bin zu dem Schluss gekommen, dass das Problem bei dem Mysqlaufruf liegt (AND id NOT in (array))

Jedoch weiß ich nicht wie ich diesen Fehler beheben kann :S ich hoffe ihr könnt mir helfen ...

getletter($_GET['id'],'send') = "34;67;45;..."

PS: Bei dem Anfang und bei dem Ende des Scripts bin ich mir sicher das dort kiene Fehler vorliegen... und sorry jetzt schonmal dafür, dass das Script so ungegliedert etc. ist... ich versuche mich zu bessern (:

Geändert: Es liegt definitiv an "AND id NOT in ('".$notsendarray2."')"

PHP:
<?php
session_start();
ob_start();
require('../includes/config.inc.php');
require('../includes/functions.php');

if(!isset($_GET['id']) OR empty($_GET['id']) OR @mysql_num_rows(@mysql_query("SELECT * FROM spn_newsletter_archiv WHERE id='".$_GET['id']."'")) <= 0){ 
echo 'Fehler!';
exit;
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Send Process</title>
<link rel="stylesheet" href="<?php echo getconfig('pfad_url'); ?>css/process.css" type="text/css" />
<link rel="stylesheet" href="<?php echo getconfig('pfad_url'); ?>css/style.css" type="text/css" />

</head>
<body onLoad="window.focus();">

<div class="bordered tcenter">
<div class="pad10">
<font color="red">Dieses Fenster <b>NICHT</b> schließen!</font>
<bR><bR>
<?php
$notsendarray2 = substr(implode(',',explode(';',getletter($_GET['id'],'send'))),0,-1);
$canceled = "AND id NOT IN ('".$notsendarray2."')";
$countmails = mysql_num_rows(mysql_query("SELECT * FROM spn_newsletter".testmodus()." WHERE mail!='' $canceled"));
$countmailstw = mysql_num_rows(mysql_query("SELECT * FROM spn_newsletter".testmodus()." WHERE mail!=''"));

if($countmails<$mailprocalss){$mailprocalss = $countmails;} else {$mailprocalss = getconfig('mailpro');}

$assendressis23 = mysql_query("SELECT * FROM spn_newsletter".testmodus()." WHERE mail!='' $canceled LIMIT 0,$mailprocalss");

while($sendressis2 = mysql_fetch_array($assendressis23)){

$mailtext2 = create(getletter($_GET['id'],'betreff'),getletter($_GET['id'],'inhalt'));

$empfaenger = $sendressis2['mail']; //Mailadresse
$absender   = getconfig('owner');
$betreff    = getletter($_GET['id'],'betreff');
$antwortan  = getconfig('owner');


$header  = "MIME-Version: 1.0\r\n";
$header .= "Content-type: text/html; charset=UTF-8\r\n";

$header .= "From: Newsletter <".$absender.">\r\n";
$header .= "Reply-To: $antwortan\r\n";

mail($empfaenger,$betreff,$mailtext2,$header);
if(getconfig('testmodus') == 0){
mysql_query("UPDATE spn_newsletter_archiv SET send='".getletter($_GET['id'],'send').$sendressis2['id'].";' WHERE id='".$_GET['id']."'");
}


}
$abossendu = count(explode(';',getletter($_GET['id'],'send')))-1;
echo "Newsletter wurde an ".$abossendu." Abonnenten gesendet.";

$sekundenstep = (1000*60*getconfig('mailmin'));

 if($abossendu < $countmailstw){
 echo '<br><br>Versand wird fortgesetzt…<br><br><img src="'.getconfig("pfad_url").'/img/loading.gif">';
 ?>
<script language="JavaScript" type="text/javascript">

change2 = window.setTimeout(function () { locationchange2(); }, "<?php echo $sekundenstep; ?>");
function locationchange2(){
window.location.href = "<?php echo getconfig('pfad_url'); ?>process/send.php?id=<?php echo $_GET['id']; ?>";
}
</script>
 <?php

 }
 else { echo "<bR><br>Der Versand wurde erfolgreich beendet.<br>Das Fenster kann jetzt geschlossen werden."; }
 

?>

</div>
</div>

</body>
</html>
 
Zuletzt bearbeitet:
Habe das Problem gefunden :D

Es lag an der Zeile "AND id NOT IN ...."

Ich habe es mit dem verbessert:

PHP:
$notsendarray2 = mysql_real_escape_string(substr(implode(',',explode(';',getletter($_GET['id'],'send'))),0,-1));

$countmails = mysql_num_rows(mysql_query("SELECT * FROM spn_newsletter".testmodus()." WHERE mail!='' AND (NOT FIND_IN_SET(id,'$notsendarray2'))"));
$countmailstw = mysql_num_rows(mysql_query("SELECT * FROM spn_newsletter".testmodus()." WHERE mail!=''"));
 
Hi einen schönen Feierabend bald;-),
Angelehnt an den hier geposteten Skripten, habe ich auch mittels mercury mails verschickt. Allerdings bekomme ich bei...
PHP:
		if(count($bccmailsA) > 0){
			$bccmails = "Bcc: " . implode('; ', $bccmailsA) . "\n\n";
		}
... Die Meldung:
Notice: Array to string conversion in C:\xampp\htdocs\xampp\freizeitpark_d\mail.php on line 28.

Das is prinzipiell nicht schlimm, mittels @implode misachte ich die notice.
Allerdings ist die Ausgabe nicht:

Bcc: helldorado1@localhost; helldorado2@localhost,

sondern:
Bcc: Array; helldorado1@localhost; helldorado2@localhost

Ein Versuch das zu lösen war:
PHP:
		$lang = "0". @implode('; ', $bccmailsA).";";
		$kurz = substr($lang,7);
		
		
		if(count($bccmailsA) > 0){
			$bccmails = "Bcc:  " . $kurz . "\r\n";

Was auch die gewünschte Ausgabe liefert. Nur kommt nichts an. Mercury registriet diese beiden Bcc seltsamerweise auch als non-local obwohl ich hart im $to=helldorado1@localhost stehen habe. und die kommt an (als local erkannt). Habe ich ein php oder konfig Problem?
 
Zuletzt bearbeitet:
Zurück