Ошибка phpmailer "Не удалось создать экземпляр почтовой функции"

Я использую mail() базовый пример слегка изменен для моего идентификатора пользователя, и я получаю сообщение об ошибке "Ошибка почтовой программы: не удалось создать экземпляр почтовой функции"

если я использую функцию почты -

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!";
    }
?>

18 ответов

Попробуйте использовать 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';

Ваш код выглядит хорошо, вы забыли установить PostFix на свой сервер?

sudo apt-get install postfix

У меня это сработало;)

ура

Это сработало для меня

$mail->SetFrom("from@domain.co","my name", 0); //notice the third parameter
$mail->AddAddress($address, "her name");

следует изменить на

$mail->AddAddress($address);

Это сработало для моего случая..

Если вы отправляете файловые вложения, и ваш код работает для небольших вложений, но не подходит для больших вложений:

Если вы получаете сообщение об ошибке "Не удалось создать почтовую функцию", когда вы пытаетесь отправить большие электронные письма, и ваш журнал ошибок PHP содержит сообщение "Невозможно отправить сообщение: слишком большой", то ваш агент пересылки почты (sendmail, postfix, exim и т. Д.) отказывается доставлять эти письма.

Решение состоит в том, чтобы настроить адаптер MTA, чтобы разрешить вложения большего размера. Но это не всегда возможно. The alternate solution is to use SMTP. You will need access to a SMTP server (and login credentials if your SMTP server requires authentication):

$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 defaults to using PHP mail() function which uses settings from php.ini which normally defaults to use sendmail (or something similar). In the above example we override the default behavior.

Вы должны убедиться, что ваш адрес отправителя является действительной настройкой учетной записи электронной почты на этом сервере.

Справочные документы PHPMailer по этой конкретной ошибке помогли мне выбрать правильный путь.

Мы обнаружили, что php.ini не определил sendmail_path, поэтому я добавил это с sendmail_path = /usr/sbin/sendmail -t -i;

В моем случае проблема была связана с ограничением размера вложения. Проверка и увеличение лимита размера почты у меня работали.

Кажется, в моем случае это был просто отказ сервера. Пожалуйста, проверьте доступность подключения к вашему почтовому серверу.

У меня была эта проблема, и после некоторой отладки и поиска я понял, что у СЕРВЕРА (Godaddy) могут быть проблемы.

Я рекомендую вам обратиться к вашему провайдеру веб-хостинга и поговорить с ним о Quota Restrictions на функцию mail (они делают это, чтобы люди не делали спам-ботов или массовых рассылок (спам)).

Они могут сообщить вам о своих пределах, и если вы их превысите. Вы также можете обновить лимит, перейдя на частный сервер.

После разговора с GoDaddy в течение 15 минут техническая поддержка смогла решить эту проблему в течение 20 минут.

Это очень помогло мне, и я хотел поделиться им, чтобы, если кто-то еще сталкивался с этим, он мог попробовать этот метод, если все не удалось, или до того, как он попробует что-нибудь еще.

Старая тема, но она может помочь кому-то вроде меня. Я решил проблему, установив для SMTP-сервера допустимое значение в PHP.ini.

У меня тоже была эта проблема. Моим решением было отключить selinux. Я попытался разрешить 2 различные настройки http в selinux (что-то вроде httpd_allow_email и http_can_connect), и это не сработало, поэтому я просто полностью отключил его, и он начал работать.

У меня была эта проблема при отправке файлов с региональными символами в их именах, таких как: VęryRęgióńął file - name.pdf,

Решением было очистить имя файла, прежде чем прикреплять его к электронному письму.

Многие люди часто упускают из виду лучший/правильный способ вызвать phpmailer и поместить их:

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

или что-то вроде этого из установки композитора:

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

вверху страницы перед вызовом или включением чего-либо еще. Это вызывает у большинства людей ошибку «Не удалось создать экземпляр почтовой функции».

Лучшее решение: поместить всю обработку почты в другой файл, чтобы сделать его максимально чистым. И всегда используйте SMTP. Если это не работает, проверьте свой DNS, разрешено ли вам отправлять почту.

Проверьте, включен ли sendmail, в основном, если ваш сервер предоставлен другой компанией.

Для чего это стоит, у меня была эта проблема, и мне пришлось зайти в cPanel, где я увидел сообщение об ошибке

"Внимание! Пожалуйста, зарегистрируйте свои идентификаторы электронной почты, используемые в письмах не-smtp, через плагин cpanel. Незарегистрированные идентификаторы электронной почты не будут разрешены в письмах не-smtp, отправляемых через скрипты. Перейдите в раздел" Почта "и найдите плагин"Registered Mail IDs"в теме paper_lantern."

Регистрация писем в cPanel (регистрация почтовых идентификаторов) и ожидание 10 минут заставили меня работать.

Надеюсь, что это помогает кому-то.

Моя конфигурация: IIS + php7.4

У меня была та же проблема, что и у @Salman-A, когда маленькие вложения отправлялись по электронной почте, но большие вызывали ошибку на странице. Я увеличил лимит файлов и вложений в php.ini, но это не имело значения.

Затем я нашел конфигурацию в IIS(6.0) и увеличил там ограничения на файлы.

Также вот мой 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();}

Надеюсь, это кому-то поможет в будущем.

Нам необходимо изменить значения 'SMTP' в файле php.ini. Файл php.ini находится в

EasyPHP-DevServer-14.1VC11\binaries\php\php_runningversion\php.ini
Другие вопросы по тегам