Wie sende ich eine E-Mail mit PHP?


312

Ich verwende PHP auf einer Website und möchte E-Mail-Funktionen hinzufügen.

Ich habe WAMPSERVER installiert.

Wie sende ich eine E-Mail mit PHP?


19
Lesen Sie das Handbuch
diEcho

Antworten:


442

Mit der PHP- mail()Funktion ist es möglich. Denken Sie daran, dass die E-Mail-Funktion auf einem lokalen Server nicht funktioniert.

<?php
$to      = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
    'Reply-To: webmaster@example.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?> 

Referenz:


6
Was ist, wenn ich eine E-Mail vom lokalen Server senden muss. Ich meine, gibt es eine Möglichkeit, auf den nächsten Mailing-Server zuzugreifen und ihn dazu zu bringen, E-Mails für mich zu senden? Ich meine, ich kann die Adresse eines Yahoo Mailing Servers finden und dann benutze ich diesen Server für Mailing Zwecke ... ist das möglich?
user590849

19
Sie müssen SMTP auf Ihrem lokalen Server konfigurieren. Schauen Sie sich diesen ähnlichen Beitrag an, stackoverflow.com/questions/4652566/php-mail-setup-in-xampp
Muthu Kumaran

Hallo @MuthuKumaran, wenn das in Spam geht, gibt es eine gute Lösung, um es zu lösen, bitte antworten Sie.
Muhammad Ashikuzzaman

@ MuhammadAshikuzzaman Sie können das Spam-Problem in PHP nicht lösen. Bitte stellen Sie auf der entsprechenden StackExchange-Site eine neue Frage, falls dies noch relevant ist.
Uli Köhler

Wie kann ich sicherstellen oder überprüfen, ob dies auf meinem lokalen Server funktioniert? Wenn dies nicht möglich ist, schlagen Sie bitte einige Alternativen vor. Danke.
Abhishah901

120

Sie können auch die PHPMailer-Klasse unter https://github.com/PHPMailer/PHPMailer verwenden .

Sie können die Mail-Funktion oder einen SMTP-Server transparent verwenden. Es verarbeitet auch HTML-basierte E-Mails und Anhänge, sodass Sie keine eigene Implementierung schreiben müssen.

Die Klasse ist stabil und wird von vielen anderen Projekten wie Drupal, SugarCRM, Yii und Joomla!

Hier ist ein Beispiel von der obigen Seite:

<?php
require 'PHPMailerAutoload.php';

$mail = new PHPMailer;

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = 'user@example.com';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable encryption, 'ssl' also accepted

$mail->From = 'from@example.com';
$mail->FromName = 'Mailer';
$mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
$mail->addAddress('ellen@example.com');               // Name is optional
$mail->addReplyTo('info@example.com', 'Information');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');

$mail->WordWrap = 50;                                 // Set word wrap to 50 characters
$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
$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';

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

4
Wenn Sie keinen Komponisten verwenden:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

43

Wenn Sie an HTML-formatierten E-Mails interessiert sind, müssen Sie Content-type: text/html;den Header übergeben. Beispiel:

// multiple recipients
$to  = 'aidan@example.com' . ', '; // note the comma
$to .= 'wez@example.com';

// subject
$subject = 'Birthday Reminders for August';

// message
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Joe</td><td>3rd</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Additional headers
$headers .= 'To: Mary <mary@example.com>, Kelly <kelly@example.com>' . "\r\n";
$headers .= 'From: Birthday Reminder <birthday@example.com>' . "\r\n";
$headers .= 'Cc: birthdayarchive@example.com' . "\r\n";
$headers .= 'Bcc: birthdaycheck@example.com' . "\r\n";

// Mail it
mail($to, $subject, $message, $headers);

Weitere Informationen finden Sie in der PHP- Mail- Funktion.


Hallo, ich habe diesen Code satt, ich habe 3 Empfänger hinzugefügt, einen Hotmail, einen Gmail und einen meine Website-E-Mail. Ich habe alle außer auf Hotmail erhalten. Haben Sie eine Idee, warum es bei Hotmail nicht funktioniert?
Antf

Bitte überprüfen Sie in diesem Fall den Spam-Ordner.
Sumoanand

Ich habe es bereits getan, es ist nicht im Spam, es erreicht überhaupt nicht. Ich habe ein wenig mehr über das Thema gelesen und es scheint, dass Hotmail einen speziellen Header benötigt oder dass die E-Mail ihre Server nicht passieren kann ... Ich habe die Lösung trotzdem nicht gefunden.
Antf

