Неустранимая ошибка: класс «PHPMailer» не найден

  • Я пытался :include_once('C:\Inetpub\wwwroot\php\PHPMailer\PHPMailerAutoload.php');

Неустранимая ошибка: класс «PHPMailer» не найден в C:\Inetpub\wwwroot\php\index.php в строке 151.

Я помещаю PHPMailerAutoload.php в тот же каталог, что и мой скрипт.

Может кто-то помочь мне с этим ?


person iori    schedule 06.03.2015    source источник
comment
Где находится ваш файл PHPMailerAutoload.php? Также вы включаете этот код, который вы показываете здесь, в другой файл?   -  person Rizier123    schedule 06.03.2015
comment
здесь `C:\Inetpub\wwwroot\php` тот же путь, что и мой index.php   -  person iori    schedule 06.03.2015
comment
основываясь только на его имени, похоже, что файл PHPMailerAutoload.php пытается найти фактический файл класса для PHPMailer и не может этого сделать. Я бы посмотрел в этот файл, чтобы увидеть, где он пытается искать, и убедиться, что фактический файл класса существует в одном из этих мест.   -  person Drew    schedule 06.03.2015
comment
@ Rizier123: Должен ли я тогда это сделать? require_once('C:\Inetpub\wwwroot\php\PHPMailerAutoload.php');   -  person iori    schedule 06.03.2015
comment
@иори Попробуйте: reuqire_once(__DIR__ . "/PHPMailerAutoload.php");   -  person Rizier123    schedule 06.03.2015
comment
Я использую этот класс в своих проектах и ​​просто включаю фактический файл класса, include_once('phpmailer/class.phpmailer.php');   -  person Drew    schedule 06.03.2015
comment
@ Rizier123: у меня такая же ошибка.   -  person iori    schedule 06.03.2015
comment
@Drew: я дам тебе знать.   -  person iori    schedule 06.03.2015
comment
@iori Вы включаете код, который вы нам здесь показываете, в другой файл?   -  person Rizier123    schedule 06.03.2015
comment
Да. Я размещаю их в нижней части моего index.php.   -  person iori    schedule 06.03.2015
comment
Итак, какой файл вы показываете нам здесь? И как вы включаете его в index.php?   -  person Rizier123    schedule 06.03.2015
comment
В одном каталоге должны находиться три файла: class.phpmailer.php, class.pop3.php и class.smtp.php. Существует также каталог под названием «язык», который должен находиться на том же уровне, что и три файла, которые я только что упомянул. Этот каталог содержит пару десятков файлов php для разных языков, и на самом деле нужны только те, которые нужны для используемого вами языка.   -  person Drew    schedule 06.03.2015
comment
О, я вижу. Я думал, что мне нужен только 1 файл. Это я мог заставить это работать. Спасибо. Я работаю над этим сейчас.   -  person iori    schedule 06.03.2015
comment
@Drew: После перемещения всей папки PHPMaier в тот же каталог, что и мой файл php, и включения его вот так include_once('\PHPMailer\PHPMailerAutoload.php'); я думаю, что теперь это работает. :D Спасибо чувак   -  person iori    schedule 06.03.2015
comment
Это не какая-то большая тайна — все это описано в файле readme, так что вам действительно не нужно было спрашивать!   -  person Synchro    schedule 06.03.2015
comment
Вы должны добавить свое решение в качестве ответа и пометить его как решенное.   -  person EmilCataranciuc    schedule 08.04.2018
comment
Отвечает ли это на ваш вопрос? Отправка электронной почты с помощью PHP с SMTP-сервера   -  person Abu Shoeb    schedule 07.06.2020
comment
В github.com/PHPMailer/PHPMailer/tree/master нет "PHPMailerAutoload.php". /src Что я упустил?   -  person Luther    schedule 24.06.2020


Ответы (12)


все ответы устарели. Самая последняя версия (по состоянию на февраль 2018 г.) больше не имеет автозагрузки, и PHPMailer следует инициализировать следующим образом:

