1

さて、私は髪を引っ張り始めているので、助けが必要です:)

これは、ユーザーからアクティブ化された電子メールを選択し、ある種のニュースレターを送信するために使用される私のファイルです。

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 通になります。通常、1 つのメールで 1 つのニュースレターを受け取る必要があります。

また、最初のニュースレターを受信すると、件名とメッセージが含まれています。ただし、2 番目のニュースレターには「to」フィールド以外は何も含まれていません。 要約すると、このファイルはデータベース内の 1 つの電子メールにつき 2 つの電子メールを送信します。

同じ配列でテストファイルを作成しようとしましたが、これはその内容です:

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++;
}   
?>

このテスト ファイルは、通常の電子メールを送信します (1 つの電子メールにつき 1 つの電子メール)。したがって、サーバー構成は問題ないはずです。

4

1 に答える 1

6

送信コードがPOSTであることを確認するコードブロック内にないため、ページをロードするときに1回送信し、フォームに入力して送信するときに送信するようです。

if (!$errorFlag) ブロック全体を if ($_SERVER['REQUEST_METHOD'] == 'POST') ブロックに移動します。

于 2012-08-15T19:50:48.527 に答える