Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wysyłka e-maila z klasy phpmailer
Forum PHP.pl > Forum > Przedszkole
Kerth
Cześć,
próbuję na VPS używać klasy phpmailer. Dziwne, bo pomimo błędu i komunikacie o wysłanym e-mailu, nie otrzymuję go. Dlaczego tak się dzieje? Proszę spójrzcie na ten kod:

  1. require_once('../phpmailer/class.phpmailer.php');
  2. //include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded
  3.  
  4. $mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch
  5.  
  6. $mail->IsSMTP(); // telling the class to use SMTP
  7.  
  8. try {
  9.  
  10. $mail = new PHPMailer();
  11. $mail->IsHtml(false); //format wiadomości jeśli true=HTML, false=TXT
  12. $mail->CharSet = "utf-8";
  13. $mail->PluginDir = "/var/www/portfolio/phpmailer/";
  14. $mail->From = "email"; // od
  15. $mail->FromName = "email"; //nazwa
  16. $mail->Host = "smtp.gmail.com"; //adres gmaila ;)
  17. $mail->Port = 587; //port gmaila
  18. $mail->Mailer = "smtp";
  19. $mail->Username = "email";//nazwa admina na poczcie
  20. $mail->Password = "Mojehasło";//hasło admina do konta SMTP
  21. $mail->SMTPAuth = true;
  22. $mail->SetLanguage("pl", "language/");
  23. $mail->SetFrom(''.$email.'', ''.$topic.'');
  24. $mail->Subject = ''.$topic.'';
  25. $mail->AltBody = nl2br($message); // optional - MsgHTML will create an alternate automatically
  26. $mail->Body = nl2br('Wiadomość od: '.$name.' || Treść: '.$message.'');
  27. $mail->Send();
  28.  
  29. } catch (phpmailerException $e) {
  30. echo $e->errorMessage(); //Pretty error messages from PHPMailer
  31. } catch (Exception $e) {
  32. echo $e->getMessage(); //Boring error messages from anything else!
  33. }


Port 465 też nie działa. Pomożecie?
nospor
Jesli mail sie nie uda to o to:
$mail->Send();
zwroci false. A ty tego nie obslugujesz tylko jakis wyjatek. No chyba ze najnowszej wersji phpmailera zmienili to na wyjatek. zmienili?
Kerth
Po wywołaniu $mail->Send(); dałem tak:

  1. var_dump($mail->Send());

Rzeczywiście zwraca mi false. Co tu może być nie tak? Co z tymi wyjątkami?

Byłby w stanie ktoś coś podpowiedzieć w jaki sposób podłączyć to pod gmail?
nospor
Obiekt $mail ma w sobie informacje o bledzie. Wyswietl go sobie, a moze sie rozjasni trochę.
Kerth
W jaki sposób mam wyświetlić błędy obiektu mail?

  1. ini_set("display_errors", 1);


nie powoduje w tym przypadku, że otrzymam błędy.
nospor
Napisalem ze obiekt $mail czyli klasa PHPMailer zawiera w sobie wlasciwosc, ktora trzyma ostatni blad. Wyswietl to sobie. Jak nie wiesz ktora to, to zajrzyj do dokumentacji lub przykladow. Tam jest napisane a ja nie pamietam dokladnie jak to sie nazywalo. errorInfo czy jakos tak
Kerth
Skorzystałem z tego ErrorInfo. Otrzymałem takie coś:


  1.  
  2. SMTP -> ERROR: Password not accepted from server: 534-5.7.14 Please log in via your web browser and 534-5.7.14 then try again. 534-5.7.14 Learn more at 534 5.7.14 <a href="https://support.google.com/mail/answer/78754" target="_blank">https://support.google.com/mail/answer/78754</a> y1sm873923wib.7 - gsmtp
  3. SMTP -> ERROR: MAIL not accepted from server: 530-5.5.1 Authentication Required. Learn more at 530 5.5.1 <a href="https://support.google.com/mail/answer/14257" target="_blank">https://support.google.com/mail/answer/14257</a> y1sm873923wib.7 - gsmtp
  4. The following From address failed: email@gmail.com : MAIL not accepted from server,530,5.5.1 Authentication Required. Learn more at 530 5.5.1 <a href="https://support.google.com/mail/answer/14257" target="_blank">https://support.google.com/mail/answer/14257</a> y1sm873923wib.7 - gsmtp
  5. SMTP server error: 5.5.1 Authentication Required. Learn more at 530 5.5.1 <a href="https://support.google.com/mail/answer/14257" target="_blank">https://support.google.com/mail/answer/14257</a> y1sm873923wib.7 - gsmtp
  6.  
  7. Mailer Error: The following From address failed: email@gmail.com : MAIL not accepted from server,530,5.5.1 Authentication Required. Learn more at 530 5.5.1 <a href="https://support.google.com/mail/answer/14257" target="_blank">https://support.google.com/mail/answer/14257</a> y1sm873923wib.7 - gsmtp
  8. SMTP server error: 5.5.1 Authentication Required. Learn more at 530 5.5.1 <a href="https://support.google.com/mail/answer/14257" target="_blank">https://support.google.com/mail/answer/14257</a> y1sm873923wib.7 - gsmtp
  9.  
  10. SMTP server error: 5.5.1 Authentication Required. Learn more at 530 5.5.1 <a href="https://support.google.com/mail/answer/14257" target="_blank">https://support.google.com/mail/answer/14257</a> y1sm873923wib.7 - gsmtp
  11.  