<?php

  require("/home/site/libs/PHPMailer-master/src/PHPMailer.php");
  require("/home/site/libs/PHPMailer-master/src/SMTP.php");

    $mail = new PHPMailer\PHPMailer\PHPMailer();
    $mail->IsSMTP(); // enable SMTP

    $mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
    $mail->SMTPAuth = true; // authentication enabled
    $mail->SMTPSecure = 'ssl'; // secure transfer enabled REQUIRED for Gmail
    $mail->Host = "smtp.gmail.com";
    $mail->Port = 465; // or 587
    $mail->IsHTML(true);
    $mail->Username = "xxxxxx";
    $mail->Password = "xxxx";
    $mail->SetFrom("[email protected]");
    $mail->Subject = "Test";
    $mail->Body = "hello";
    $mail->AddAddress("[email protected]");

     if(!$mail->Send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
     } else {
        echo "Message has been sent";
     }
?>
person avs099    schedule 05.03.2018
comment
Есть ли дополнительные требования? Этот фрагмент не работает для меня с 6.0.5 ---> Неустранимая ошибка: класс «PHPMailer\PHPMailer\Exception» не найден в PHPMailer.php в строке 1411. PHPStorm также предупреждает о необработанных исключениях. - person aProgger; 13.04.2018
comment
@aProgger использует вместо этого следующее github.com/PHPMailer/PHPMailer/blob/master/UPGRADING .md / использовать PHPMailer\PHPMailer\PHPMailer; использовать PHPMailer\PHPMailer\Exception; / get_sendmail PHPMailer.php istenildigi zaman uzerine kaydedilmeksureti ile guncellenebilir. */ require_once('ваша папка/PHPMailer.php'); //Создаем новый экземпляр PHPMailer $mail = new PHPMailer; - person Deniz Porsuk; 17.04.2018
comment
это действительно работает, хитрость заключается в том, чтобы указать фактический путь к файлам или папкам, т.е. начиная с дома/сайта/пути - person kinsley kajiva; 09.09.2018
comment
require("/home/site/libs/PHPMailer-master/src/Exception.php"); должно быть первой строкой - person Mr Heelis; 23.11.2018
comment
Попробуйте использовать дополнительную косую черту перед пространством имен, например $mail = new \PHPMailer\PHPMailer\PHPMailer(); для последней версии. - person Akeel ahamed; 02.11.2019
comment
rason # 99 ненавидеть объектно-ориентированный подход и использовать дерьмо с пространством имен - person user889030; 23.09.2020
comment
Работает отлично..! Спасибо. - person Keyur Chavda-kc1994; 21.06.2021

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

1. Убедитесь, что у вас установлена ​​php_openssl.dll (иначе найдите ее в Интернете и установите);

2. Перейдите к вашему php.ini; найти extension=php_openssl.dll включить его/раскомментировать

3. Перейдите на github и загрузите последнюю версию: 6.0 на данный момент.

4. Извлеките основную копию по пути, который лучше подходит для вас (я рекомендую тот же каталог, что и вызывающий файл).

Теперь скопируйте этот код в свой foo-mailer.php и обработайте его с аутентификацией gmail stmp.

    require("/PHPMailer-master/src/PHPMailer.php");
    require("/PHPMailer-master/src/SMTP.php");
    require("/PHPMailer-master/src/Exception.php");


    $mail = new PHPMailer\PHPMailer\PHPMailer();
    $mail->IsSMTP(); 

    $mail->CharSet="UTF-8";
    $mail->Host = "smtp.gmail.com";
    $mail->SMTPDebug = 1; 
    $mail->Port = 465 ; //465 or 587

     $mail->SMTPSecure = 'ssl';  
    $mail->SMTPAuth = true; 
    $mail->IsHTML(true);

    //Authentication
    $mail->Username = "[email protected]";
    $mail->Password = "*******";

    //Set Params
    $mail->SetFrom("[email protected]");
    $mail->AddAddress("[email protected]");
    $mail->Subject = "Test";
    $mail->Body = "hello";


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

Отказ от ответственности: Первоначальный владелец приведенного выше кода - avs099 с моим небольшим вкладом.

Обратите внимание на дополнительные:

а) (PHPMailer\PHPMailer) пространство имен: необходимо для разрешения конфликта имен.

