好吧,我开始拉头发,我需要一些帮助:)
这是我的文件,用于从用户中选择已激活的电子邮件,并向他们发送某种新闻稿。
newsletter.php的内容
<?php
//Include configuration file
include 'config/config.php';
$pdo = new PDO("mysql:host=localhost;dbname=$db", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//Define messages
//Error messages
define('ERROR_MESSAGE_SUBJECT', 'Enter subject');
define('ERROR_MESSAGE_CONTENT', 'Enter some content');
//Define variables
$errorFlag = false;
$to = array();
//Grab variables
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$newsletterSubject = check_input($_POST['newsletterSubject']);
$newsletterContent = $_POST['newsletterContent'];
if(!$newsletterSubject) {
$errorSubject = ERROR_MESSAGE_SUBJECT;
$errorFlag = true;
}
if(!$newsletterContent) {
$errorContent = ERROR_MESSAGE_CONTENT;
$errorFlag = true;
}
}
?>
<form action="newsletter.php" method="post">
<label>Naslov newsletter-a: <?php echo '<span class="error">'.$errorSubject.'</span>';?></label>
<input type="text" class="linput rounded" name="newsletterSubject">
<label>Sadržaj newsletter-a: <?php echo '<span class="error">'.$errorContent.'</span>';?></label>
<textarea name="newsletterContent" class="rounded"></textarea><br>
<input type="submit" class="submit button rounded" name="newsletterSend" value="Pošalji newsletter korisnicima">
</form>
<?php
if (!$errorFlag) {
echo '
<div class="heading">
<h1>Sending statistic</h1>
</div>';
$query = $pdo->prepare('SELECT email FROM users WHERE active=:active');
$query->bindValue(':active', '1');
$query->execute();
$query->setFetchMode(PDO::FETCH_ASSOC);
$i=1;
while($row = $query->fetch()) {
$to[] = $row['email'];
}
print_r($to);
if(!empty($to)) {
foreach($to as $mail) {
$headers = "From: " . $fromEmail . "\r\n";
$headers .= "Reply-To: ". $fromEmail . "\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$message = '<html><body>';
$message .= $newsletterContent;
$message .= '</body></html>';
mail($mail, $newsletterSubject, $message, $headers);
$i++;
}
}
}
?>
从数据库中选择活动电子邮件后,数组$ to包含:
Array ( [0] => somemail1@domain.com [1] => somemail2@domain.com )
这是正确的,但这两封电子邮件都会收到2封电子邮件,总共有4封。通常,一封电子邮件应该收到一份简报。
还有一些奇怪的东西,当收到第一份简报时,它包含主题和信息。但是,第二通讯除了'to'字段外不包含任何内容。 总而言之,此文件会在数据库中为每封电子邮件发送两封电子邮件。
我尝试使用相同的数组创建测试文件,这是它的内容:
test.php的
<?php
$fromEmail = 'from@mydomain.com';
$to = array('somemail1@domain.com', 'somemail2@domain.com');
print_r($to);
foreach($to as $mail) {
$headers = "From: " . $fromEmail . "\r\n";
$headers .= "Reply-To: ". $fromEmail . "\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$message = '<html><body>';
$message .= $newsletterContent;
$message .= '</body></html>';
mail($mail, $newsletterSubject, $message, $headers);
$i++;
}
?>
此测试文件发送普通电子邮件 - 每封电子邮件一封电子邮件。所以服务器配置应该没问题。
答案 0 :(得分:6)
看起来好像是因为你的发送代码不在代码块中,它检查它是POST,所以它在你加载页面时发送一次,当你填写表单并提交时再发送一次。
将整个if(!$ errorFlag)块移动到if($ _SERVER ['REQUEST_METHOD'] =='POST')块中。