Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [inny]Laravel - wysyłanie kodu aktywacyjnego a następnie wlogowanie do Panelu, jak wykonać funkcje Mail ?
casperii
post 23.05.2019, 19:38:35
Post #1





Grupa: Zarejestrowani
Postów: 584
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


Panowie nie bardzo wiem lub nie bardzo rozumiem , zasadę tworzenia szablonów by móc skorzystać z funkcji Mail , w czystym php'ie wystarczyło dołączyć klasę phpmailer i na tym temat się kończył.

Chciałbym wykonać schemat rejestracji dwu etapowej, tzn. user się rejestruje , Ja wysyłam do niego wiadomość z kodem, w tym czasie rejestracja się przeładowuje np na strona/activate z polem do wpisania kodu oraz przyciskiem "wyślij ponownie kod" , następnie po wklepaniu poprawnego kodu wylogowuje się do panelu administracyjnego.


Mój obecny kod RegisterController.php

  1. <?php
  2.  
  3. namespace App\Http\Controllers\Auth;
  4.  
  5. use DateTime;
  6. use Request;
  7. use App\{User,Role};
  8. use App\Http\Controllers\Controller;
  9. use Illuminate\Support\Facades\Validator;
  10. use Illuminate\Foundation\Auth\RegistersUsers;
  11. use Webpatser\Uuid\Uuid; //to nam daje losowanie klucza losowego
  12.  
  13. class RegisterController extends Controller
  14. {
  15.  
  16.  
  17. use RegistersUsers;
  18.  
  19. protected $redirectTo = '/admin';
  20.  
  21.  
  22. public function __construct()
  23. {
  24. $this->middleware('guest');
  25. }
  26.  
  27. protected function validator(array $data)
  28. {
  29. return Validator::make($data, [
  30. 'user' => 'required|string|max:255',
  31. 'email' => 'required|string|email|max:255|unique:users',
  32. 'password' => 'required|string|min:6|confirmed',
  33. ]);
  34. }
  35.  
  36. protected function create(array $data)
  37. {
  38. $data = array(
  39. 'name' => "Learning Laravel",
  40. );
  41.  
  42. $user = User::create([
  43. 'id_user' => rand(100, 999999999),
  44. 'user' => $data['user'],
  45. 'email' => $data['email'],
  46. 'password' => bcrypt($data['password']),
  47. 'ip' => Request::ip(),
  48. 'key' => Uuid::generate()->string,
  49. 'date' => new DateTime(),
  50. ]);
  51.  
  52. if(!Role::where('name','firm')->exists())
  53. {
  54. Role::create(['name'=>'firm']);
  55. Role::create(['name'=>'person']);
  56. Role::create(['name'=>'moderator']);
  57. Role::create(['name'=>'admin']);
  58. }
  59.  
  60. if($data['type'] questionmark.gif 0) $user->roles()->attach( Role::where('name','firm')->first()->id );
  61. else
  62. $user->roles()->attach( Role::where('name','person')->first()->id );
  63.  
  64.  
  65. return $user;
  66. }
  67. }
  68.  



z tego co wyczytałem, musiałbym teraz wykonać (nie wiem czy dobrze zrozumiałem) następujący kod:
  1. php artisan make:mail Activate


a w nim wstawić:

  1. public function build()
  2. {
  3. return $this->view('emails.activate');
  4. }


następnie możemy sobie edytować jak chcemy nasz szablon: resources/views/emails/activate.blade.php



następnie jakoś chyba trzeba by było wkleić w Register :

  1. Mail::send('emails.activate', $data, function ($message) {
  2.  
  3. $message->from('odkogo@.pl', 'Forum');
  4.  
  5. $message->to('odKogo@pl')->subject('Wiadomość lub chyba jakoś wyciągnięcie z blade ?');
  6.  
  7. });


no i jeszcze kwestia tych przekierowań i sprawdzanie czy ktoś podał poprawny kod aktywacyjny , ewentualnie zamiast sprawdzania to chyba by zrobić link aktywacyjny w mailu smile.gif
Go to the top of the page
+Quote Post
gitbejbe
post 23.05.2019, 20:02:59
Post #2





Grupa: Zarejestrowani
Postów: 456
Pomógł: 49
Dołączył: 27.08.2012

Ostrzeżenie: (0%)
-----