б) (require("/PHPMailer-master/src/Exception.php");): он отсутствовал в коде avs099, поэтому возникла проблема, с которой столкнулся aProgger, вам нужна эта строка, чтобы сообщить классу почтовой программы, где находится класс Exception. .

person RickShaw    schedule 25.04.2018

Не похоже, что все файлы, необходимые для использования этого класса, присутствуют. Я бы начал сначала:

  1. Загрузите пакет с https://github.com/PHPMailer/PHPMailer, нажав кнопку "Загрузить ZIP" кнопку в правом нижнем углу страницы.
  2. распаковать zip-файл
  3. загрузите языковую папку, class.phpmailer.php, class.pop3.php, class.smtp.php и PHPMailerAutoload.php в один и тот же каталог на вашем сервере. Мне нравится создавать на сервере каталог с именем phpmailer, чтобы разместить все из них в.
  4. Включите класс в свой проект PHP: require_once('phpmailer/PHPMailerAutoload.php');
person Drew    schedule 06.03.2015
comment
Я включаю его вот такinclude_once('\PHPMailer\PHPMailerAutoload.php'); , и он тоже работает. - person iori; 06.03.2015
comment
Просто чтобы объяснить мое редактирование. Начиная с 5.2.9 (текущий выпуск), PHPMailer не пытается загрузить класс SMTP или автозагрузчик, поэтому, если вы загружаете только класс PHPMailer и пытаетесь отправить с помощью isSMTP, он сломается. Эта конфигурация позволяет ему хорошо работать с такими вещами, как композитор, и упрощает работу с вашими собственными подклассами, поскольку больше не навязывает жесткой зависимости. - person Synchro; 06.03.2015

Это просто пространство имен. Посмотрите на примеры для справки - вам нужно либо использовать класс с пространством имен, либо ссылаться на него абсолютно, например:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

//Load composer's autoloader
require 'vendor/autoload.php';
person Harshi Srivastava    schedule 04.12.2017
comment
Это не дает ответа на вопрос. Вы можете выполнить поиск похожих вопросов или обратиться к связанным и связанным вопросам в правой части страницы, чтобы найти ответ. Если у вас есть похожий, но другой вопрос, задайте новый вопрос и включите ссылку на этот вопрос, чтобы обеспечить контекст. См.: Задавайте вопросы, получайте ответы, не отвлекайтесь - person Filnor; 04.12.2017

Я предлагаю вам изучить получение composer. https://getcomposer.org Composer значительно упрощает получение сторонних библиотек и использование единого автозагрузчика для всех из них. Он также стандартизирует расположение всех ваших зависимостей, а также некоторые возможности автоматизации.

Загрузите https://getcomposer.org/composer.phar на C:\Inetpub\wwwroot\php

Удалите свой каталог C:\Inetpub\wwwroot\php\PHPMailer\.

Используйте composer.phar, чтобы получить пакет phpmailer, используя командную строку для выполнения

cd C:\Inetpub\wwwroot\php
php composer.phar require phpmailer/phpmailer

После завершения он создаст каталог C:\Inetpub\wwwroot\php\vendor вместе со всеми файлами phpmailer и сгенерирует автозагрузчик.

Затем в ваш основной файл конфигурации проекта вам нужно включить файл автозагрузки.

require_once 'C:\Inetpub\wwwroot\php\vendor\autoload.php';

vendor\autoload.php будет содержать информацию, которую вы можете использовать $mail = new \PHPMailer;

Дополнительную информацию о пакете PHPMailer можно найти по адресу https://packagist.org/packages/phpmailer/phpmailer