Co zrobić?
vokiel
Podać prawidłowe dane, masz przecież w błędach przyczyny:
- Password not accepted
- Authentication Required

W skrócie oznacza to, że żeby wysłać maile z Gmaila trzeba się autoryzować loginem i hasłem do poczty.

Wystarczy zajrzeć do przykładów na stronie PHPMailer'a: http://phpmailer.worxware.com/?pg=examplebgmail http://phpmailer.worxware.com/index.php?pg=exampleagmail
Kerth
Ok. Z tym sobie poradziłem tylko mam teraz pytanie. Dlaczego wiadomości wysyłane przez klasę PHPMailer przychodzą w poczcie gmail do folderu SPAM?
I dlaczego przychodzą po 2 wiadomości? Tak to wygląda:



Kod:

  1. <?php
  2. ini_set("display_errors", 1);
  3. class Message{
  4. function SendMessage(){
  5. $name = isset($_POST['name']) ? $_POST['name'] : false;
  6. $email = isset($_POST['email']) ? $_POST['email'] : false;
  7. $topic = isset($_POST['topic']) ? $_POST['topic'] : false;
  8. $message = isset($_POST['message']) ? $_POST['message'] : false;
  9.  
  10. if(isset($_POST['send_message'])){
  11. include "../phpmailer/class.phpmailer.php"; // include the class name
  12. $mail = new PHPMailer(); // create a new object
  13.  
  14. $mail->Host = 'smtp.gmail.com';
  15. $mail->Port = 587;
  16. $mail->SMTPSecure = 'tls';
  17. $mail->SMTPAuth = true;
  18. $mail->Username = "myemail@gmail.com";
  19. $mail->Password = "password";
  20.  
  21. $mail->AddAddress('myemail@gmail.com','myname');
  22.  
  23. $mail->CharSet = "UTF-8";
  24. $mail->AltBody = nl2br($message); // optional - MsgHTML will create an alternate automatically
  25. $mail->Body = nl2br('Wiadomość od: '.$name.' || Treść: '.$message.'');
  26.  
  27. $mail->SetFrom($email);
  28. $mail->Subject = ''.$topic.'';
  29.  
  30. //$mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
  31. //$mail->SMTPKeepAlive = true;
  32. $mail->IsHTML(true);
  33.  
  34. if(!$mail->Send()){
  35. echo "Mailer Error: " . $mail->ErrorInfo;
  36. }
  37. else{
  38. echo '<meta charset="utf-8"/>';
  39. echo "<script>alert('Dziękuję za przesłanie wiadomości. Odpowiem na nią jak najszybciej.');</script>";
  40. echo '
  41. <script>
  42. setTimeout(function(){
  43. window.location.href = "../index.php";
  44. },
  45. 100);
  46. </script>
  47. ';
  48. var_dump($mail->Send());
  49. }
  50. }
  51. }
  52. }
  53. $send = new Message();
  54. $send->SendMessage();
  55. ?>


