Próbuję zmusić email Laravel 5 do działania


154

Próbuję wysłać wiadomość e-mail do określonego użytkownika, wpisując adres URL, ale pojawia się następujący błąd:

Swift_TransportException w linii AbstractSmtpTransport.php 383: Oczekiwano kodu odpowiedzi 250, ale otrzymano kod „530”, z komunikatem „530 5.7.1 Wymagane uwierzytelnienie

Jak dotąd próbuję tylko zmusić go do pracy z Gmailem. Jak to działa?

To, co mam do tej pory: mail.php

<?php
    return [
        'driver' => env('MAIL_DRIVER',' smtp'),
        'host' => env('MAIL_HOST', 'smtp.gmail.com'),
        'port' => env('MAIL_PORT', 587),
        'from' => ['address' =>"MyUsername@gmail.com" , 'name' => "example"],
        'encryption' => 'tls',
        'username' => env('MyUsername@gmail.com'),
        'password' => env('MyPassword'),
        'sendmail' => '/usr/sbin/sendmail -bs',
        'pretend' => false,
    ];

Oto co mam w trasach:

Route::get('test', function() {
    Mail::send('Email.test', [], function ($message) {
        $message->to('example@gmail.com', 'HisName')->subject('Welcome!');
    });
});

Oto, co mam w moim kontrolerze:

class MailController extends Controller
{
    public function Sending_Email()
    {
        $this->call('GET','Email.test');
        return View('Email.test');
    }
}

A oto, co jest w moim pliku .env:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=MyUsername@gmail.com
MAIL_PASSWORD=MyPassword

4
Użyj mailtrap.io do testowania
rzuć

Niezła wskazówka na mailtrap.io @roll
Ben Everard

Otrzymałem dokładnie ten sam błąd podczas korzystania z mailtrap.io
luisfer

Odpowiedzi:


243

Wiem, że teraz działa dla ciebie @ Vantheman6, ale to właśnie zadziałało dla mnie na wypadek, gdyby było tak samo dla kogoś innego.

Dodałem do mojego pliku .env szczegóły usługi pocztowej, z której korzystam. Więc upewnij się, że poniższe szczegóły

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=MyUsername@gmail.com
MAIL_PASSWORD=MyPassword

w pliku .env są dokładne.

UWAGA: Nie zapomnij zrestartować serwera po edycji pliku .env, aby wybrać nowe dane, które tam umieścisz.

Jeśli nie zrestartujesz serwera, plik .env nadal będzie prezentował stare dane poczty w aplikacji, mimo że zostały wprowadzone zmiany, które mogą powodować ten błąd.


59
Wow, ta „Notatka” mnie uratowała. Nie wiedziałem, że zmienne ENV są ​​buforowane podczas uruchamiania!
Gerben Jacobs

Czy mógłbyś zaktualizować odpowiedź - i zaznaczyć restart serwera zamiast pliku konfiguracyjnego?
mrwaim

2
@mrwaim, myślałem, że ponowne uruchomienie serwera jest dokładnie tym, co określiłem w notatce, chyba że nie otrzymuję tego, co sugerujesz.
Osei-Bonsu Christian

1
Sugerowałbym usunięcie wszystkiego przed "Uwaga:" - pomogła notatka, a nie rzeczy wcześniej. Jeśli chcesz zachować pozostałe części, proponuję umieścić je po notatce. 3 Ludzie głosowali za komentarzem „Notatka”, więc prawdopodobnie ta notatka też im pomogła.
mrwaim

22
Jeśli wcześniej zapisałeś konfigurację w pamięci podręcznej, php artisan config:cacheponowne uruchomienie serwera nie spowoduje odebrania zaktualizowanej konfiguracji. Spróbuj php artisan config:cachejeszcze raz
darronz

53

Konfiguracja mojego pliku .env jest taka sama dla laravel 5.1

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=example@gmail.com
MAIL_PASSWORD=****************
MAIL_ENCRYPTION=tls

Najważniejsze jest to, że utworzyłem hasło do aplikacji Gmail (16 cyfr).

Muszę ujawnić jeszcze jedną rzecz, ponieważ nie mam szczęścia w żadnej konfiguracji. Oznacza to, że za każdym razem, gdy zmieniłem plik .env, muszę uruchomić to polecenie

php artisan config:cache

I to jest najważniejsze, ponieważ bez tego polecenia laravel wykonuje poprzednie ustawienia z pamięci podręcznej. Potrzeba było ponad 10 godzin, żeby to rozgryźć.


1
Ciągle używając php artisan cache:cleargdy php artisan config:cachejest rozwiązany, co to dla mnie. Dziękuję Ci!
timgavin

4
pozytywnie przyjęty z powodu twojej notatki ophp artisan config:cache
darronz

35

