48

我正在使用mail()对我的用户 ID 稍作修改的基本示例,我收到错误“邮件程序错误:无法实例化邮件功能”

如果我使用邮件功能 -

mail($to, $subject, $message, $headers);

它工作正常,虽然我在发送 html 时遇到问题,这就是我尝试 PHPMailer 的原因。

这是代码:

<?php
require_once('../class.phpmailer.php');

    $mail             = new PHPMailer(); // defaults to using php "mail()"
    $body             = file_get_contents('contents.html');
    $body             = eregi_replace("[\]",'',$body);
        print ($body ); // to verify that I got the html
    $mail->AddReplyTo("reply@domain.com","my name");
    $mail->SetFrom('from@domain.com', 'my name');
    $address = "to@domain.com";
    $mail->AddAddress($address, "her name");
    $mail->Subject    = "PHPMailer Test Subject via mail(), basic";
    $mail->AltBody    = "To view the message, please use an HTML compatible email viewer!";
    $mail->MsgHTML($body);
    $mail->AddAttachment("images/phpmailer.gif");      // attachment
    $mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

    if(!$mail->Send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
    } else {
        echo "Message sent!";
    }
?>
4

18 回答 18

33

尝试使用SMTP发送电子邮件:-

$mail->IsSMTP();
$mail->Host = "smtp.example.com";

// optional
// used only when SMTP requires authentication  
$mail->SMTPAuth = true;
$mail->Username = 'smtp_username';
$mail->Password = 'smtp_password';
于 2011-08-22T08:55:29.263 回答
18

您的代码看起来不错,您是否忘记在服务器上安装 PostFix?

sudo apt-get install postfix

它对我有用;)

干杯

于 2018-02-06T13:22:53.000 回答
14
$mail->AddAddress($address, "her name");

应该改为

$mail->AddAddress($address);

这适用于我的情况..

于 2011-08-31T12:09:07.120 回答
13

这对我有用

$mail->SetFrom("from@domain.co","my name", 0); //notice the third parameter
于 2016-02-27T20:52:09.133 回答
12

您需要确保您的发件人地址是该服务器上的有效电子邮件帐户设置。

于 2010-06-19T07:31:15.000 回答
11

如果您要发送文件附件并且您的代码适用于小附件,但对于大附件则失败:

如果您在尝试发送大型电子邮件时收到错误“无法实例化邮件功能”错误,并且您的 PHP 错误日志包含消息“无法发送消息:太大”,那么您的邮件传输代理(sendmail、postfix、exim 等)拒绝发送这些电子邮件。

解决方案是配置 MTA 以允许更大的附件。但这并不总是可能的。另一种解决方案是使用 SMTP。您将需要访问 SMTP 服务器(如果您的 SMTP 服务器需要身份验证,则需要登录凭据):

$mail             = new PHPMailer();
$mail->IsSMTP();                           // telling the class to use SMTP
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Host       = "mail.yourdomain.com"; // set the SMTP server
$mail->Port       = 26;                    // set the SMTP port
$mail->Username   = "yourname@yourdomain"; // SMTP account username
$mail->Password   = "yourpassword";        // SMTP account password

PHPMailer 默认使用 PHPmail()函数,该函数使用php.ini通常默认使用 sendmail(或类似的东西)的设置。在上面的示例中,我们覆盖了默认行为。

于 2015-08-26T21:15:35.380 回答
4

关于这个特定错误的 PHPMailer 帮助文档帮助我走上了正确的道路。

我们发现 php.ini 没有定义 sendmail_path,所以我添加了sendmail_path = /usr/sbin/sendmail -t -i;

于 2017-05-04T01:24:28.953 回答
2

就我而言,是附件大小限制导致了问题。检查并增加为我工作的邮件的大小限制。

于 2018-10-31T17:59:39.293 回答
1

我遇到了这个问题,在进行了一些调试和搜索后,我意识到服务器(Godaddy)可能有问题。