Dlaczego otrzymuję wiadomości do SPAMu?
Proszę też nie patrzcie na stosowanie tu mojej wybitnej twórczości jaką jest pseudo obiektowość smile.gif
nospor
To raczej nie ma zwiazku z PHPMailer tyko z kontem z ktorego wysylasz maile.
Kerth
To bez znaczenia jaki adres podam przy wysyłaniu e-mail i tak zawsze wiadomość trafia do SPAMu. Wiesz może jak temu zaradzić?
nospor
No na pewno nie podales mojego wink.gif A mojego nigdy do spamu nie trafialo.
Kerth
Nie chcę schodzić na bezsensowną polemikę ale znalazłem Twój e-mail na Twojej stronie, wpisałem i uwierz mi, że również wiadomości idą do SPAMu smile.gif
kapslokk
Przecież nie wysyłasz maila z jego skrzynki, tylko dajesz nagłówek, który mówi, że to jego mail. Dlatego możesz trafiać do spamu. Spróbuj wysłać maila z nagłówkiem takim jak jego faktyczny adres.
Kerth
Tak też robię ale pomimo tego, wiadomości wysyłane przez formularz kontaktowy, korzystające z tej klasy ZAWSZE trafiają do SPAMu. Nie ważne jaki podam adres email w nagłówku. Dla potwierdzenia:

kapslokk
Jeżeli używasz do wysyłania skrzynki myemail@gmail.com to w nagłówku nadawce ustaw jako myemail@gmail.com, a nie nospor@gmail.com czy cokolwiek innego.

Wyobraź sobie sytuacje:
wysyłasz maila z nagłówkiem adresu bill@microsoft.com i piszesz :
"Cześć Halina, zapomniałem sobie przelać kasy na moje drugie konto, wyślij mi stówke a oddam dwie."
I to nie trafia do spamu... Bez sensu, prawda? smile.gif
Kerth
Nie rozumiesz. W:
  1. $mail->SetFrom($email);

pobieram przesłany adres e-mail z pola "Adres email" w formularzu kontaktowym. Dodam, że nawet jeśli w formularzu podam nadawcę jako siebie i wysyłam również do siebie to wiadomość także opatrzona jest jako spam.
kapslokk
A czy jeśli zalogujesz się normalnie na tą skrzynkę, i wyślesz do siebie maila to też trafia do spamu? Czy nie?
Kerth
Wtedy nie trafia do spamu. Wiadomośc otrzymuję wtedy normalnie.
Skie
Wiadomośc trafia do spamu prawdopodobnie dlatego, że wysyłasz w tym samym czasie dwie identyczne wiadomości z tego samego konta do tego samego innego. Jak tego nie traktować jako spam?

Wiadomość z kolei jest wysyłana dwa razy dlatego, że wywołujesz $mail->Send() dwa razy - raz w linii 35 i raz w 49.

Zmień warunek z linii 35 na
  1. if (($status = $mail->Send()) === false)


i var_dump z linii 49 na
  1. var_dump($status);


Powinno działać dobrze.
Kerth
To prawda, teraz otrzymuję tylko jedną wiadomość aczkolwiek nawal e-mail trafia do SPAMu.
Skie
W takim razie rozwiązania musisz poszukać w google, najlepiej na stacku. Tutaj masz podobny temat : http://stackoverflow.com/questions/1630296...er-how-to-avoid wraz z wielostopiowym postępowaniem co zrobić by wiadomość nie trafiała do spamu. Zwróć także uwagę na punkt 11. "Accept that there is no, and never will be an "exact solution on this issue". Ever."
Jednym słowem przeznacz sobie pewną ilość czasu na rozwiązanie tego problemu - jak się nie uda, to trudno. Po coś istnieją te wszystkie uwagi w systemach resjetracyjnych by sprawdzać też kontener SPAM jak mail długo nie dochodzi.
Pamiętaj również, że to zależy od serwera, do którego wysyłasz wiadomość. Na jednym serwerze będzie to SPAM, na innym już nie. Ze swojego doświadczenia jedynie co Ci mogę powiedzieć, to to, że wysyłanie maili automatycznie w dużej ilości przez gmaila to zły pomysł. Ta skrzynka się nie sprawdza do tego.
Kerth
Mam 2 poczty - na gmail i na onecie. Gdy jako nadawcę w formularzu podam tą z onetu to w gmailu trafia wiadomość do SPAMu. Mogę jednak na nią odpowiedzieć. Gdy odpowiem to wiadomość dochodzi do tej drugiej skrzynki i tam wiadomość traktowana jest już normalnie. Dziwne. to jest strasznie.
Skie
Sprawdź najlepiej jakimś managerem poczty, który używa SMTP czy tam też się to dzieje czy nie. Testy przez przeglądarkę, że ręcznie wyślesz maile nic nie znaczą w tym przypadku.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.