4 回答
TA贡献2065条经验 获得超14个赞
codeigniter 提供替代类型(Mail、Sendmail 和 SMTP)检查您的 cpanel 外发电子邮件配置或要求您的提供商检查 php 的 mail() 配置
TA贡献1887条经验 获得超5个赞
您需要在您的服务器上设置 MTA(邮件传输代理)。
例如:Postfix 或 exim,在某些情况下 nullmailer 可以解决问题
可能您可以连接到提供商的 SMTP 中继
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();
}
- 4 回答
- 0 关注
- 455 浏览
添加回答
举报