我建议您联系您的网络托管服务提供商并与他们讨论Quota Restrictions邮件功能(他们这样做是为了防止人们使用垃圾邮件机器人或群发电子邮件(垃圾邮件))。

他们可能会告诉您他们的限制,以及您是否超出了限制。您也可以通过转到私人服务器来升级限制。

在与 GoDaddy 交谈 15 分钟后,技术支持能够在 20 分钟内解决此问题。

这对我有很大帮助,我想分享它,所以如果其他人遇到这个问题,如果一切都失败了,或者在他们尝试其他任何方法之前,他们可以尝试这种方法。

于 2017-01-21T07:47:19.620 回答
1

在我看来,这只是服务器拒绝。请检查您的邮件服务器日志/ smtp 连接可访问性。

于 2016-11-10T10:32:16.060 回答
0

我也有这个问题。我的解决方案是禁用 selinux。我尝试在 selinux 中允许 2 个不同的 http 设置(例如 httpd_allow_email 和 http_can_connect),但没有成功,所以我完全禁用了它并开始工作。

于 2014-12-30T19:53:05.600 回答
0

一个旧线程,但它可能会帮助像我这样的人。我通过在 PHP.ini 中将 SMTP 服务器值设置为合法值解决了这个问题

于 2013-06-06T00:38:00.243 回答
0

检查是否启用了 sendmail,主要是如果您的服务器是由另一家公司提供的。

于 2017-10-05T13:43:16.160 回答
0

我的配置:IIS + php7.4

我遇到了与@Salman-A 相同的问题,通过电子邮件发送小附件但大附件导致页面出错。我在 php.ini 中增加了文件和附件的限制,但这并没有什么区别。

然后我在 IIS(6.0) 中找到了一个配置,并在那里增加了文件限制。 iis 配置图像

这也是我的mail.php:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require '../_PHPMailer-master/src/Exception.php';
require '../_PHPMailer-master/src/PHPMailer.php';

try{
    $email = new PHPMailer(true);
    $email->SetFrom('internal@email.com', 'optional name');
    $email->isHTML(true);
    $email->Subject   = 'my subject';
    $email->Body      = $emailContent;
    $email->AddAddress( $eml_to );  
    $email->AddAttachment( $file_to_attach );
    $email->Send();
  }catch(phpmailerException $e){echo $e->errorMessage();}

我希望这对将来的某人有所帮助。

于 2020-09-08T14:39:12.220 回答
0

我在发送名称中包含区域字符的文件时遇到了这个问题,例如:VęryRęgióńął file - name.pdf.

解决方案是在将文件名附加到电子邮件之前清除文件名。

于 2016-08-20T19:20:11.750 回答
0

对于它的价值,我遇到了这个问题,不得不进入 cPanel,在那里我看到了错误消息

“注意!请通过 cpanel 插件注册您在非 smtp 邮件中使用的电子邮件 ID。通过脚本发送的非 smtp 电子邮件中不允许使用未注册的电子邮件 ID。转到邮件部分,在 paper_lantern 主题中找到“已注册的邮件 ID”插件。 "

在 cPanel(注册邮件 ID)中注册电子邮件并等待 10 分钟让我的工作。

希望对某人有所帮助。

于 2018-06-21T10:19:49.697 回答
0

很多人经常忽略调用 phpmailer 并放置这些的最佳/正确方法:

require_once('../class.phpmailer.php');

或者,来自作曲家安装的类似内容:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require_once "../../vendor/autoload.php";

在调用或包含其他任何内容之前,在页面的顶部。这会导致大多数人出现“无法实例化邮件功能”的错误。

最佳解决方案:将所有邮件处理放在不同的文件中,以使其尽可能干净。并且始终使用 SMTP。如果这不起作用,请检查您的 DNS 是否允许发送邮件。

于 2021-12-24T22:20:23.670 回答
-3

我们需要更改 php.ini 文件中 'SMTP' 的值 php.ini 文件位于

EasyPHP-DevServer-14.1VC11\binaries\php\php_runningversion\php.ini
于 2014-10-24T05:48:21.617 回答