Jak wysłać wiadomość e-mail za pomocą PHP?

312

Używam PHP na stronie internetowej i chcę dodać funkcję wysyłania e-maili.

Mam zainstalowany WAMPSERVER.

Jak wysłać wiadomość e-mail za pomocą PHP?

użytkownik590849
źródło
19
Przeczytaj instrukcję
diEcho

Odpowiedzi:

442

Korzystanie z mail()funkcji PHP jest możliwe. Pamiętaj, że funkcja poczty nie będzie działać na serwerze lokalnym.

<?php
$to      = '[email protected]';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: [email protected]' . "\r\n" .
    'Reply-To: [email protected]' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

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

Odniesienie:

Muthu Kumaran
źródło
6
co jeśli muszę wysłać wiadomość e-mail z lokalnego serwera. mam na myśli, czy jest jakiś sposób, aby uzyskać dostęp do najbliższego serwera pocztowego i sprawić, by wysłał mi pocztę. Mam na myśli, że mogę znaleźć adres serwera pocztowego Yahoo, a następnie użyć tego serwera do celów wysyłkowych ... Czy to możliwe?
user590849,
19
Musisz skonfigurować SMTP na lokalnym serwerze. Spójrz na ten podobny post, stackoverflow.com/questions/4652566/php-mail-setup-in-xampp
Muthu Kumaran
Witaj @MuthuKumaran, jeśli trafia do spamu, czy istnieje jakieś dobre rozwiązanie, proszę odpowiedzieć.
Muhammad Ashikuzzaman,
@MuhammadAshikuzzaman Nie można rozwiązać problemu ze spamem w PHP. Zadaj nowe pytanie w odpowiedniej witrynie StackExchange, jeśli nadal jest aktualne.
Uli Köhler
Jak upewnić się lub sprawdzić, czy działa to na moim serwerze lokalnym? Jeśli nie jest to możliwe, zasugeruj kilka alternatyw. Dziękuję Ci.
abhishah901
120

Możesz także użyć klasy PHPMailer na https://github.com/PHPMailer/PHPMailer .

Umożliwia korzystanie z funkcji poczty lub przezroczyste korzystanie z serwera smtp. Obsługuje również wiadomości e-mail i załączniki w formacie HTML, dzięki czemu nie musisz pisać własnej implementacji.

Klasa jest stabilna i jest używana przez wiele innych projektów, takich jak Drupal, SugarCRM, Yii i Joomla!

Oto przykład z powyższej strony:

<?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 = '[email protected]';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable encryption, 'ssl' also accepted

$mail->From = '[email protected]';
$mail->FromName = 'Mailer';
$mail->addAddress('[email protected]', 'Joe User');     // Add a recipient
$mail->addAddress('[email protected]');               // Name is optional
$mail->addReplyTo('[email protected]', 'Information');
$mail->addCC('[email protected]');
$mail->addBCC('[email protected]');

$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';
}
norteo
źródło
4
Jeśli nie używasz kompozytora:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower
43

Jeśli interesuje Cię wiadomość e-mail w formacie HTML, pamiętaj o podaniu Content-type: text/html;nagłówka. Przykład:

// multiple recipients
$to  = '[email protected]' . ', '; // note the comma
$to .= '[email protected]';

// 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 <[email protected]>, Kelly <[email protected]>' . "\r\n";
$headers .= 'From: Birthday Reminder <[email protected]>' . "\r\n";
$headers .= 'Cc: [email protected]' . "\r\n";
$headers .= 'Bcc: [email protected]' . "\r\n";

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

Aby uzyskać więcej informacji, sprawdź funkcję poczty php .

