无法在 CodeIgniter 4 中发送服务器电子邮件

Can't send server emails in CodeIgniter 4

我刚刚挂断电话发送服务器邮件。

我正在准备这样的电子邮件发送代码:

$email_config = Array(
    'charset' => 'utf-8',
    'mailType' => 'html'
);

$email = \Config\Services::email();
$email->initialize($email_config);

$email->setNewline("\r\n");
$email->setCRLF("\r\n");
$email->setFrom("test@mysite.com", "Sender name");

$email->setTo("receiver@gmail.com");
$email->setSubject("Test message");
$email->setMessage("Hello");

if ($email->send()) {
    echo "Email sent!";
} else {
    echo $email->printDebugger();
    return false;
}

显示此错误消息:

Unable to send email using PHP mail(). Your server might not be configured to send mail using this method.
Date: Thu, 4 Jun 2020 05:21:47 -0500
From: "Sender name" <test@mysite.com>
Return-Path: <test@mysite.com>
Reply-To: <test@mysite.com>
User-Agent: CodeIgniter
X-Sender: test@mysite.com
X-Mailer: CodeIgniter
X-Priority: 3 (Normal)
Message-ID: <5ed8cb3ba9e500.94682473@mysite.com>
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="B_ALT_5ed8cb3ba9e702.65790334"
=?UTF-8?Q?Test=20message?=
This is a multi-part message in MIME format.
Your email application may not support this format.

--B_ALT_5ed8cb3ba9e702.65790334
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Hello


--B_ALT_5ed8cb3ba9e702.65790334
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hello

--B_ALT_5ed8cb3ba9e702.65790334--

并在错误日志中给出错误:

Email: sendWithMail throwed Use of undefined constant INTL_IDNA_VARIANT_UTS46 - assumed 'INTL_IDNA_VARIANT_UTS46' (this will throw an Error in a future version of PHP)

我想提一下,

  1. 在服务器中启用了 intl 扩展。
  2. 我正在使用 cPanel。
  3. 它在 Codeigniter 3 上运行良好。
  4. 邮件功能在我的服务器中使用行方法,如下所示:
$to = 'receiver@gmail.com';
$subject = 'Test message';
$message = 'Hello';
$headers = 'From: test@mysite.com' . "\r\n" .
        'Reply-To: test@mysite.com' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);

请帮忙。

提前致谢。

您需要在服务器上设置 MTA(邮件传输代理)。

例如:Postfix 或 exim,在某些情况下 nullmailer 可以解决问题

也许您可以连接到提供商的 SMTP 中继

codeigniter 提供替代类型(Mail、Sendmail 和 SMTP)检查您的 cpanel 外发电子邮件配置或要求您的提供商检查 php 的 mail() 配置

我运行今天进入这个,惊讶地看到这个库开箱失败。似乎是 CI 的电子邮件库中的问题:

/**
     * Validate email for shell
     *
     * Applies stricter, shell-safe validation to email addresses.
     * Introduced to prevent RCE via sendmail's -f option.
     *
     * @see     https://github.com/codeigniter4/CodeIgniter/issues/4963
     * @see     https://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9ab36
     * @license https://creativecommons.org/publicdomain/zero/1.0/    CC0 1.0, Public Domain
     *
     * Credits for the base concept go to Paul Buonopane <paul@namepros.com>
     *
     * @param string $email
     *
     * @return boolean
     */
    protected function validateEmailForShell(&$email)
    {
        if (function_exists('idn_to_ascii') && $atpos = strpos($email, '@'))
        {
            $email = static::substr($email, 0, ++$atpos)
                . idn_to_ascii(static::substr($email, $atpos), 0, INTL_IDNA_VARIANT_UTS46);
            
        }

        return (filter_var($email, FILTER_VALIDATE_EMAIL) === $email && preg_match('#\A[a-z0-9._+-]+@[a-z0-9.-]{1,253}\z#i', $email));
    }

我没有时间研究此方法的全部内容(已经浪费了几个小时!),但能够绕过它并成功发送电子邮件。 创建 App/Libraries/Email.php 以覆盖有问题的方法:

<?php namespace App\Libraries;

class Email extends \CodeIgniter\Email\Email{
    protected function validateEmailForShell(&$email){
        return TRUE;
    }
}

然后将服务 return 作为您在 App/Config/Services.php 中的子类:

public static function email(bool $getShared=TRUE){
    return $getShared ? static::getSharedInstance('email') : new \App\Libraries\Email();
}

从 CI 论坛获得解决方案。

来自 phpinfo() > intl > ICU version 在我的例子中是 4.6。哪个太旧了。

将其更新到最新版本对我有用。