no ale z czym masz problem ? Wkleiłeś trochę kodu - pewnie zapatrzonego z neta, podstawę jakąś masz, co chcesz zrobić też wiesz, to dlaczego nie lecisz z tematem ? pisz, testuj, czytaj dokumentacje. jak będziesz miał z czymś konkretnym problem to pisz, bo na razie to wygląda tak: "rzuciłem wam kawałek kodu, weźcie dopiszcie resztę aby działało"
Go to the top of the page
+Quote Post
casperii
post 23.05.2019, 20:20:30
Post #3





Grupa: Zarejestrowani
Postów: 584
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


wkleiłem kod by dowiedzieć się / zasięgnąć porady starszych rangą czy ów sposób jest poprawny czy można to zrobić w sposób prostszy.
Swoją drogą, czy jeśli będę chciał więcej razy korzystać z ::Mail to tyle razy mam tworzyć model blady itd?
Aktywuj, Newsletter, WyślijWiadomość itd itp ?
Go to the top of the page
+Quote Post
gitbejbe
post 23.05.2019, 21:51:59
Post #4





Grupa: Zarejestrowani
Postów: 456
Pomógł: 49
Dołączył: 27.08.2012

Ostrzeżenie: (0%)
-----


Cytat
wkleiłem kod by dowiedzieć się / zasięgnąć porady starszych rangą czy ów sposób jest poprawny czy można to zrobić w sposób prostszy.


przeglądałeś dokumentację, widzisz co proponują. W internecie jest tez sporo przykładów, popatrz jak to robią inni. Finalnie to Tobie ma pasować. Dawno nie pisałem w laravelu, nie pomogę


Ten post edytował gitbejbe 23.05.2019, 21:54:26
Go to the top of the page
+Quote Post
casperii
post 23.05.2019, 21:58:59
Post #5





Grupa: Zarejestrowani
Postów: 584
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


im dalej w las tym większe drzewa w tym Laravelu smile.gif
z tego co zrozumiałem, config/mail.php wybiera ustawienia jeżeli jest konfiguracja w env
logi pokazują , że niby wiadomość wysłana ,a mimo tego brak wiadomości na mailu (tak SPAM) też sprawdziłem.
Czy da radę sprawdzić brak autoryzacji do smtp lub inne wyjątki ?
Go to the top of the page
+Quote Post
markonix
post 24.05.2019, 00:12:30
Post #6