Otrzymujesz błąd uwierzytelniania, ponieważ nazwa użytkownika i hasło w pliku konfiguracyjnym są nieprawidłowe.

Zmień to:

'username' => env('MyUsername@gmail.com'),
'password' => env('MyPassword'),

Do tego:

'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),

envMetoda sprawdza .env pliku. W swoim pliku .env wywołujesz je MAIL_USERNAME, więc to właśnie musisz przekazać do envmetody.

Jedna wskazówka dotycząca rozwiązywania problemów: dodaj dd(Config::get('mail'));, aby zobaczyć faktycznie wygenerowaną konfigurację . Pomoże Ci to wykryć takie problemy i dokładnie wiedzieć, jakie informacje zamierza wykorzystać Laravel. Więc możesz tymczasowo zatrzymać to na swojej trasie testowej, aby sprawdzić, co masz:

Route::get('test', function()
{
    dd(Config::get('mail'));
});

Więc zmieniłem mój plik mail.php, aby odzwierciedlał Twoje sugestie '' nazwa_użytkownika '=> env (' NAZWA_UŻYTKOWNIKA_MAILA '), `i 'password' => env('MAIL_PASSWORD'), co uważam za interesujące, ponieważ wszędzie każe mi wprowadzić swój adres e-mail i hasło. Nadal otrzymuję błąd Swift_TransportException in AbstractSmtpTransport.php line 383: Expected response code 250 but got code "530", with message "530 5.7.1 Authentication required. I'm sorry but where do i actually place the " dd(Config::get('mail'));. katalog Config zawiera dużo plików
Vantheman6

Zobacz moją zaktualizowaną odpowiedź, z przykładem, jak sprawdzić konfigurację.
jszobody

to niesamowite, wciąż otrzymuję błąd, ale faktycznie widzę, co robi. Z jakiegoś powodu próbuje przekazać `" host "=>" mailtrap.io "` do env, mimo że w mailu php mówię'host' => env('MAIL_HOST', 'smtp.gmail.com'),
Vantheman6

Sprawdź dokładnie MAIL_HOSTw swoim pliku
.env

To jest dokładne. MAIL_HOST=smtp.gmail.com Skończyło się na usunięciu całego pliku env z każdej części pliku mail.php. A teraz przechodzą prawidłowe informacje. OMG Dziękuję, że zadziałało. Jesteś mężczyzną
Vantheman6

15

problem zostanie rozwiązany poprzez wyczyszczenie pamięci podręcznej

php artisan config:cache

13

Wreszcie dotarłem! Po prostu udostępnianie, jest więcej konfiguracji niż tylko .env

To jest .env

MAIL_DRIVER=smtp

MAIL_HOST=smtp.gmail.com

MAIL_PORT=587

MAIL_USERNAME=UserName@gmail.com

MAIL_PASSWORD=********

MAIL_ENCRYPTION=tls

config / mail.php musi również wprowadzić adres i nazwę, aby działał.

'driver' => env('MAIL_DRIVER', 'smtp'),
'host' => env('MAIL_HOST', 'smtp.gmail.com'),
'port' => env('MAIL_PORT', 587),
'from' => ['address' => 'Username@gmail.com' , 'name' => 'YourName' ],
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'sendmail' => '/usr/sbin/sendmail -bs',
'pretend' => false,

11

Jeśli kiedykolwiek będziesz miał te same problemy i spróbujesz wszystkiego online, ale to nie zadziała, prawdopodobnie jest to plik pamięci podręcznej konfiguracji, który wysyła nieprawidłowe informacje. Możesz go znaleźć w bootstrap / cache / config.php. Upewnij się, że poświadczenia są tam. Zajęło mi tydzień, zanim to rozgryzłem. Mam nadzieję, że kiedyś komuś to pomoże.


Pan zasłużył na ładne Bordeaux, wielkie dzięki! Zauważyłem, że nazwa użytkownika i hasło były puste w tym pliku, mimo że wypełniłem je w dwóch odpowiednich plikach. Stamtąd wiedziałem, co robić! Merci!
Gregordy

DZIĘKUJĘ CI! Poważnie debugowałem przez godzinę bez WSKAZÓWKI, ale TO !!! TO
Ahmad Alfy,

11

Dla celów programistycznych https://mailtrap.io/ udostępnia wszystkie ustawienia, które należy dodać w pliku .env. Na przykład:

Host:   mailtrap.io
Port:   25 or 465 or 2525
Username:   cb1d1475bc6cce
Password:   7a330479c15f99
Auth:   PLAIN, LOGIN and CRAM-MD5
TLS:    Optional

W przeciwnym razie dla celów implementacji możesz pobrać poświadczenia smtp do dodania w pliku .env z poczty (np. Gmail n all)

Po dodaniu należy ponownie uruchomić serwer


Po dodaniu koniecznie zrestartuj serwer .. To zdanie rozwiązało mój problem.
Hos Mercury

