无法在 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)
我想提一下,
- 在服务器中启用了 intl 扩展。
- 我正在使用 cPanel。
- 它在 Codeigniter 3 上运行良好。
- 邮件功能在我的服务器中使用行方法,如下所示:
$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。哪个太旧了。
将其更新到最新版本对我有用。
我刚刚挂断电话发送服务器邮件。
我正在准备这样的电子邮件发送代码:
$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)
我想提一下,
- 在服务器中启用了 intl 扩展。
- 我正在使用 cPanel。
- 它在 Codeigniter 3 上运行良好。
- 邮件功能在我的服务器中使用行方法,如下所示:
$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。哪个太旧了。
将其更新到最新版本对我有用。