Senden von E-Mails mit PHP von einem SMTP-Server

131
$from = "[email protected]";
$headers = "From:" . $from;
echo mail ("[email protected]" ,"testmailfunction" , "Oj",$headers);

Ich habe Probleme beim Senden von E-Mails in PHP. Ich erhalte eine Fehlermeldung:SMTP server response: 530 SMTP authentication is required .

Ich hatte den Eindruck, dass Sie zur Überprüfung E-Mails ohne SMTP senden können. Ich weiß, dass diese Mail wahrscheinlich herausgefiltert wird, aber das spielt im Moment keine Rolle.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = someonelse@example.com

Dies ist das Setup in der php.iniDatei. Wie soll ich SMTP einrichten? Gibt es SMTP-Server, für die keine Überprüfung erforderlich ist, oder muss ich selbst einen Server einrichten?

Borut Flis
quelle

Antworten:

168

Wenn Sie eine E-Mail über einen Server senden, für den SMTP-Authentifizierung erforderlich ist, müssen Sie diese wirklich angeben und den Host, den Benutzernamen und das Kennwort festlegen (und möglicherweise den Port, falls dies nicht der Standardport ist - 25).

Zum Beispiel verwende ich normalerweise PHPMailer mit ähnlichen Einstellungen wie diese:

$mail = new PHPMailer();

// Settings
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';

$mail->Host       = "mail.example.com"; // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username"; // SMTP account username example
$mail->Password   = "password";        // SMTP account password example

// Content
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->send();

Weitere Informationen zu PHPMailer finden Sie hier: https://github.com/PHPMailer/PHPMailer

Ivo Pereira
quelle
21
+1 für phpMailer - es ist die Alternative für gesunde Personen zu den in PHP integrierten mail()Funktionen.
DEZA
8
Für diejenigen, die über diese Antwort stolpern, ist es erwähnenswert, dass PHPMailer auch in WordPress integriert ist und über den 'phpmailer_init'Action-Hook konfiguriert werden kann . Es ist eine bequeme Möglichkeit, WordPress für SMTP-Mail oder Amazon SES (das SMTP-Verbindungen unterstützt) einzurichten.
Matt van Andel
1
Darf PHP Mailer in kostenpflichtigen Skripten verwendet werden?
Luka
2
@ Luka Ja, das ist es. Nach ihrer Lizenzdatei PHPMailer verwendet die LGPL 2.1 Lizenz, die kommerzielle Nutzung erlaubt.
Alejandro
Muss ich etwas Besonderes tun, um diesen Code zu verwenden? Wo lege ich das hin? Kann ich es mit einem HTML5-Formular mit einer POST-Anfrage aufrufen? Wie sende ich eine E-Mail, nachdem ich dieses PHPMailer-Objekt erstellt habe?
Aaron Franke
53
<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "[email protected]");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = [email protected]";

$headers = "From: [email protected]";

mail("[email protected]", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

oder lesen Sie weiter , um weitere Informationen zu erhalten .

Dipesh Parmar
quelle
Die IP-Adresse, mit der Sie E-Mails senden, ist nicht berechtigt, E-Mails direkt an unsere Server zu senden. Ich bekomme diesen Fehler. Ich möchte nur ein offenes Mail-Relay.
Borut Flis
Ich habe keine statische IP. Kennen Sie ein Open Mail Relay?
Borut Flis
1
Weitere Informationen zu Google SMTP-Relays finden Sie unter support.google.com/a/answer/176600?hl=de .
Fyrye
5
Dies ist die beste Antwort für Godaddy- php mail()Funktionsprobleme - 2017 - sollte PHPMailer oder eine andere Ressource von Drittanbietern nicht herunterladen müssen - danke
soulshined
4
"READ ON" Link ist defekt
vladkras
46

Für Unix-Benutzer verwendet mail () tatsächlich den Befehl Sendmail , um E-Mails zu senden. Anstatt die Anwendung zu ändern, können Sie die Umgebung ändern. msmtp ist ein SMTP-Client mit Sendmail-kompatibler CLI-Syntax, dh er kann anstelle von Sendmail verwendet werden. Es erfordert nur eine kleine Änderung an Ihrer php.ini.

sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"

Dann kann sogar die Funktion lowly mail () mit SMTP-Güte arbeiten. Dies ist sehr nützlich, wenn Sie versuchen, eine vorhandene Anwendung mit Mail-Diensten wie sendgrid oder mandrill zu verbinden, ohne die Anwendung zu ändern.

txyoji
quelle
1
Tolle Lösung, verwenden Sie es jetzt auf mehreren Servern!
Raice
3
Implementierung in meinen Docker-Containern für Apps, die keine Mailing-Bibliothek verwenden.
Batandwa
Hervorragender Migrationspfad von Vanille mail()zu etwas, das SMTP unterstützt. Danke dir!
Rinogo
MSMTP ist auch für Windows verfügbar. Die offensichtlichen Downloads haben Version 1.4. Die Version, die ich irgendwo gefunden habe, ist 1.6.2. Ich weiß nicht, ob es eine 1.8.6 für Windows gibt.
Bilbo
Der Autor hat die Bereitstellung von Windows-Binärdateien vor dem Februar 2016 eingestellt.
Bilbo
17

Das Problem ist, dass die PHP- mail()Funktion eine sehr eingeschränkte Funktionalität hat. Es gibt verschiedene Möglichkeiten, E-Mails von PHP aus zu senden.

  1. mail()verwendet den SMTP-Server auf Ihrem System. Es gibt mindestens zwei Server, die Sie unter Windows verwenden können: hMailServer und xmail . Ich habe mehrere Stunden damit verbracht, sie zu konfigurieren und einzurichten. Erstens ist einer meiner Meinung nach einfacher. Derzeit arbeitet hMailServer unter Windows 7 x64.
  2. mail()Verwendet den SMTP-Server auf einer Remote- oder virtuellen Maschine unter Linux. Natürlich erlaubt ein echter Mail-Dienst wie Google Mail keine direkte Verbindung ohne Anmeldeinformationen oder Schlüssel. Sie können eine virtuelle Maschine einrichten oder eine in Ihrem LAN verwenden. Die meisten Linux-Distributionen haben einen sofort einsatzbereiten Mailserver. Konfigurieren Sie es und haben Sie Spaß. Ich verwende Standard-Exim4 unter Debian 7, das die LAN-Schnittstelle überwacht.
  3. Mailing-Bibliotheken verwenden direkte Verbindungen. Bibliotheken sind einfacher einzurichten. Ich habe SwiftMailer verwendet und es sendet perfekt E-Mails von einem Google Mail-Konto. Ich denke, dass PHPMailer auch ziemlich gut ist.

Unabhängig davon, welche Wahl Sie treffen, empfehle ich Ihnen, eine Abstraktionsschicht zu verwenden. Sie können die PHP-Bibliothek auf Ihrem Entwicklungscomputer unter Windows verwenden und einfach mail()auf einem Produktionscomputer unter Linux arbeiten. Mit der Abstraktionsschicht können Sie E-Mail-Treiber je nach System austauschen, auf dem Ihre Anwendung ausgeführt wird. Erstellen Sie eine abstrakte MyMailerKlasse oder Schnittstelle mit einer abstrakten send()Methode. Erben Sie zwei Klassen MyPhpMailerund MySwiftMailer. Implementieren Sie die send()Methode auf geeignete Weise.

George Sovetov
quelle
17

Hier ist eine Möglichkeit, dies mit PHP PEAR zu tun

// Pear Mail Library
require_once "Mail.php";

$from = '<[email protected]>'; //change this to your email address
$to = '<[email protected]>'; // change to address
$subject = 'Insert subject here'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => '[email protected]', //your gmail account
        'password' => 'snip' // your password
    ));

