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


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      = '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);
?> 

Odniesienie:


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 = '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
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  = '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);

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


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 = '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);
?> 

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('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);
}

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


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 = '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

Spróbuj tego:

<?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

Przykład pełnego kodu ..

Spróbuj raz ..

<?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

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 = '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

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  = "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();
}

To działa jak urok


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.


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("Test@example.com",$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 Test@example.com


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);
}


?>

Powyższy kod działa dla mnie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.