8

Mnie też się to zdarza.

To dlatego, że kiedy edytujemy .envplik, musimy zrestartować serwer. Po prostu zatrzymaj prąd php artisan servei uruchom go ponownie. To na pewno zadziała.

Jeśli nadal nie działa, spróbuj php artisan config:cache


5

Dla przyszłych odniesień do osób, które tu przyjeżdżają. po uruchomieniu polecenia, które zostało podane w trzeciej odpowiedzi tutaj ( używam teraz Laravel 5.3 ).

php artisan config:cache

Możesz napotkać ten problem:

[ReflectionException]
Class view does not exist

W takim przypadku musisz dodać go ręcznie z powrotem do listy dostawców w pliku app.php. PRZEJDŹ DO: app->config->app.php->'providers[]'i dodaj go, na przykład:

Illuminate\View\ViewServiceProvider::class,

Mam nadzieję, że to komuś pomoże.


4

Miałem ten sam problem; mój MAIL_ENCRYPTIONbył tlswłączony, mail.phpale był nullw .envaktach.
Więc zmienił nullsię tlsi to zadziałało!


Tak było!
夏 期 劇場

3

Żadne z powyższych rozwiązań nie działało dla mnie na hoście lokalnym. Zezwoliłem nawet na dostęp z mniej bezpiecznych aplikacji, zezwoliłem na dostęp przez wyświetlacz odblokuj captcha i ustawiłem weryfikację peera i weryfikację nazwy partnera na false dla SSL.

Ostatecznie użyłem otwartego rozwiązania do testowania SMTP MailHog. Kroki są następujące:

  1. Pobierz najnowszą wersję MailHog dla swojego systemu operacyjnego
  2. Określ następujące ustawienia w pliku .env

MAIL_DRIVER = smtp

MAIL_HOST = 127.0.0.1

MAIL_PORT = 1025

MAIL_USERNAME = testuser

MAIL_PASSWORD = testpwd

MAIL_ENCRYPTION = null

MAIL_FROM_ADDRESS=theaddress@youwant.com

  1. Uruchom pobrany plik MailHog
  2. Wysłać email
  3. Sprawdź wysłaną wiadomość e-mail, przechodząc do localhost: 8025

3

Oznacza to po prostu, że Twój serwer nie ma dostępu do serwera SMTP.

Możesz to sprawdzić, wykonując:

telnet <smtpServer> <smtpPort>

Powinien pojawić się błąd odmowy dostępu.

Rozwiązaniem jest po prostu użycie innego serwera SMTP, do którego ma dostęp Twój serwer.


2

Powinieneś zrestartować serwer i uruchomić następujące komendy:

php artisan cache:clear
php artisan view:clear
php artisan route:clear
php artisan config:clear
php artisan config:cache

To powinno działać.


0

Jeśli wyniki z dd(Config::get('mail'));są zerowe, po prostu użyj polecenia

php artisan config:clear

0

Moja opinia po wprowadzeniu zmian w plikach .env zrestartuj serwer i ponownie uruchom aplikację. Aby mieć pewność co do rzeczywistego błędu. Rzemieślnik php czyści i buforuje później działa całkiem dobrze.


-1

Miałem ten sam problem, co ty, po prostu go uruchomiłem.

Po pierwsze, musisz dwukrotnie sprawdzić, czy ustawienia .env są poprawnie skonfigurowane. Oto moje ustawienia:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=yourusername
MAIL_PASSWORD=yourpassword
MAIL_ENCRYPTION=tls

Upewnij się, że Twoje hasło nie znajduje się w cudzysłowie :).

A w config / mail.php zawiera następujące elementy, bez komentarzy.

<?php

return [

'driver' => 'smtp',
'host' => env('MAIL_HOST', 'smtp.gmail.com'),
'port' => env('MAIL_PORT', '587'),
'from' => ['address' => 'yourusername', 'name' => 'yourname'],
'encryption' => env('MAIL_ENCRYPTION','tls'),
'username' => env('MAIL_USERNAME', 'username@gmail.com'),
'password' => env('MAIL_PASSWORD', 'password'),
'sendmail' => '/usr/sbin/sendmail -bs',

'pretend' => false,

];

Mam nadzieję, że to działa dla Ciebie :)


-1

W moim przypadku: Zrestartuj serwer i uruchom php artisan config:clearpolecenie.


-2
  1. Idź do Mailgun
  2. Kliknij opcję Autoryzowani odbiorcy
  3. Dodaj adres e-mail, na który chcesz wysłać wiadomość.
  4. Sprawdź wiadomość wysłaną na pocztę.
  5. Brawo! ... Jesteś gotowy.

2
Proszę, wybacz moją ignorancję. W jaki sposób powyższa odpowiedź rozwiązuje problemy z pocztą elektroniczną Laravel5 w pytaniu?
jww
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.