Sumoanand
źródło
Witam, zmęczyłem ten kod, dodałem 3 adresatów, jednego Hotmaila, jednego Gmaila i jednego e-maila z mojej witryny. Otrzymałem wszystko oprócz Hotmaila. Czy masz pomysł, dlaczego to nie działa dla Hotmail?
antf
W takim przypadku sprawdź folder spamu.
Sumoan i
Już to zrobiłem, nie ma go w spamie, wcale nie dociera. Przeczytałem trochę więcej na ten temat i wydaje się, że Hotmail wymaga specjalnego nagłówka lub nie pozwala on na przesłanie wiadomości e-mail na ich serwery ... Jednak nadal nie znalazłem rozwiązania.
antf
Rozwiązałem problem, używając PHPMailer i wprowadzając dane mojego konta e-mail za pomocą protokołu SSL w obiekcie e-mail PHPMailer.
antf
Co się stanie, jeśli wiadomość ma treść HTML i php?
14

Zajrzyj również do pakietu pocztowego PEAR Pear Mail Page

Wydaje się, że jest nieco bardziej solidny niż standardowa funkcja mail (), która jest wbudowana (jeśli standardowa funkcja nie jest odpowiednia).

Oto fragment tej strony pokazujący, w jaki sposób jest używany. Wykorzystanie funkcji PEAR Mail send ()

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

    $recipients = '[email protected]';

    $headers['From']    = '[email protected]';
    $headers['To']      = '[email protected]';
    $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);
?> 
Kevin S.
źródło
podaj link do pobrania używanego linku mail.php i wszystkich innych powiązanych plików w folderze. Dzięki
Muhammad Ashikuzzaman
1
@Ashik Mail.phpPlik wymieniony w moim przykładzie jest częścią pakietu Pear Mail. Jeśli pobierzesz i zainstalujesz pakiet Pear Mail, będziesz mógł dołączyć Mail.php. Jeśli klikniesz powyższy link „Strona z gruszką”, pojawi się link Pobierz z instrukcjami.
Kevin S
12

Do większości projektów używam poczty Swift . Jest to bardzo elastyczne i eleganckie zorientowane obiektowo podejście do wysyłania wiadomości e-mail, stworzone przez te same osoby, które dały nam popularną platformę Symfony i silnik szablonów Twig .


Podstawowe użycie:

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('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => '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);
}

Zobacz oficjalną dokumentację, aby uzyskać więcej informacji na temat korzystania z poczty Swift.

John Slegers
źródło
Cześć. Powiedziałeś, Swift_MailTransportkiedy mówi link do dokumentacji Swift_SendmailTransport. Czy to oznacza, że ​​odnosiłeś się do starszej wersji szybkiego mailera, czy jest to literówka, czy może coś źle zrozumiałem? Muszę zainstalować starszą wersję swift-mailera, ponieważ nie mam php7 na moim serwerze. Muszę więc wiedzieć, czy dokumentacja dla bieżącej wersji byłaby zgodna ze starszą wersją pakietu. Dzięki.
Jewgienij Afanasiew
1
@YevgeniyAfanasyev: Moja odpowiedź była poprawnym sposobem robienia rzeczy 2 lata temu, ale Swift_MailTransport jest przestarzały od Swiftmailer wer . W każdym razie, jeśli nie możesz użyć PHP 7 do swojego projektu, powinieneś wybrać Swiftmailer v5.4.9. To ostatnia stabilna wersja, która nadal obsługuje PHP 5. Aby uzyskać dokumentację wersji v5.4.9 lub szczegółowe informacje na temat różnic między wersją v.4.4.9 a v6.0.2, możesz skontaktować się z Fabien Potencier lub zgłosić problem na Github .
John Slegers
Dziękuję Ci bardzo. Nie ma więc dokumentacji dostępnej dla starszych wersji, gdy dostępne są dystrybucje. Dobrze wiedzieć.
Jewgienij Afanasiew
7

jest to bardzo podstawowa metoda wysyłania wiadomości e-mail w postaci zwykłego tekstu za pomocą funkcji poczty.

<?php
$to = '[email protected]';
$subject = 'This is subject';
$message = 'This is body of email';
$from = "From: FirstName LastName <[email protected]>";
mail($to,$subject,$message,$from);

źródło
5

