为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
汪汪一只猫 2023-04-28 15:59:56
我只是挂断电话发送服务器电子邮件。我正在准备这样的电子邮件发送代码:$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 -0500From: "Sender name" <test@mysite.com>Return-Path: <test@mysite.com>Reply-To: <test@mysite.com>User-Agent: CodeIgniterX-Sender: test@mysite.comX-Mailer: CodeIgniterX-Priority: 3 (Normal)Message-ID: <5ed8cb3ba9e500.94682473@mysite.com>Mime-Version: 1.0Content-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.65790334Content-Type: text/plain; charset=UTF-8Content-Transfer-Encoding: 8bitHello--B_ALT_5ed8cb3ba9e702.65790334Content-Type: text/html; charset=UTF-8Content-Transfer-Encoding: quoted-printableHello--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)我想提一下,国际扩展在服务器中启用。我正在使用控制面板。它在 Codeigniter 3 上运行良好。邮件功能在我的服务器中使用 row 方法,如下所示:$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);请帮忙。提前致谢。
查看完整描述

4 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

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



查看完整回答
反对 回复 2023-04-28
?
千巷猫影

TA贡献1829条经验 获得超7个赞

在我的例子中,从phpinfo() > intl > ICU 版本4.6 。哪个太旧了。

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



查看完整回答
反对 回复 2023-04-28
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

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

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

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


查看完整回答
反对 回复 2023-04-28
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

我今天遇到了这个,很惊讶地看到图书馆开箱即用。似乎是 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;

    }

}

然后让服务返回你的子类App/Config/Services.php:


public static function email(bool $getShared=TRUE){

    return $getShared ? static::getSharedInstance('email') : new \App\Libraries\Email();

}


查看完整回答
反对 回复 2023-04-28
  • 4 回答
  • 0 关注
  • 455 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信