person Will B.    schedule 06.03.2015
comment
он также разрушает вашу существующую автозагрузку, уничтожает вашу потребность понимать код, производит ОГРОМНОЕ раздувание проекта (я видел в 900 раз слишком большие проекты), инфантизирует ваше понимание истинной структуры сервера, невероятно несовместим с любой ранее существовавшей архитектурой. этот PHPMailer.php php является прекрасным примером - вам нужны три небольших класса php, не все такие раздутые.. - избегайте композитора - person Mr Heelis; 23.11.2018
comment
@mrheelis, хотя ваши утверждения могут быть правдой при определенных обстоятельствах. Избегание менеджера зависимостей не является практическим советом. При этом вы рискуете другими аспектами, такими как уязвимости в системе безопасности, неполучение исправлений неисправных функций или не включение зависимостей для используемой вами библиотеки. Тем не менее, ваш комментарий в целом очень самоуверен и субъективен в зависимости от ваших личных предпочтений, а не основан на реальных фактах. В этом случае композитор предоставит автозагрузчик и включит только необходимый PHPMailer. - person Will B.; 23.11.2018
comment
это не мнение, зависимости не враг - они есть на всех серверах, не говоря уже о программных платформах - и вы не избавитесь от них с помощью композитора вы скроете, что вы их используете (большая разница) гораздо лучше документировать то, что вы установили - вместо пакетов, просто говорящих скачать здесь, используйте эти 3 файла и включите эти зависимости, есть куча наворотов.. не сложно предоставить организованные материалы для обмена. я не знаю, почему люди предпочитают не делать этого.. правда композитор (как и многие плохие идеи) мессианский в своем контроле.. это стержень для вашей спины, а не друг - person Mr Heelis; 23.11.2018
comment
Композитор @MrHeelis — это менеджер зависимостей PSR-0/4, как и yum, apt-get или npm. Вы восклицаете, что композитор вызывает раздувание, но не уточняете, как и не предоставляете источники, подтверждающие это утверждение. Раздувание подразумевает, что композитор заставляет приложения работать медленнее или использовать больше памяти, что не соответствует действительности. В то время как библиотеки могут требовать ненужных зависимостей. Таким образом, при использовании ЛЮБОЙ сторонней библиотеки требуется тщательная проверка, с композитором или без него. Вы имеете право на свое мнение, но composer — это широко известный и используемый инструмент. Если бы это было так, как вы утверждаете, разработчики не использовали бы это в своих проектах. - person Will B.; 26.11.2018

У меня была такая же проблема, за исключением небольшой разницы, версии PHPMailer 6.0, от хорошего друга avs099. Я знаю, что новая версия PHPMailer с февраля 2018 года не поддерживает автозагрузку, и у меня была серьезная проблема с созданием экземпляров библиотек с пространство имен в MVC, код оставляю для тех, кому он нужен.

//Controller
    protected function getLibraryWNS($libreria) {
    $rutaLibreria = ROOT . 'libs' . DS . $libreria . '.php';

    if(is_readable($rutaLibreria)){
        require_once $rutaLibreria;
        echo $rutaLibreria . '<br/>';
    }
    else{
        throw new Exception('Error de libreria');
    }
}

