web-dev-qa-db-de.com

PHP-Swiftmailer mit Google Mail verwenden

Ich schreibe ein einfaches Skript, in dem ein Google Mail-Konto verwendet wird, um eine E-Mail an sich selbst zu senden. 

Ich habe das Skript von SwiftMailer's reference geändert, bekomme aber keine Ergebnisse. Was ist falsch? 

Edit: nach weiterem debuggen habe ich die aussage gefunden

$result = $mailer->send($message);

der Code schlägt fehl (das Echo darunter druckt nicht).

Warum ist das? Nur weil die Nachricht nicht gesendet wird, stürzt das Programm ab? : / 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>
<?php
    require_once '/var/www/Swift/lib/Swift_required.php';
    echo 'Mail sent <br />';  

/*  //create the transport
    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587);
      ->setUsername('[email protected]')
      ->setPassword('softrain1234')
    ;
*/

    $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587)
      ->setUsername('[email protected]')
      ->setPassword('password')
    ;

    echo 'line 40 <br />';
    $mailer = Swift_Mailer::newInstance($transport);
    $message = Swift_Message::newInstance('Wonderful Subject')
      ->setFrom(array('[email protected]' => 'Evaluaciones'))
      ->setTo(array('[email protected]'=> 'A name'))
      ->setBody('Test Message Body')
    ;
    echo 'line 52 <br />';

    $result = $mailer->send($message);
    echo $result;
    echo 'line 58 <br />';

?>
</body>
</html>

Das Testformular:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
        <title>Test Mail Script</title>
    </head>
    <body>
        <form action="scriptmail.php" method="post">
            <input type="submit"/>
            </table>
        </form>
  </body>
</html>
35
andandandand

Es ist nicht beabsichtigt, einen alten Beitrag wiederzubeleben, sondern nur für den Fall, dass andere nach einer Antwort suchen und dieser Beitrag während meiner Suche nach einer Lösung trotz des Alters auftauchte.

Bei Verwendung von PHP SwiftMailer zum Herstellen einer Verbindung mit Google Mail- oder Google Apps-E-Mail-Konten müssen Sie Folgendes verwenden

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername($this->username)
  ->setPassword($this->password);

$this->mailer = Swift_Mailer::newInstance($transporter);

Das funktioniert gut für mich. Im ursprünglichen Code verwenden Sie Port 587 und nicht 465, und Sie geben nicht das Protokoll (SSL) an. Ich weiß nicht, ob das etwas zählt, aber Port 587 ist für mich ausgefallen und 465 hat gut funktioniert.

Hoffentlich hilft das.

85
fullybaked

Ich fand diese Frage bei einer Google-Suche und verwendete den Code in der Antwort von fullbaked. Es brachte mich zu dem Punkt, an dem ich in den Exceptions geworfen sehen konnte, dass der Google-SMTP-Server mit einem Fehlercode reagierte, der angibt, dass Passwort und Benutzername nicht akzeptiert wurden. Nach weiteren Untersuchungen fand ich die folgenden Schritte. Jetzt funktioniert es großartig und ich kann den Code für die Produktion weiter ausarbeiten.

Sie sind sich nicht sicher, wann Google die Änderung vorgenommen hat. Neben der Konfiguration Ihres Codes mit Ihrem Google-Nutzernamen, Ihrem Kennwort und Ihrem Port (465/ssl oder 587/tls) müssen Sie jedoch die folgenden Schritte ausführen, um den Google-SMTP-Server verwenden zu können.

Um den Google Mail-SMTP-Server mit Ihrem Google Mail-Konto zu verwenden, müssen Sie Folgendes tun:

1) In Google "Kontoeinstellungen" aktivieren Sie "Zugriff für weniger sichere Apps", indem Sie "Zulassen" festlegen.

2) Überprüfen Sie in den Google Mail-Einstellungen auf der Registerkarte "Weiterleitung und POP/IMAP" die Option IMAP-Status, muss es aktiviert werden . (Dadurch können die gesendeten E-Mails im gesendeten Ordner gespeichert werden.)

3) Wenn Sie nach den Schritten 1 und 2 immer noch die Ausnahme smtp .__ von Google ausführen. Der Server akzeptiert nicht den Benutzernamen und das Kennwort, das Sie öffnen müssen In einem Browser gehen Sie zu gmail und melden Sie sich an. Öffnen Sie dann eine weitere Registerkarte in der der gleiche Browser und gehe zu dieser Adresse:
https://accounts.google.com/DisplayUnlockCaptcha

According to Google you may have to enter a captcha.

4) Senden Sie umgehend eine E-Mail von Ihrem Code, da dies die Berechtigung ist zur Verwendung Ihres Google Mail-Kontos berechtigt.

Hoffe das hilft.

35
Gene

Ich fand das, was evad sagte, wahr, aber ich musste seine Arbeit für die aktuelle Version von Swift Mailer ein wenig ändern.

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
  ->setUsername('[email protected]')
  ->setPassword('password');

$mailer = Swift_Mailer::newInstance($transporter);

Sollte gut funktionieren.

6
Richard

465 ist der Port für SSL, 587 wird für die TLS-Verschlüsselung verwendet (siehe http://swiftmailer.org/docs/sending.html#encrypted-smtp )

3
ducin

Das GMail SMTP-System hat Probleme mit SSL und Ports. Ich finde es schwierig, es gut mit PHP arbeiten zu lassen.

Das Beste, was ich gefunden habe, ist phpGMailer . Möglicherweise können Sie diesen Code durchforsten, um zu sehen, wie er dazu gebracht wurde, aber das hat für mich immer einwandfrei funktioniert. 

Ich weiß, dass das SwiftMail-Problem nicht angesprochen wird, ich habe nur darauf hingewiesen, dass ich darauf hinweisen würde :)

3
Brad F Jacobs

Ich bin auch nach stundenlanger Recherche hierher gekommen. Ich habe endlich die richtige Antwort gefunden. Ich wollte E-Mail von Google Mail-Servern und nicht von meinem Host mit SMTP-Authentifizierung senden.

Sie können eine E-Mail mit ihren vollständigen Kopfzeilen in gmail verfolgen. Befolgen Sie diese Anleitung.

https://support.google.com/mail/answer/29436?hl=de

@fullybaked hatte die richtige Antwort, um Ihre E-Mail über SMTP zu authentifizieren, aber Sie würden trotzdem über Ihren Host senden.

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')
->setUsername($this->username)
->setPassword($this->password);

$this->mailer = Swift_Mailer::newInstance($transporter);

@ducin war bei den verschiedenen Ports und Verschlüsselungstypen korrekt.

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, 'ssl')

ODER moderner und sicherer verwenden;

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls')

Wenn Sie direkt von einem Google Mail-Server senden möchten, müssen Sie den Autorisierungsmodus festlegen. Normal ist Standard.

$transporter = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls')
->setAuthMode('login')
->setUsername('[email protected]')
->setPassword('password');

$mailer = Swift_Mailer::newInstance($transporter);

@gene ist auch korrekt, Sie müssen Ihre App authentifizieren, befolgen Sie die Anweisungen.

Um zu verhindern, dass Ihre E-Mails im Spam-Ordner landen, müssen Sie außerdem DNS-Textdatensätze mit DKIM (Domänenschlüssel) hinzufügen.

https://support.google.com/a/answer/174124?hl=de

SPF-Datensätze

https://support.google.com/a/answer/33786?hl=de

und DMARC

https://support.google.com/a/answer/2466580?hl=de

0
Dan Kinchen