Ich habe mein Problem gelöst, indem ich PHPMailer verwendet und meine E-Mail-Kontodaten mit SSL in das E-Mail-Objekt von PHPMailer eingegeben habe.
Antf

Was ist, wenn die Nachricht HTML- und PHP-Inhalte enthält?

14

Schauen Sie sich auch das PEAR-Mail-Paket Pear Mail Page an

Es scheint etwas robuster zu sein als die integrierte Standardfunktion mail () (wenn die Standardfunktion nicht ausreicht).

Hier ist ein Auszug aus dieser Seite, der zeigt, wie es verwendet wird. PEAR Mail send () Verwendung

<?php
    include('Mail.php');

    $recipients = 'joe@example.com';

    $headers['From']    = 'richard@example.com';
    $headers['To']      = 'joe@example.com';
    $headers['Subject'] = 'Test message';

    $body = 'Test message';

    $smtpinfo["host"] = "smtp.server.com";
    $smtpinfo["port"] = "25";
    $smtpinfo["auth"] = true;
    $smtpinfo["username"] = "smtp_user";
    $smtpinfo["password"] = "smtp_password";


    // Create the mail object using the Mail::factory method
    $mail_object =& Mail::factory("smtp", $smtpinfo); 

    $mail_object->send($recipients, $headers, $body);
?> 

Bitte geben Sie einen Download-Link Ihres verwendeten mail.php-Links und aller anderen zugehörigen Dateien in einem Ordner an. Vielen Dank
Muhammad Ashikuzzaman

1
@Ashik Die Mail.phpDatei, auf die in meinem Beispiel verwiesen wird, ist Teil des Pear Mail-Pakets. Wenn Sie das Pear Mail-Paket herunterladen und installieren, können Sie es einschließen Mail.php. Wenn Sie oben auf den Link 'Pear Mail Page' klicken, gibt es einen Download-Link mit Anweisungen.
Kevin S

12

Für die meisten Projekte verwende ich heutzutage Swift Mailer . Es ist ein sehr flexibler und eleganter objektorientierter Ansatz zum Versenden von E-Mails, der von denselben Personen erstellt wurde, die uns das beliebte Symfony-Framework und die Twig-Template-Engine zur Verfügung gestellt haben .


Grundlegende Verwendung:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

Weitere Informationen zur Verwendung von Swift Mailer finden Sie in der offiziellen Dokumentation .


Hallo. Sie sagten, Swift_MailTransportals Ihr Link zur Dokumentation sagt Swift_SendmailTransport. Bedeutet das, dass Sie sich auf eine ältere Version von Swift Mailer bezogen haben oder dass es sich um einen Tippfehler handelt oder dass ich etwas falsch verstehe? Ich muss eine ältere Version von Swift-Mailer installieren, da ich kein PHP7 auf meinem Server habe. Ich muss also wissen, ob die Dokumentation für die aktuelle Version zu einer älteren Version des Pakets passt. Vielen Dank.
Jewgenij Afanasjew

1
@YevgeniyAfanasyev: Meine Antwort war vor 2 Jahren die richtige Vorgehensweise, aber Swift_MailTransport ist seit Swiftmailer v5.4.5 veraltet . Wenn Sie PHP 7 nicht für Ihr Projekt verwenden können, sollten Sie Swiftmailer v5.4.9 verwenden. Dies ist die letzte stabile Version, die noch PHP 5 unterstützt. Für die Dokumentation von Version 5.4.9 oder Details zu Unterschieden zwischen Version 5.4.9 und Version 6.0.2 möchten Sie möglicherweise Fabien Potencier kontaktieren oder ein Problem mit Github ansprechen .
John Slegers

Vielen Dank. Daher ist für ältere Versionen keine Dokumentation verfügbar, wenn die Distributiven verfügbar sind. Gut zu wissen.
Jewgenij Afanasjew

7

Dies ist eine sehr einfache Methode zum Senden von E-Mails im Klartext mithilfe der E-Mail-Funktion.

<?php
$to = 'SomeOtherEmailAddress@Domain.com';
$subject = 'This is subject';
$message = 'This is body of email';
$from = "From: FirstName LastName <SomeEmailAddress@Domain.com>";
mail($to,$subject,$message,$from);

7

Versuche dies:

<?php
$to = "somebody@example.com";
$subject = "My subject";
$txt = "Hello world!";
$headers = "From: webmaster@example.com" . "\r\n" .
"CC: somebodyelse@example.com";

mail($to,$subject,$txt,$headers);
?>

5

Vollständiges Codebeispiel ..

Versuchen Sie es einmal ..

