0

私はプロジェクトに取り組んでおり、雇用主が選ばれた従業員に電子メールを送信する機能があります。現在、これはメール機能を除いて機能しています (私は winhost を使用しており、メール機能を機能させるには Mail.php を含める必要があります) 2 通ではなく 3 通のメールを送信することもあれば、2 通ではなく 1 通のメールを送信することもあります。

コード :

if (isset($_POST['openemailmem'])){
    $memberuser = $_POST['openemailmemusername'];
    $sql = "SELECT email, username, password, status FROM csvdata WHERE memberview =:user ";
    $getinfo=$DBH->prepare($sql);
    $getinfo->execute(array(':user' => $memberuser));

    while ($row = $getinfo->fetch(PDO::FETCH_ASSOC)) {
        $check = $row;
        $newEmployeeEmail = $check['email'];
        $csvusername = $check['username'];
        $password = $check['password'];
        $status = $check['status'];

        if ($status == "Open"){
            echo "tesing";
            $from = "the email of where it is coming from is here but i removed";  
            $to = $newEmployeeEmail; 
            if (!empty($_POST['cc'])){
                $cc = $_POST['cc']; 
            }
            if (!empty($_POST['ccsend'])){
                $cc = $_POST['ccsend'];
                $to .= ", $cc";
            }
            $subject = "removed msg"; 
            $body = "removed msg"; 
            $host = "i removed"; 
            $username = "i removed"; 
            $password = "i removed"; 
            $headers = array ('From' => $from, 'To' => $to,'Cc' => $cc, 'Subject' => $subject); 
            $smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password)); 
            $mail = $smtp->send($to, $headers, $body);
        }       
    }

    header("Location: I removed this.php?getmsg=12");
    exit;

}

いつもありがとうございます!!!

4

1 に答える 1

1

あなたの解決策はおそらくあなたのログにあります。例外がスローされた場合は、そこで見つけることができます。

さらに提案:

ループの前後にロギングを追加します。したがって、あなたの例は次のようになります。

if (isset($_POST['openemailmem']))
{
    $memberuser = $_POST['openemailmemusername'];
    $sql        = "SELECT email, username, password, status "
                . "FROM csvdata WHERE memberview =:user ";
    $getinfo    = $DBH->prepare($sql);
    $getinfo->execute(array(':user' => $memberuser));

    $log_file = "/home/my/transaction.log";
    $now      = "[" . date("Ymd-His") . "] ";

    $message = $now . "Starting loop...";
    error_log($message, 3, $log_file);

    while ($row = $getinfo->fetch(PDO::FETCH_ASSOC)) 
    {

        $check            = $row;
        $newEmployeeEmail = $check['email'];
        $csvusername      = $check['username'];
        $password         = $check['password'];
        $status           = $check['status'];

        if ($status == "Open")
        {
            echo "tesing";
            $from = "the email of where it is coming from is here but i removed";  
            $to   = $newEmployeeEmail; 
            if (!empty($_POST['cc']))
            {
                $cc = $_POST['cc']; 
            }
            if (!empty($_POST['ccsend']))
            {
                $cc = $_POST['ccsend'];
                $to .= ", $cc";
            }
            $subject  = "removed msg"; 
            $body     = "removed msg"; 
            $host     = "i removed"; 
            $username = "i removed"; 
            $password = "i removed"; 
            $headers = array(
                           'From'    => $from, 
                           'To'      => $to,
                           'Cc'      => $cc, 
                           'Subject' => $subject,
                       );

            $now     = "[" . date("Ymd-His") . "] ";
            $message = $now . "Before connecting to server - " . $to;
            error_log($message, 3, $log_file);

            $smtp = Mail::factory(
                'smtp', 
                 array(
                     'host'     => $host, 
                     'auth'     => true, 
                     'username' => $username, 
                     'password' => $password,
                 )
            ); 

            $now     = "[" . date("Ymd-His") . "] ";
            $message = $now . "After connecting to server - " . $to;
            error_log($message, 3, $log_file);

            $now     = "[" . date("Ymd-His") . "] ";
            $message = $now . "Before sending email - " . $to;
            error_log($message, 3, $log_file);

            $mail = $smtp->send($to, $headers, $body);

            $now     = "[" . date("Ymd-His") . "] ";
            $message = $now . "After sending email - " . $to;
            error_log($message, 3, $log_file);
        }       
    }

    $now     = "[" . date("Ymd-His") . "] ";
    $message = $now . "End of loop";
    error_log($message, 3, $log_file);

    header("Location: I removed this.php?getmsg=12");
   exit;

}

メーラーが関連するホストに電子メールをディスパッチするのにかかる時間によっては、関数がタイムアウトする場合があります。

私がすべてのユーザーに見たものから、メールサーバーへの(潜在的に)ユニークな接続があり、それから電子メールが送信されます。何らかの理由でその接続の確立に遅延がある場合、スクリプトは非常にうまくタイムアウトする可能性があります。

上記のエラーロギング方法を調整してmicrotime、コードの各反復間のリアルタイムを確認できるようにすることができます。もちろん、コードのブロック間にさらにロギングを追加する必要があります。

メールサーバー接続などで実際に遅延が発生していることがわかった場合は、(要件で許可されている場合は)1つのサーバーに一度接続して、そこからメールを送信できます。

HTH

于 2012-09-25T21:52:29.603 に答える