致命错误:在 PHP 中调用未定义的函数 imap_open()

Posted

技术标签:

【中文标题】致命错误:在 PHP 中调用未定义的函数 imap_open()【英文标题】:Fatal error: Call to undefined function imap_open() in PHP 【发布时间】:2012-03-28 02:35:18 【问题描述】:

我正在尝试通过本地主机访问我的 gmail 帐户。但是,我收到了回复:

致命错误:调用未定义的函数 imap_open()

这是我的代码:

$hostname = 'imap.gmail.com:993/imap/sslINBOX';
$username = 'myid@gmail.com';
$password = 'mypassword';

/* try to connect */
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' .imap_last_error());

【问题讨论】:

【参考方案1】:

很简单,在您的 php 安装中没有激活 IMAP 扩展。不是enabled by default。如果您的本地安装在 Windows 上运行 XAMPP,您必须按照XAMPP FAQ 中的说明启用它:

PHP 的 IMAP 支持在哪里?

默认情况下,XAMPP 中禁用了对 PHP 的 IMAP 支持,因为 一些家庭出现了一些神秘的初始化错误 Windows 98 等版本。谁使用 NT 系统,可以打开该文件 "\xampp\php\php.ini" 通过删除激活 php 扩展 在";extension=php_imap.dll" 行开始分号。应该: extension=php_imap.dll

现在重新启动 Apache,IMAP 应该可以工作了。您可以使用相同的步骤 对于每个扩展,默认情况下未启用 配置。

【讨论】:

按照您的说明进行操作,但仍然出现错误 致命错误:调用未定义的函数 imap_open() in @SunilBhawsar 确保 PHP 编译时支持 IMAP,并且它是内置的,或者扩展文件在扩展目录中可用。请务必检查错误日志。 警告:imap_header(): Bad message number in.. 未能检索到标头........之后你能帮我把它缩短 你能检查一下[这个]需要帮助(***.com/questions/39745784/…)【参考方案2】:

如果您使用的是 linux,请编辑 /etc/php/php.ini(或者您必须在 /etc/php5/cli/conf.d 中创建一个新的扩展导入文件)文件,以便添加 imap 共享对象文件,然后,重启apache服务器。取消注释

;extension=imap.so

让它变成这样:

extension=imap.so

然后,通过

重启apache
# /etc/rc.d/httpd restart

【讨论】:

【参考方案3】:

安装过程总是相同的,但包管理器和包名称会有所不同,具体取决于使用的发行版、版本和/或存储库。一般来说,步骤是:

a) 首先,需要提升用户权限,可以通过命令susudo 获得。

b) 然后可以使用包管理器安装缺少的 PHP 模块。

c) 之后,需要重新启动apache2 HTTP 守护进程来加载模块。

d) 最后,可以运行php -m | grep imap 来查看PHP 模块现在是否可用。

Ubuntu 上可以使用 apt-get 安装 APTphp5-imap(或 php-imap):

apt-get install php5-imap
service apache2 restart

Debian 上,可以安装 APT 软件包 php5-imap aptitude(或 apt-get):

aptitude install php5-imap
apache2ctl graceful

CentOSFedora 上,RPM 软件包 php-imap 可以与 yum 一起安装(提示:软件包名称可能与 @987654341 类似@ 或php71w-imap,当使用Webtatic repo):

yum install php-imap
service httpd restart

systemd 系统上,使用systemd units 时,重启单元httpd.service 的命令是:

systemctl restart httpd.service

上述解决方案有问题,当模块已经被引用时:

/etc/php5/apache2/php.ini

它可能会抛出:

PHP Warning:  Module 'imap' already loaded in Unknown on line 0

会发生这种情况,因为它在默认的 php.ini 文件中被引用(至少在 Ubuntu 12.04 上)并且 PHP 模块最多只能被引用一次。建议使用INI sn-ps 加载模块,同时正在扫描目录/etc/php5/conf.d/(该路径也可能不同)以查找INI 文件:

/etc/php5/conf.d/imap.ini

Ubuntu 还具有用于管理 PHP 模块的专有命令,在重新启动网络服务器之前执行:

php5enmod imap
php5dismod imap

一旦IMAP 模块被加载到服务器中,PHP IMAP Functions 应该就可以使用了;最佳实践可能是,在尝试使用模块之前检查模块是否已加载

【讨论】:

在 Ubuntu 上,除了安装软件包之外,我还必须执行“php5enmod imap”! - 见下面@pramod kadam 的分析器 @mattanja 它取决于conf.d/imap.ini 是否存在并被解析,而php5enmod 是一个特定于Ubuntu 的命令,它基本上除了创建该文件之外什么都不做——而@987654358 @删除它。根据您的建议更新了答案。 明白了。只是说,现在答案更完整了,谢谢! (在 Ubuntu 的描述中提供正确的信息可能会为某人节省几秒钟;) 对于 PHP7 它是 apt-get install php-imap (Ubuntu)【参考方案4】:

如果是安装了php 5.3的centos。

sudo yum install php53-imap

然后重启 apache

sudo /sbin/service httpd restart

sudo service apache2 restart