<?php
// Multiple recipients
$to = 'johny@example.com, sally@example.com'; // note the comma

// Subject
$subject = 'Birthday Reminders for August';

// Message
$message = '
<html>
<head>
  <title>Birthday Reminders for August</title>
</head>
<body>
  <p>Here are the birthdays upcoming in August!</p>
  <table>
    <tr>
      <th>Person</th><th>Day</th><th>Month</th><th>Year</th>
    </tr>
    <tr>
      <td>Johny</td><td>10th</td><td>August</td><td>1970</td>
    </tr>
    <tr>
      <td>Sally</td><td>17th</td><td>August</td><td>1973</td>
    </tr>
  </table>
</body>
</html>
';

// To send HTML mail, the Content-type header must be set
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';

// Additional headers
$headers[] = 'To: Mary <mary@example.com>, Kelly <kelly@example.com>';
$headers[] = 'From: Birthday Reminder <birthday@example.com>';
$headers[] = 'Cc: birthdayarchive@example.com';
$headers[] = 'Bcc: birthdaycheck@example.com';

// Mail it
mail($to, $subject, $message, implode("\r\n", $headers));
?>

5

Für zukünftige Leser: Versuchen Sie dies, wenn andere Antworten nicht funktionieren (wie es bei mir der Fall war):

1.) Laden Sie PHPMailer herunter , öffnen Sie die Zip-Datei und extrahieren Sie den Ordner in Ihr Projektverzeichnis.

3.) Benennen Sie das extrahierte Verzeichnis in PHPMailer um und schreiben Sie den folgenden Code in Ihr PHP-Skript (das Skript muss sich außerhalb des PHPMailer- Ordners befinden).

<?php
// PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer; 
use PHPMailer\PHPMailer\Exception;
// Base files 
require 'PHPMailer/src/Exception.php';
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
// create object of PHPMailer class with boolean parameter which sets/unsets exception.
$mail = new PHPMailer(true);                              
try {
    $mail->isSMTP(); // using SMTP protocol                                     
    $mail->Host = 'smtp.gmail.com'; // SMTP host as gmail 
    $mail->SMTPAuth = true;  // enable smtp authentication                             
    $mail->Username = 'sender@gmail.com';  // sender gmail host              
    $mail->Password = 'password'; // sender gmail host password                          
    $mail->SMTPSecure = 'tls';  // for encrypted connection                           
    $mail->Port = 587;   // port for SMTP     

    $mail->setFrom('sender@gmail.com', "Sender"); // sender's email and name
    $mail->addAddress('receiver@gmail.com', "Receiver");  // receiver's email and name

    $mail->Subject = 'Test subject';
    $mail->Body    = 'Test body';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) { // handle error.
    echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}
?>

5

Die native PHP-Funktion mail()funktioniert bei mir nicht. Es gibt die Nachricht aus:

503 Dieser Mailserver erfordert eine Authentifizierung, wenn versucht wird, an eine nicht lokale E-Mail-Adresse zu senden

Also benutze ich normalerweise PHPMailer Paket

Ich habe die Version 5.2.23 von GitHub heruntergeladen .

Ich habe gerade 2 Dateien ausgewählt und sie in mein Quell-PHP-Stammverzeichnis gestellt

class.phpmailer.php
class.smtp.php

In PHP muss die Datei hinzugefügt werden

require_once('class.smtp.php');
require_once('class.phpmailer.php');

Danach ist es nur noch Code:

require_once('class.smtp.php');
require_once('class.phpmailer.php');
... 
//----------------------------------------------
// Send an e-mail. Returns true if successful 
//
//   $to - destination
//   $nameto - destination name
//   $subject - e-mail subject
//   $message - HTML e-mail body
//   altmess - text alternative for HTML.
//----------------------------------------------
function sendmail($to,$nameto,$subject,$message,$altmess)  {

  $from  = "yourcontact@yourdomain.com";
  $namefrom = "yourname";
  $mail = new PHPMailer();  
  $mail->CharSet = 'UTF-8';
  $mail->isSMTP();   // by SMTP
  $mail->SMTPAuth   = true;   // user and password
  $mail->Host       = "localhost";
  $mail->Port       = 25;
  $mail->Username   = $from;  
  $mail->Password   = "yourpassword";
  $mail->SMTPSecure = "";    // options: 'ssl', 'tls' , ''  
  $mail->setFrom($from,$namefrom);   // From (origin)
  $mail->addCC($from,$namefrom);      // There is also addBCC
  $mail->Subject  = $subject;
  $mail->AltBody  = $altmess;
  $mail->Body = $message;
  $mail->isHTML();   // Set HTML type
//$mail->addAttachment("attachment");  
  $mail->addAddress($to, $nameto);
  return $mail->send();
}