Grupa: Zarejestrowani
Postów: 2 680
Pomógł: 287
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Cytat
  1. `id_user' => rand(100, 999999999),


facepalmxd.gif

Problem nie jest z Laravel'em tylko z Twoim poziomem. Najpierw przydałoby by się ogarniać jakieś podstawy php/mysql przecież takie coś nie ma racji bytu..

Cytat
  1. 'date' => new DateTime(),


https://laravel.com/docs/5.8/eloquent#eloqu...del-conventions -> timestamps.



Co do maili https://laravel.com/docs/5.8/mail wszystko tu jest opisane - masz klasę, która definiuje pojedynczą formatkę maila i potrzebujesz jednej linijki aby wysłać do określonego usera tego maila.

Mogę jedynie polecić aby testować maile za pomocą MailTrap, a nie na realnym SMTP.


--------------------
Go to the top of the page
+Quote Post
casperii
post 25.05.2019, 13:44:54
Post #7





Grupa: Zarejestrowani
Postów: 584
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


@markonix nie bardzo rozumiem, czepiania się randowania id_user oraz datetime zamiast timestampa , tym bardziej, że nie interesują mnie strefy czasowe a w sam timestamp jest nieczytelny spoglądając w phpmyadmin. Co z tego że jest timestamp rekomendowany , skoro musiałbym go "obrabiać"

Tworze tak jak w tym tutorialu , nawet skorzystałem z mailTrapa lecz nic nie otrzymuje na maila. W logach jest treść blade'a.


W RegisterController.php kod:

  1. protected function create(array $data)
  2. {
  3. Mail::to('podtenwysylam@pl')->send(new Activate);
  4.  
  5. $fail = Mail::failures();
  6. if(!empty($fail)) throw new \Exception('Could not send message to '.$fail[0]);


oraz Activate

  1. class Activate extends Mailable
  2. {
  3. use Queueable, SerializesModels;
  4.  
  5. public function __construct()
  6. {
  7. //
  8. }
  9.  
  10. public function build()
  11. {
  12. return $this->from('from@example.com', 'Mailtrap')
  13. ->subject('Mailtrap Confirmation')
  14. ->view('emails.activate');
  15.  
  16. }
  17. }
  18.  


próbowałem też wpisywać adres mailowy ten z mailTrapa i też lipa.

Ten post edytował casperii 25.05.2019, 15:47:28
Go to the top of the page
+Quote Post
memory
post 25.05.2019, 15:51:40
Post #8





Grupa: Zarejestrowani
Postów: 616
Pomógł: 84
Dołączył: 29.11.2006
Skąd: bełchatów

Ostrzeżenie: (0%)
-----


id_user musi być unikalny. Używając rand, to tak jakbyś kostką rzucał. Czasem wypadnie 3 razy to samo.
Go to the top of the page
+Quote Post
casperii
post 25.05.2019, 16:20:57
Post #9





Grupa: Zarejestrowani
Postów: 584
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


w zakresie 100 - 999999999 ciężko powtórzyć te samo wylosowanie , po drugie, pole id_user jest w bazie unikatowe czyli nie zdubluje, po trzecie będzie warunek na etapie walidacji , że coś poszło nie tak.
Go to the top of the page
+Quote Post
viking
post 25.05.2019, 16:31:20
Post #10





Grupa: Zarejestrowani
Postów: 5 226
Pomógł: 876
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Tak czy inaczej to zły pomysł. Oprócz wysyłki możesz też maila wyświetlić. Może w szablonie jest problem?


--------------------
Go to the top of the page
+Quote Post
casperii
post 25.05.2019, 20:33:30
Post #11





Grupa: Zarejestrowani
Postów: 584
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


@viking - zatem jaki masz pomysł na generowanie losowego ID usera - nie auto
inkrementacja.

w activate.blade.php mam tylko "poszło" smile.gif

zupdatowałem trochę kod i otrzymuję błąd nie wysłania "Email could not be sent.":

plik Activate.php

  1. class Activate extends Mailable
  2. {
  3. use Queueable, SerializesModels;
  4.  
  5. public function __construct()
  6. {
  7.  
  8. }
  9.  
  10. public function build()
  11. {
  12. return $this->view('emails.activate');
  13. }
  14. }



plik RegisterController.php

  1. protected function create(array $data)
  2. {
  3.  
  4. $result = Mail::send('emails.activate', $data, function($message){
  5. $message->from('898d3be566-f775ac@inbox.mailtrap.io', 'My Website');
  6. $message->to('dokogo@adres.pl')->subject('My Subject');
  7. });
  8.  
  9. $fail = Mail::failures();
  10. if(!empty($fail)) throw new \Exception('Could not send message to '.$fail[0]);
  11.  
  12. if(empty($result)) throw new \Exception('Email could not be sent.');
  13.  
  14. $user = User::create([
  15. 'id_user' => rand(100, 999999999),
  16. 'user' => $data['user'],
  17. 'email' => $data['email'],
  18. 'password' => bcrypt($data['password']),
  19. 'ip' => Request::ip(),
  20. 'key' => Uuid::generate()->string,
  21. 'date' => new DateTime(),
  22. ]);
  23.  
  24. if(!Role::where('name','firm')->exists())
  25. {
  26. Role::create(['name'=>'firm']);
  27. Role::create(['name'=>'person']);
  28. Role::create(['name'=>'moderator']);
  29. Role::create(['name'=>'admin']);
  30. }
  31.  
  32.  
  33. if($data['type'] questionmark.gif 0) $user->roles()->attach( Role::where('name','firm')->first()->id );
  34. else
  35. $user->roles()->attach( Role::where('name','person')->first()->id );
  36.  
  37.  
  38. return $user;
  39. }



aha w logach mam takie coś:
2019-05-25 19:28:33] local.ERROR: Email could not be sent. {"exception":"[object] (Exception(code: 0): Email could not be sent. at D:\\projekt\\app\\Http\\Controllers\\Auth\\RegisterController.php:55)
[stacktrace]
Go to the top of the page
+Quote Post
markonix
post 25.05.2019, 21:26:24
Post #12





Grupa: Zarejestrowani
Postów: 2 680
Pomógł: 287
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Cytat(casperii @ 25.05.2019, 14:44:54 ) *
@markonix nie bardzo rozumiem, czepiania się randowania id_user oraz datetime zamiast timestampa , tym bardziej, że nie interesują mnie strefy czasowe a w sam timestamp jest nieczytelny spoglądając w phpmyadmin. Co z tego że jest timestamp rekomendowany , skoro musiałbym go "obrabiać"

Bo od tego jest właśnie autoincrement, a nie funkcja rand().

Timestamp i datetime w bazie MySQL wyglądają tak samo. Nic nie trzeba obrabiać, a wręcz Laravel bardzo ułatwia operowanie na datach, ale mnie w ogóle nie chodziło o format daty tylko sam fakt, że Eloquent ma wbudowaną obsługę znaczników czasowych.

Skonfigurowałeś dobrze w ogóle Mailtrapa? From i to są nieistotne, wszystko na niego trafi.

Ten post edytował markonix 25.05.2019, 21:28:10


--------------------
Go to the top of the page
+Quote Post
casperii
post 25.05.2019, 22:27:02
Post #13





Grupa: Zarejestrowani
Postów: 584
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


właśnie chcę uniknąć auto inkrementacji , nie chce by ktoś skakał mi po profilach strona.pl/id/1 , strona.pl/id/2 itd

po paru godzinach walki zaczęło trybić, być może dlatego , że przepisałem dane w config/mail.php


Nie rozumiem jednego dlaczego przy poprawnym wysłaniu maila spełnia się ten warunek (kod zaczerpnięty z neta):

  1. $result = Mail::send('emails.activate', $data, function($message){
  2. $message->from('odkogo@pl', 'My Website');
  3. $message->to('dokogo@pl')->subject('My Subject');
  4. });
  5.  
  6. $fail = Mail::failures();
  7. if(empty($result)) throw new \Exception('Email could not be sent.');




Ten post edytował casperii 25.05.2019, 23:11:40
Go to the top of the page
+Quote Post
markonix
post 26.05.2019, 17:50:55
Post #14





Grupa: Zarejestrowani
Postów: 2 680
Pomógł: 287
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Cytat(casperii @ 25.05.2019, 23:27:02 ) *
właśnie chcę uniknąć auto inkrementacji , nie chce by ktoś skakał mi po profilach strona.pl/id/1 , strona.pl/id/2 itd


A co za różnica dla mnie (dla bota) czy będę skakał po 1, 2 i 3, a 100, 500, 1000? Że bot mi wylistuje listę profili w minutę, zamiast w kilka sekund?
facepalmxd.gif

Cytat(casperii @ 25.05.2019, 23:27:02 ) *
po paru godzinach walki zaczęło trybić, być może dlatego , że przepisałem dane w config/mail.php

Zaczęło trybić gdy zrobiłeś to od czym pisałem od początku czyli ustawić dobrze config maila.


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 26.05.2019, 19:28:55
Post #15





Grupa: Zarejestrowani
Postów: 7 785
Pomógł: 1370
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Ehh Przecież dostałeś odpowiedź w innym temacie a Ty nadal swoje (mówię o unikalnych wartościach)
Go to the top of the page
+Quote Post
Lord
post 27.05.2019, 09:13:01
Post #16





Grupa: Zarejestrowani
Postów: 186
Pomógł: 29
Dołączył: 10.03.2004

Ostrzeżenie: (0%)
-----


https://github.com/webpatser/laravel-uuid/
Go to the top of the page
+Quote Post
casperii
post 3.06.2019, 16:12:50
Post #17





Grupa: Zarejestrowani
Postów: 584
Pomógł: 28
Dołączył: 14.08.2014

Ostrzeżenie: (0%)
-----


@Pyton_000 UUID zastosowałem do wygenerowania unikalnego kodu weryfikacji, natomiast id_user i tak będę się upierać , że lepszy random z ewentualnym sprawdzaniem czy istnieje niż autoinkrementacja.
Chociaż tak sobie pomyślałem, że do id_user też można użyć wspomnianego uuid tongue.gif
Go to the top of the page
+Quote Post
markonix
post 3.06.2019, 19:44:52
Post #18





Grupa: Zarejestrowani
Postów: 2 680
Pomógł: 287
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Cytat(casperii @ 3.06.2019, 17:12:50 ) *
@Pyton_000 UUID zastosowałem do wygenerowania unikalnego kodu weryfikacji, natomiast id_user i tak będę się upierać , że lepszy random z ewentualnym sprawdzaniem czy istnieje niż autoinkrementacja.
Chociaż tak sobie pomyślałem, że do id_user też można użyć wspomnianego uuid tongue.gif

Używanie UUID jest powszechną praktyką, ale np. przy pisaniu aplikacji rozproszonych, API itp. a nie dla wyimaginowanych problemów jak Twoje.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.06.2019 - 02:35