【问题标题】:display error if mail function not working如果邮件功能不起作用,则显示错误
【发布时间】:2019-10-14 23:47:23
【问题描述】:

我正在构建一个电子邮件验证脚本,并且我正在使用 ajax,所以每当用户填写错误或无效的电子邮件时,将显示带有错误名称的错误栏,并且当电子邮件为真并且属于一个活动帐户,将向用户发送一封包含说明的电子邮件,错误栏显示已发送电子邮件。 问题是即使邮件功能不起作用,错误栏一直说电子邮件已发送。 所以我不想用一些行来检测是否未发送电子邮件以在错误栏中显示“未发送电子邮件”。

这是我的 php 文件:

    <?php 

include '../../app/init.php';

        /* Clean email */
    $recover_email = $_POST['recover_email'];

       /* check if email is valid */
    if(!filter_var($recover_email, FILTER_VALIDATE_EMAIL)) {

        /* email not valid */
        echo 3;

        /* Check if email exist */
    } else if(Database::exists('user_id', 'users', ['email' => $recover_email])) {


        /* Define some variables */
        $user_id            = Database::simple_get('user_id', 'users', ['email' => $recover_email]);
        $lost_password_code = md5($recover_email + microtime());

        /* Update the current activation email */
        $database->query("UPDATE `users` SET `lost_password_code` = '{$lost_password_code}' WHERE `user_id` = {$user_id}");

        /* Send the email */
        sendmail($recover_email,  $settings->contact_email, $language->lost_password->email->title, sprintf($language->lost_password->email->content, $settings->url, $recover_email, $lost_password_code));

        /* email exist */
        echo true; 

    } else if(!Database::exists('user_id', 'users', ['email' => $email])) {

        /* email not exist */
        echo false;
    }

?>

这是我的邮件功能:

function send_mail($to, $from, $title, $message) {

    $headers = "From: " . strip_tags($from) . "\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

    mail($to, $title, $message, $headers);
}

function sendmail($to, $from, $title, $message) {
    global $settings;

    if(!empty($settings->smtp_host) && !empty($settings->smtp_port) && !empty($settings->smtp_user) && !empty($settings->smtp_pass)) {

        $mail = new PHPMailer;
        $mail->isSMTP();
        $mail->SMTPDebug = 0;
        $mail->SMTPSecure = 'tls';
        $mail->SMTPAuth = true;
        $mail->isHTML(true);

        $mail->Host = gethostbyname('tls://'.$settings->smtp_host);
        $mail->Port = $settings->smtp_port;
        $mail->Username = $settings->smtp_user;
        $mail->Password = $settings->smtp_pass;

        $mail->setFrom($from, $settings->title);
        $mail->addReplyTo($from, $settings->title);
        $mail->addAddress($to);
        $mail->Subject = $title;
        $mail->Body = $message;

        if (!$mail->send()) {
            send_mail($to, $from, $title, $message);
        }

    } else {
        send_mail($to, $from, $title, $message);
    }

}

我只需要 php 文件上的一些行来将其作为 ajax 文件的响应返回

【问题讨论】:

  • 第三个if 语句中的$email 来自哪里? if...else if...else if($email)?
  • if (!$mail-&gt;send()) { // echo "could not send email "; }
  • @Anuga 第一个在 if 条件内是每当 smtp 无法发送电子邮件时,最后一个总是在 smtp 配置为空时运行
  • 好吧,你所做的就是让它在有用户时发送邮件。时期。您需要在mail() 上创建if() 声明,然后将其一直返回到您调用sendmail() 的位置并在其上使用if() 声明或$variable 以查看它是否通过。所以这条路可以缩短很多!

标签: php ajax email


【解决方案1】:

只需在 if 条件中使用 mail() 并在 if 和 else 块中打印适当的消息。它会解决问题

if(mail($to, $title, $message, $headers)){
//success message
}
else{
//error message
}

【讨论】:

    【解决方案2】:

    mail()如果邮件被成功接收,则返回 TRUE,否则返回 FALSE。所以你需要运行一个 if 语句来检查邮件是否被接受。

    <?php
    
    function send_mail($to, $from, $title, $message)
    {
    
        $headers = "From: " . strip_tags($from) . "\r\n";
        $headers .= "MIME-Version: 1.0\r\n";
        $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
    
        if (mail($to, $title, $message, $headers)) {
    
            return true;
        } else {
    
            return false;
        }
    }
    
    function sendmail($to, $from, $title, $message)
    {
        global $settings;
    
        if (!empty($settings->smtp_host) && !empty($settings->smtp_port) && !empty($settings->smtp_user) && !empty($settings->smtp_pass)) {
    
            $mail = new PHPMailer;
            $mail->isSMTP();
            $mail->SMTPDebug  = 0;
            $mail->SMTPSecure = 'tls';
            $mail->SMTPAuth   = true;
            $mail->isHTML(true);
    
            $mail->Host     = gethostbyname('tls://' . $settings->smtp_host);
            $mail->Port     = $settings->smtp_port;
            $mail->Username = $settings->smtp_user;
            $mail->Password = $settings->smtp_pass;
    
            $mail->setFrom($from, $settings->title);
            $mail->addReplyTo($from, $settings->title);
            $mail->addAddress($to);
            $mail->Subject = $title;
            $mail->Body    = $message;
    
            if (!$mail->send()) {
                if (!send_mail($to, $from, $title, $message)) {
    
                    echo "Error sending email, please try again later";
                }
            }
    
        } else {
            if (!send_mail($to, $from, $title, $message)) {
    
                echo "Error sending email, please try again later";
            }
        }
    
    }
    

    【讨论】:

    • @Anuga 你错过了这部分if (!send_mail($to, $from, $title, $message)) {
    • 不,我指的是之前调用的sendmail(),而不是send_mail()。他的第一个代码sn-p。在sendmail()之后总是echo true;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2011-04-07
    • 2012-07-12
    • 2013-11-02
    相关资源
    最近更新 更多