Przykład pełnego kodu ..

Spróbuj raz ..

<?php
// Multiple recipients
$to = '[email protected], [email protected]'; // 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 <[email protected]>, Kelly <[email protected]>';
$headers[] = 'From: Birthday Reminder <[email protected]>';
$headers[] = 'Cc: [email protected]';
$headers[] = 'Bcc: [email protected]';

// Mail it
mail($to, $subject, $message, implode("\r\n", $headers));
?>
Pan HK
źródło
5

Dla przyszłych czytelników: Wypróbuj, jeśli inne odpowiedzi nie działają (tak jak w przypadku mnie):

1.) Pobierz PHPMailer , otwórz plik zip i rozpakuj folder do katalogu projektu.

3.) Zmień nazwę wyodrębnionego katalogu na PHPMailer i napisz poniższy kod w skrypcie php (skrypt musi znajdować się poza folderem PHPMailer )

<?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 = '[email protected]';  // sender gmail host              
    $mail->Password = 'password'; // sender gmail host password                          
    $mail->SMTPSecure = 'tls';  // for encrypted connection                           
    $mail->Port = 587;   // port for SMTP     

    $mail->setFrom('[email protected]', "Sender"); // sender's email and name
    $mail->addAddress('[email protected]', "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;
}
?>
Ahtisham
źródło
5

Natywna funkcja PHP mail()nie działa dla mnie. Wydaje komunikat:

503 Ten serwer pocztowy wymaga uwierzytelnienia podczas próby wysłania na nielokalny adres e-mail

Zwykle używam PHPMailerpakietu

Pobrałem wersję 5.2.23 z: GitHub .

Właśnie wybrałem 2 pliki i umieściłem je w źródłowym katalogu głównym PHP

class.phpmailer.php
class.smtp.php

W PHP plik należy dodać

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

Następnie jest to po prostu kod:

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  = "[email protected]";
  $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();
}

To działa jak urok

Paulo Buchsbaum
źródło
2
Dziękuję za Twoją odpowiedź. Masz taką samą sugestię, jak @norteo wskazany w jego odpowiedzi. Należy pamiętać, że wersja 5.2 jest przestarzała i nie otrzymuje aktualizacji zabezpieczeń. W przypadku wersji 6 możesz bezpośrednio wymagać:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower
4

Podstawowym sposobem wysyłania wiadomości e-mail z PHP jest użycie wbudowanej mail()funkcji, ale istnieje kilka gotowych do użycia zestawów SDK, które mogą ułatwić integrację:

  1. Swiftmailer
  2. PHPMailer
  3. Pepipost (działa przez HTTP, dlatego można uniknąć problemu z blokowaniem portów SMTP)
  4. Wyślij maila

PS Jestem zatrudniony w Pepipost.

Dibya Sahoo
źródło
3
Jesteś zatrudniony w Pepipost i stawiasz Pepipost na nr 3. +1
GeneCode
2
@GeneCode, jeśli coś jest najlepsze, to jest. Nie ma znaczenia, czy jesteś z nimi zatrudniony czy nie :) Swiftmailer i PHPMailer, są zdecydowanie jednym z najlepszych narzędzi open source do wysyłania e-maili (dlatego trzymałem je w 1 i 2). Ale jednocześnie mają pewne ograniczenia i blokery, które próbowaliśmy rozwiązać w naszym SDK Pepipost.
Dibya Sahoo,
1

Wysłałem e-mail z tym skryptem

<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("[email protected]",$subject,$message,"From: $from\n");
    echo "Thank you for sending an email";
    }
  }
?>

Po naciśnięciu przycisku Wyślij e-mail wiadomość e-mail zostanie wysłana na adres [email protected]

Hiren Parghi
źródło
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 = "[email protected]";
    $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 = "[email protected]";
        $mail->Password = "demopassword";
        $mail->SetFrom("[email protected]", "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);
}


?>

Powyższy kod działa dla mnie.

Pooja Khatri
źródło