關於 php 執行寄送電子郵件超時的問題

Arthur1977 发布于 2014/05/25 18:27
阅读 252
收藏 1
你好,我的 php 中有一段是需要寄送 email 給公司的客戶名單中的電子郵件信箱。

但是因為這些客戶名單的電子郵件信箱是用人工輸入,輸入的人經常會將email信箱的網域輸入錯誤,
於是在 php 中寄送信件到這些網域錯誤的信箱的時候就會出現以下錯誤訊息:

"maximum execution time of 30 seconds exceeded"

這時候就算多少客戶信箱沒寄送,程式都會中止了;接下來又要人工去查是那些 email 的網域錯誤。

這個問題沒辦法用 try..catch 來解決,程式還是會出現一樣的錯誤訊息。
也不能把 set_time_limit() 設定成 0 來解決 ,這樣程式就會一直卡在這一筆錯誤的信箱。

曾經試過先用 php 確認網域是否有效,但是找不到相關的函式可用。


我是用 PhpMailer 來寄信的。

php 的版本是 Php 5。


有人知道該如何解決嗎?

感謝回覆。

加载中
0
blindcat
blindcat
贴代码吧,一般出错信息应该不会影响程序继续运行的。
0
南湖船老大
南湖船老大

这有何难,简单的要死。写个函数去连接其SMTP服务器检查下不就OK了。

<?php
/**
 * 判断邮件发送时填写的相关用户名和密码是否正确
 * @param array $data
 * @return boolean
 */
function isEmailRight($host,$user,$pwd,$port=25) {
    $user = base64_encode($user);
    $pwd = base64_encode($pwd);
    $sock = fsockopen($host, $port, $errno, $errstr, 6);
    if (!$sock) {
//        echo '无法创建socket';
        return false;
    }
    $response = fgets($sock);
    if (strstr($response, "220") === false) {
//        echo '邮件服务器错误';
        return false;
    }
    $doCommand=function ($sock, $cmd, $return_code){
    fwrite($sock, $cmd);
    $response = fgets($sock);
    if (strstr($response, "$return_code") === false) {
        //echo $response, PHP_EOL;
        return false;
    }
    return true;  
    };
    $ret1 = $doCommand($sock, "HELO smtp.qq.com\r\n", 250);
    $ret2 = $doCommand($sock, "AUTH LOGIN\r\n", 334);
    $ret3 = $doCommand($sock, $user . "\r\n", 334);
    $ret4 = $doCommand($sock, $pwd . "\r\n", 235);
    return $ret1 && $ret2 && $ret3 && $ret4;
}
//自行修改账号测试
var_dump(isEmailRight('smtp.qq.com','zw99hello','123'));

    上面的代码是我用来判断系统设置中写的邮箱设置是否正确的。如果只是判断域名,那就十分简单了(怎么完善你懂的)。还有更简单的,一个checkdnsrr函数就能满足基本要求。

   我一猜你就是用for循环来实现一个一个发的,其实你需要的是gearman这类异步队列。。。

  我还发现很多人不懂Email,Email的收件人可以是多个啊。。。要是发内容一样的邮件,在收件人那填上所有的Email不就得了(实际上,应该是抄送人,理由不细说)

返回顶部
顶部