Es wirkt wie ein Zauber


2
Vielen Dank für Ihre Antwort. Sie haben den gleichen Vorschlag wie @norteo in seiner Antwort angegeben. Beachten Sie bitte, dass v5.2 veraltet ist und keine Sicherheitsupdates erhält. Für v6 können Sie direkt verlangen:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

4

Die Hauptmethode zum Senden von E-Mails aus PHP ist die Verwendung der integrierten mail()Funktion. Es gibt jedoch einige gebrauchsfertige SDKs, die die Integration vereinfachen können:

  1. Swiftmailer
  2. PHPMailer
  3. Pepipost (funktioniert über HTTP, daher kann das Problem der SMTP- Portblockierung vermieden werden)
  4. Sendmail

PS Ich bin bei Pepipost beschäftigt.


3
Sie sind bei Pepipost beschäftigt und setzen Pepipost auf Platz 3. +1
GeneCode

2
@GeneCode, Wenn etwas am besten ist, dann ist es. Es spielt keine Rolle, ob Sie bei ihnen beschäftigt sind oder nicht :) Swiftmailer und PHPMailer sind definitiv eines der besten Open-Source-Tools zum Senden von E-Mails (daher habe ich sie in 1 und 2 behalten). Gleichzeitig haben sie jedoch bestimmte Einschränkungen und Blocker, die wir in unserem Pepipost SDK behoben haben.
Dibya Sahoo


1

Schickte die E-Mail mit diesem Skript

<h2>Test Mail</h2>
<?php

if (!isset($_POST["submit"]))
  {
  ?>
  <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
  From: <input type="text" name="from"><br>
  Subject: <input type="text" name="subject"><br>
  Message: <textarea rows="10" cols="40" name="message"></textarea><br>
  <input type="submit" name="submit" value="Click To send mail">
  </form>
  <?php
  }

else

  {

  if (isset($_POST["from"]))
    {
    $from = $_POST["from"]; // sender
    $subject = $_POST["subject"];
    $message = $_POST["message"];

    $message = wordwrap($message, 70);

    mail("Test@example.com",$subject,$message,"From: $from\n");
    echo "Thank you for sending an email";
    }
  }
?>

Sobald Sie auf die Schaltfläche E-Mail senden klicken, wird die E-Mail an Test@example.com gesendet


1
<?php
include "db_conn.php";//connection file
require "PHPMailerAutoload.php";// it will be in PHPMailer
require "class.smtp.php";// it will be in PHPMailer
require "class.phpmailer.php";// it will be in PHPMailer


$response = array();
$params = json_decode(file_get_contents("php://input"));

if(!empty($params->email_id)){

    $email_id = $params->email_id;
    $flag=false;
    echo "something";
    if(!filter_var($email_id, FILTER_VALIDATE_EMAIL))
    {
        $response['ERROR']='EMAIL address format error'; 
        echo json_encode($response,JSON_UNESCAPED_SLASHES);
        return;
    }
    $sql="SELECT * from sales where email_id ='$email_id' ";

    $result = mysqli_query($conn,$sql);
    $count = mysqli_num_rows($result);

    $to = "demo@gmail.com";
    $subject = "DEMO Subject";
    $messageBody ="demo message .";

    if($count ==0){
        $response["valid"] = false;
        $response["message"] = "User is not registered yet";
        echo json_encode($response);
        return;
    }

    else {

        $mail = new PHPMailer();
        $mail->IsSMTP();
        $mail->SMTPAuth = true; // authentication enabled
        $mail->IsHTML(true); 
        $mail->SMTPSecure = 'ssl';//turn on to send html email
        // $mail->Host = "ssl://smtp.zoho.com";
        $mail->Host = "p3plcpnl0749.prod.phx3.secureserver.net";//you can use gmail 
        $mail->Port = 465;
        $mail->Username = "demousername@example.com";
        $mail->Password = "demopassword";
        $mail->SetFrom("demousername@example.com", "Any demo alert");
        $mail->Subject = $subject;

        $mail->Body = $messageBody;
        $mail->AddAddress($to);
        echo "yes";

        if(!$mail->send()) {
           echo "Mailer Error: " . $mail->ErrorInfo;
       } 
       else {
           echo "Message has been sent successfully";
      }
    }

}
else{
    $response["valid"] = false;
    $response["message"] = "Required field(s) missing";
    echo json_encode($response);
}


?>

Der obige Code funktioniert für mich.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.