Фатална грешка: Класът „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
@iori Опитайте: 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. Има и директория, наречена „език“, която трябва да се намира на същото ниво като 3-те файла, които току-що споменах. Тази директория съдържа няколко дузини 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
Няма „PHPMailerAutoload.php“ в github.com/PHPMailer/PHPMailer/tree/master /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 kaydedilmek sureti ile guncellenebilir. */ require_once('вашата папка/PHPMailer.php'); //Създаване на нов екземпляр на PHPMailer $mail = нов 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; find 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 само с моя малък принос.

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

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

b) (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
то също така унищожава вашето съществуващо auto_loading, унищожава нуждата ви да разбирате кода, създава ОГРОМНО раздуване на проекта, (виждал съм 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 composer е PSR-0/4 мениджър на зависимости, точно като yum, apt-get или npm. Вие възкликвате, че композиторът причинява подуване, но не уточнявате как и не предоставяте източници в подкрепа на твърдението. Раздуването предполага, че композиторът кара приложенията да работят по-бавно или да използват повече памет, което е невярно. Докато библиотеките могат да изискват ненужни зависимости. Поради това се изисква надлежна проверка при използване на ВСЯКА библиотека на трета страна, със или без композитор. Имате право на мнение, но композиторът е широко известен и използван инструмент. Ако беше така, както твърдите, разработчиците нямаше да го използват в своите проекти. - 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