// Send the mail
$mail = $smtp->send($to, $headers, $body);

//check mail sent or not
if (PEAR::isError($mail)) {
    echo '<p>'.$mail->getMessage().'</p>';
} else {
    echo '<p>Message successfully sent!</p>';
}

Wenn Sie Google Mail SMTP verwenden, müssen Sie SMTP in Ihrem Google Mail-Konto unter Einstellungen aktivieren

EDIT: Wenn Sie Mail.php auf debian / ubuntu nicht finden können, können Sie php-pear mit installieren

sudo apt install php-pear

Installieren Sie dann die Mail-Erweiterung:

sudo pear install mail
sudo pear install Net_SMTP
sudo pear install Auth_SASL
sudo pear install mail_mime

Dann sollten Sie es laden können, indem Sie es einfach require_once "Mail.php" hier finden:/usr/share/php/Mail.php

Bolli
quelle
1
require_once ('/usr/share/somewhere/Mail.php');
10

Es gibt einige SMTP-Server, die ohne Authentifizierung funktionieren. Wenn der Server jedoch eine Authentifizierung erfordert, kann dies nicht umgangen werden.

Die in PHP integrierten Mail-Funktionen sind sehr eingeschränkt. Die Angabe des SMTP-Servers ist nur in Windows möglich. Unter * nix mail()werden die Binärdateien des Betriebssystems verwendet.

Wenn Sie E-Mails an einen beliebigen SMTP-Server im Internet senden möchten, sollten Sie eine Bibliothek wie SwiftMailer verwenden . Auf diese Weise können Sie beispielsweise die ausgehenden Server von Google Mail verwenden.

Pekka
quelle
2

In Fällen, in denen Sie eine Wordpress-Site unter Linux hosten und Serverzugriff haben, können Sie einige Kopfschmerzen sparen, indem Sie msmtp installieren, mit dem Sie über SMTP von der Standardfunktion php mail () aus senden können. msmtp ist eine einfachere Alternative zu Postfix, die etwas mehr Konfiguration erfordert.

Hier sind die Schritte:

Installieren Sie msmtp

sudo apt-get install msmtp-mta ca-certificates

Erstellen Sie eine neue Konfigurationsdatei:

sudo nano /etc/msmtprc

... mit folgenden Konfigurationsinformationen:

# Set defaults.    
defaults

# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL

Sie müssen die Konfigurationsdaten ersetzen, die durch alles in "<" und ">" dargestellt werden (einschließlich, entfernen Sie diese). Verwenden Sie für Host / Benutzername / Passwort Ihre normalen Anmeldeinformationen, um E-Mails über Ihren E-Mail-Anbieter zu senden.

Sagen Sie PHP, dass es es verwenden soll

sudo nano /etc/php5/apache2/php.ini

Fügen Sie diese einzelne Zeile hinzu:

sendmail_path = /usr/bin/msmtp -t

Eine vollständige Dokumentation finden Sie hier:

https://marlam.de/msmtp/

Peter Drinnan
quelle
ssmtp ist auch eine Lösung siehe (französischer Leitfaden): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ıɾuǝʞ