【讨论】:

可以省略输入 /sbin - 因为该路径通常包含在 root 的 $PATH 环境中。只需检查 /root/.bashrc 一次 - 你就会看到给出的内容。【参考方案5】:

echo get_cfg_var('cfg_file_path');

你可以找出这个 php 实例使用了哪个 php.ini。

【讨论】:

【参考方案6】:

在 Ubuntu 中安装 imap 使用

sudo apt-get install php-imap

Ubuntu 14.04及以上使用

sudo apt-get install php5-imap

PHP默认不启用imap,所以使用这个命令来启用imap扩展

sudo php5enmod imap

然后重启你的 Apache

sudo service apache2 restart

【讨论】:

+1 这是我的情况:或者您可以转到 /etc/php5/apache2/conf.d 并执行 ln -s ../../mods-available/imap.ini 。 /20-imap.ini php5enmod 线上的电话很好,不在其他答案中,但在我这样做之前它对我不起作用。 关于 Ubuntu 14.04+ 上的 php.net/manual/en/imap.setup.php 应该是 sudo apt-get install php5-imap (not php-imap) sudo php5enmod imap 要为 php7 启用 imap,您可以简单地运行“sudo phpenmod imap”【参考方案7】:

在从 Ubuntu 12.04 迁移到 14.04 期间,我也偶然发现了这一点,并想分享从 Ubuntu 14.04 LTS 开始,IMAP 扩展似乎不再默认加载。

检查是否安装了扩展:

dpkg -l | grep php5-imap

应该给出这样的回应:

ii  php5-imap       5.4.6-0ubuntu5   amd64        IMAP module for php5

如果没有,请安装它。

真正启用扩展

cd /etc/php5/apache2/conf.d
ln -s ../../mods-available/imap.ini 20-imap.ini
service apache2 restart

应该为 apache 修复它。对于 CLI,在 /etc/php5/cli/conf.d 中执行相同操作

【讨论】:

【参考方案8】:

在带有 Homebrew 的 Mac OS X 上,很明显,由于提供的错误我们无法运行,PHP 已经安装:

更新:最新版本brew instal php --with-imap 将不再工作!!!

$ brew install php72 --with-imap
Warning: homebrew/php/php72 7.2.xxx is already installed

另外,只安装模块,这里是行不通的:

$ brew install php72-imap
Error: No available formula with the name "php72-imap"

所以,我们必须重新安装它:

$ brew reinstall php72 --with-imap

这需要一段时间 :-)(内置 8 分 17 秒)

【讨论】:

【参考方案9】:

带有 nginx 和 PHP-FPM 7 的 Ubuntu 使用这个:

sudo apt-get install php-imap

服务php7.0-fpm重启 服务 ngnix 重启

检查模块是否已安装 php -m | grep imap

模块 imap 的配置将在 cli php.ini 和 fpm php.ini 中自动启用

纳米 /etc/php/7.0/cli/conf.d/20-imap.ini 纳米 /etc/php/7.0/fpm/conf.d/20-imap.ini

【讨论】:

【参考方案10】:

如果您的本地安装在 Windows 上运行 XAMPP,那就足够了: 您可以通过删除“;extension=php_imap.dll”行的开头分号来打开文件“\xampp\php\php.ini”以激活 php 扩展。应该是:

;extension=php_imap.dll

extension=php_imap.dll

【讨论】:

【参考方案11】:

在 Ubuntu 16.04 上的 PHP 7.0.32 上安装 IMAP。转到给定的链接并根据您的区域选择链接。就我而言,我从亚洲部分选择一个链接。然后将下载一个文件。只需点击文件安装 IMAP 。然后重启 apache

https://packages.ubuntu.com/xenial/all/php-imap/download.

检查是否安装了 IMAP 检查 phpinfo 文件。如果安装成功 将显示 IMAP c-Client 版本 2007f。

【讨论】:

【参考方案12】:

对于 Xampp 7.3.9

PHP.ini 913 行:

;extension=imap

您应该删除分号。

【讨论】:

【参考方案13】:

我有同样的问题。在 php.ini 文件中更改分号后,我解决了我的问题。让我们看看你怎么解决它?

首先,打开 php.ini 文件。 xampp/php/php.ini

搜索 extension=imap

删除扩展名前的分号并保存此文件。

删除分号之前的代码;extension=imap

去掉分号后的代码extension=imap

最后,打开 XAMPP 控制面板并重新启动 Apache。

【讨论】:

这个用于windows 10

以上是关于致命错误:在 PHP 中调用未定义的函数 imap_open()的主要内容,如果未能解决你的问题,请参考以下文章

PHP 致命错误:调用未定义的函数 imagecreatefrompng()

致命错误:在第 2 行的 index.php 中调用未定义函数 get_header()

致命错误:调用未定义的函数 imagewebp() [关闭]

PHP 致命错误:仅在 Eclipse 中调用未定义函数 json_decode()

致命错误:在 Windows 中调用未定义的函数 mb_detect_encoding()

PHP 致命错误:未捕获的错误:在 PHP 7.2.13 上调用未定义函数 idn_to_ascii()