logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] PHPMailer fatal error formularz wysyłający maile z załącznikami

kecajs 14 Lut 2021 20:40 609 10
REKLAMA
  • #1 19256711
    kecajs
    Poziom 17  
    Posty: 433
    Ocena: 35
    Cześć,

    tworzę formularz wysyłający maila wraz z załącznikiem wykorzystując PHPMailer.
    PHPMailer jest wrzucony na serwer, a po próbie wysłania wiadomości pojawia się komunikat: Fatal error: Uncaught Error: Class 'PHPMailer' not found in /home/klient.dhosting.pl/moja-domena/public_html/mail.php:25 Stack trace: #0 {main} thrown in /home/klient.dhosting.pl/moja-domena/public_html/mail.php on line 25.
    Oto zawartość pliku wysyłającego, czyli mail.php.
    Kod: PHP
    Zaloguj się, aby zobaczyć kod

    Od dwóch dni przekopuję się przez informacje o instalacji, konfiguracji PHPMailer, a teraz odnośnie zadziałania tej biblioteki. Nie trafiłem na żaden tutorial krok-po-kroku dla nowicjuszy (a takim jestem), dlatego będę wdzięczny za wskazówki i podpowiedzi, co muszę zmienić, aby wszystko zadziałało, także wysyłąnie plików jako załączniki.
    Dodam, że folder PHPMailer jest w folderze głównym na stronie, czyli tam, gdzie plik mailer.php.
    Jacek
  • REKLAMA
  • #2 19256720
    cysiekw
    Poziom 42  
    Posty: 5429
    Pomógł: 1002
    Ocena: 1408
    kecajs napisał:
    Error: Class 'PHPMailer' not found
    Temu się przyjrzyj dokładniej.
  • REKLAMA
  • #3 19256744
    kecajs
    Poziom 17  
    Posty: 433
    Ocena: 35
    A gdzie tego szukać?
    Mam folder PHPMailer o takiej strukturze:
    * Foldery:
    .git
    .github
    .phan
    docs
    examples
    language
    src
    test

    * Pliki:
    .gitattributes
    .gitignore
    changelog.md
    COMMITMENT
    composer.json
    get_oauth_token.php
    LICENSE
    phpcs.xml.dist
    phpdocs.dist.xml
    phpunit.xml.dist
    README.md
    SECURITY.md
    UPGRADING.md
    VERSION
    gdzie mam szukać tej klasy?
  • REKLAMA
  • Pomocny post
    #4 19256759
    Sam Sung
    Poziom 33  
    Posty: 2010
    Pomógł: 227
    Ocena: 582
    Nie używałem PHPMailera, ale może zobacz "Simple Example" na stronie https://github.com/PHPMailer/PHPMailer
    Może powinieneś dodać sobie takie linie?
    Kod: PHP
    Zaloguj się, aby zobaczyć kod

    Istotne może też być to, której wersji PHP i PHPMailera używasz...
  • #5 19256812
    kecajs
    Poziom 17  
    Posty: 433
    Ocena: 35
    Dodałem te 3 linie. Teraz mam taki komunikat:
    Fatal error: Uncaught PHPMailer\PHPMailer\Exception: Could not access file: in /home/klient.dhosting.pl/moja-domena.pl/public_html/PHPMailer/src/PHPMailer.php:3018 Stack trace: #0 /home/klient.dhosting.pl/moja-domena.pl/public_html/mail.php(46): PHPMailer\PHPMailer\PHPMailer->addAttachment(NULL, NULL) #1 {main} thrown in /home/klient.dhosting.pl/moja-domena.pl/public_html/PHPMailer/src/PHPMailer.php on line 3018.

    Nawet nie wiem, jak sprawdzić wersję PHPMailera. Jest gdzieś instrukcja po polsku jak zainstalować i skonfigurować tego nieszczęsnego PHPMailera? Z funkcją mail() nie było takich jazd.
  • Pomocny post
    #6 19256827
    Sam Sung
    Poziom 33  
    Posty: 2010
    Pomógł: 227
    Ocena: 582
    No teraz to już jest Twój błąd. addAttachment dostał NULLe. Czyli formularz nie przesłał plików, a Twój skrypt nie sprawdza tego i na ślepo woła addAttachement.
  • #7 19256840
    kecajs
    Poziom 17  
    Posty: 433
    Ocena: 35
    A jak to poprawić? Przekopałem się przez kilkanaście stron z przykładami, ale większość, na jaką trafiłem dotyczyła tylko wysyłania poczty, a jedynie 2-3 wspominała o załączniku.
  • REKLAMA
  • Pomocny post
    #8 19256911
    Sam Sung
    Poziom 33  
    Posty: 2010
    Pomógł: 227
    Ocena: 582
    Zdecydować, czy mail musi zawierać załączniki, czy nie musi, i albo przerobić formularz (którego kodu tutaj nie zamieściłeś), żeby nie dało się go wysłać nie wybrawszy pliku, albo tutaj dodać logikę, która będzie pomijać wywoływanie addAttachement, jeśli user nie wgrał pliku.

    Manual (https://www.php.net/manual/en/features.file-upload.post-method.php) zaleca użycie funkcji is_uploaded_file dla bezpieczeństwa, i akurat by się to mogło przydać. Czyli może coś takiego:
    Kod: PHP
    Zaloguj się, aby zobaczyć kod
  • #9 19256941
    kecajs
    Poziom 17  
    Posty: 433
    Ocena: 35
    Oto kod formularza:
    Kod: HTML, XML
    Zaloguj się, aby zobaczyć kod


    tyle odnośnie kodu formularza. Załącznik nie jest obowiązkowy do wysłania maila. Obowiązkowe mają być imię, mail i treść.

    Dodano po 47 [minuty]:

    Udało się, jeszcze brakowało Body.
    Ale nie przesyła załącznika.
    A jak chcę przesłać wszystkie informacje z formularza, to muszę te pola zawrzeć w Body, nieprawdaż? A jak mogę umieścić tam wszystkie wartości zmiennych? Przykładowo tak:
    Kod: HTML, XML
    Zaloguj się, aby zobaczyć kod

    A jest szansa jakoś rozwinąć maila, podobnie jak było w funkcji mail(), tj. że w mailu mam coś takiego:
    Nasz klient: $klient;
    Adres e-mail: $mail;
    Imię: $imie;
    Nazwa firmy: $firma;
    Numer telefonu: $telefon;
    Treść wiadomości: $tresc;
    Załącznik: ($file_tmp, $file);
    Czy tak to można zrobić, czy inaczej? Wszystko w Body?
  • #10 19257684
    kecajs
    Poziom 17  
    Posty: 433
    Ocena: 35
    Poprawiłem w taki sposób:
    Kod: PHP
    Zaloguj się, aby zobaczyć kod

    Wszystko przechodzi ładnie, ale bez dołączonego załącznika. Próbowałem go przesłać jako część Body:
    Kod: PHP
    Zaloguj się, aby zobaczyć kod

    , ale bez powodzenia. Będę wdzięczny za tę ostatnią przysługę i wskazanie mi, jak przesłać załącznik.

    Dodano po 2 [godziny] 6 [minuty]:

    OK, działa.
    Temat zamykam.

    Brakowało w formularzu czegoś takiego: enctype="multipart/form-data".
    Cały kod pliku kontakt.php wygląda tak:
    Kod: HTML, XML
    Zaloguj się, aby zobaczyć kod
  • #11 19257984
    kecajs
    Poziom 17  
    Posty: 433
    Ocena: 35
    Poprawiłem w taki sposób:
    Kod: PHP
    Zaloguj się, aby zobaczyć kod

    Wszystko przechodzi ładnie, ale bez dołączonego załącznika. Próbowałem go przesłać jako część Body:
    Kod: PHP
    Zaloguj się, aby zobaczyć kod

    , ale bez powodzenia. Będę wdzięczny za tę ostatnią przysługę i wskazanie mi, jak przesłać załącznik.

    Dodano po 2 [godziny] 6 [minuty]:

    OK, działa.
    Temat zamykam.

    Brakowało w formularzu czegoś takiego: enctype="multipart/form-data".
    Cały kod pliku kontakt.php wygląda tak:
    Kod: HTML, XML
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

✨ Użytkownik napotkał błąd "Fatal error: Uncaught Error: Class 'PHPMailer' not found" podczas próby wysłania wiadomości e-mail z załącznikiem za pomocą biblioteki PHPMailer. Po dodaniu odpowiednich przestrzeni nazw, pojawił się nowy błąd związany z brakiem dostępu do pliku w funkcji addAttachment. Użytkownik został poinstruowany, aby sprawdzić, czy plik został poprawnie przesłany przed wywołaniem addAttachment, co można osiągnąć poprzez użycie funkcji is_uploaded_file. Wskazano również na konieczność przemyślenia logiki formularza, aby nie wymuszać załączania pliku, jeśli nie został wybrany.
Wygenerowane przez model językowy.
REKLAMA