//loginController
    public function enviarEmail($email, $nombre, $asunto, $cuerpo){
    //Import the PHPMailer class into the global namespace
            $this->getLibraryWNS('PHPMailer');
            $this->getLibraryWNS('SMTP');
    //Create a new PHPMailer instance
            $mail = new \PHPMailer\PHPMailer\PHPMailer();
    //Tell PHPMailer to use SMTP
            $mail->isSMTP();
    //Enable SMTP debugging
    //      $mail->SMTPDebug = 0;                                       // 0 = off (for production use),  1 = client messages, 2 = client and server messages  Godaddy POR CONFIRMAR
            $mail->SMTPDebug = 1;                                       // debugging: 1 = errors and messages, 2 = messages only
    //Whether to use SMTP authentication
            $mail->SMTPAuth = true;                                     // authentication enabled
    //Set the encryption system to use - ssl (deprecated) or tls
            $mail->SMTPSecure = 'ssl';                                  //Seguridad Correo Gmail
    //Set the hostname of the mail server
            $mail->Host = "smtp.gmail.com";                             //Host Correo Gmail
    //Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
            $mail->Port = 465;      //587;
    //Verifica si el servidor acepta envios en HTML
            $mail->IsHTML(true);
    //Username to use for SMTP authentication - use full email address for gmail
            $mail->Username = '[email protected]';
    //Password to use for SMTP authentication
            $mail->Password = 'tucontraseña';
    //Set who the message is to be sent from
            $mail->setFrom('[email protected]','Creador de Páginas Web');
            $mail->Subject = $asunto;
            $mail->Body = $cuerpo;
    //Set who the message is to be sent to
            $mail->addAddress($email, $nombre);
    //Send the message, check for errors
    if(!$mail->Send()) {
        echo "Mailer Error: " . $mail->ErrorInfo;
        return false;
    } else {
        echo "Message has been sent";
        return true;
    }
person Edgard Hinostroza    schedule 11.07.2018

Начиная с версии 2021-07 и PHPMailer 6.5.0, без композитора вам необходимо выполнять включения в следующем порядке:

$rdir = str_replace("\\", "/", __DIR__);                    //Root Dir
require $rdir.'/PHPMailer/src/Exception.php';
require $rdir.'/PHPMailer/src/PHPMailer.php';
require $rdir.'/PHPMailer/src/SMTP.php';

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

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

Остальной код работает так, как ожидалось.

$mail = new PHPMailer(true);

try {
//Server settings
$mail->SMTPDebug = SMTP::DEBUG_SERVER;                      //Enable verbose debug output
$mail->isSMTP();                                            //Send using SMTP
$mail->Host       = 'smtp.yourserver.com';                  //Set the SMTP server to send through
$mail->SMTPAuth   = true;                                   //Enable SMTP authentication
$mail->Username   = '[email protected]';                 //SMTP username
$mail->Password   = 'password';                             //SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;            //Enable implicit TLS encryption
$mail->Port       = 465;                                    //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`

//Recipients
$mail->setFrom('[email protected]');
$mail->addAddress('[email protected]', 'Joe User');          //Add a recipient
$mail->addAddress('[email protected]', 'Joe Doe');           //Name is optional
$mail->addAddress('[email protected]', 'Optional Name');     //Name is optional
$mail->addReplyTo('[email protected]', 'Information');
$mail->addCC('[email protected]');
$mail->addBCC('[email protected]');

//Attachments
$mail->addAttachment('/var/tmp/file.tar.gz');               //Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');          //Optional name

//Content
$mail->isHTML(true);                                        //Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
person GTodorov    schedule 15.07.2021

Просто прочитав то, что вы написали, вам нужно будет также добавить файл class.phpmailer.php в свой каталог.

person Calvin K    schedule 06.03.2015

PHPMailerAutoload должен находиться в той же папке, что и class.phpmailer.php

Это код PHPMailerAutoload, который я предполагаю:

 $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
person Leandro Papasidero    schedule 06.03.2015

Just download composer and install phpMailler autoloader.php

https://github.com/PHPMailer/PHPMailer/blob/master/composer.json

once composer is loaded use below code:

    require_once("phpMailer/class.phpmailer.php");
    require_once("phpMailer/PHPMailerAutoload.php");

    $mail = new PHPMailer(true); 
            $mail->SMTPDebug = true;
            $mail->SMTPSecure = "tls";
            $mail->SMTPAuth   = true;
            $mail->Username   = 'youremail id';
            $mail->Password   = 'youremail password';
            $mail_from        = "youremail id";
            $subject          = "Your Subject";
            $body             = "email body";
            $mail_to          = "receiver_email";
            $mail->IsSMTP(); 
            try {
                  $mail->Host= "smtp.your.com";
                  $mail->Port = "Your SMTP Port No";// ssl port :465, 
                  $mail->Debugoutput = 'html';
                  $mail->AddAddress($mail_to, "receiver_name");
                  $mail->SetFrom($mail_from,'AmpleChat Team'); 
                  $mail->Subject = $subject;
                  $mail->MsgHTML($body);
                  $mail->Send();
                 $emailreturn = 200;
                } catch (phpmailerException $e) {
                  $emailreturn = $e->errorMessage();             
                } catch (Exception $e) {
                 $emailreturn = $e->getMessage();
                }
    echo $emailreturn;

Надеюсь, это сработает.

person Deepak Singh    schedule 09.04.2018

Я решил ошибку, скопировав файлы class.phpmailer.php , class.smtp.php в папку, где находится файл PHPMailerAutoload.php, конечно, там должен быть файл, который мы будем использовать для отправки электронной почты.

person Wiiklats    schedule 02.01.2020

У меня было несколько подобных ошибок. Убедитесь, что ваш адрес электронной почты setFrom действителен в $mail->setFrom().

person Sanjoy    schedule 14.04.2018