Як надіслати електронний лист за допомогою PHP?


312

Я використовую PHP на веб-сайті і хочу додати функціональність електронної пошти.

У мене встановлено WAMPSERVER.

Як надіслати електронний лист за допомогою PHP?


19
Прочитайте посібник
diEcho

Відповіді:


442

За допомогою mail()функції PHP це можливо. Пам'ятайте, що функція пошти не працюватиме на локальному сервері.

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

Довідка:


6
Що робити, якщо мені потрібно надіслати електронний лист з локального сервера. Я маю на увазі, чи є спосіб отримати доступ до найближчого поштового сервера і змусити його надсилати пошту для мене. я маю на увазі, що я можу знайти адресу сервера розсилки Yahoo, а потім я використовую цей сервер для цілей розсилки ... чи це можливо?
user590849

19
Вам потрібно налаштувати SMTP на локальному сервері. Подивіться на цей подібний пост, stackoverflow.com/questions/4652566/php-mail-setup-in-xampp
Муту Кумаран

Привіт @MuthuKumaran, якщо це іде в спамі, чи є хороше рішення для його вирішення, будь ласка, дайте відповідь.
Мухаммед Ашикуззаман

@MuhammadAshikuzzaman Ви не можете вирішити проблему зі спамом у PHP. Будь ласка, задайте нове запитання на відповідному сайті StackExchange, якщо це все ще актуально.
Uli Köhler

Як переконатися чи перевірити, чи працює це на моєму локальному сервері? Якщо неможливі способи зробити це, запропонуйте будь-які альтернативи, будь ласка. Дякую тобі.
abhishah901

120

Ви також можете використовувати клас PHPMailer на https://github.com/PHPMailer/PHPMailer .

Це дозволяє використовувати функцію пошти або прозоро використовувати сервер smtp. Він також обробляє електронні листи та вкладення на основі HTML, тому вам не доведеться писати власну реалізацію.

Клас стабільний, і його використовують у багатьох інших проектах, таких як Drupal, SugarCRM, Yii та Joomla!

Ось приклад зі сторінки вище:

<?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
Якщо не використовується композитор:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

43

Якщо вас цікавить електронна пошта у форматі html, переконайтеся, що введіть її Content-type: text/html;в заголовок. Приклад:

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

Для отримання більш детальної інформації перевірте функцію пошти php .


Привіт, я набридла цим кодом, я додала 3 одержувачів, одного Hotmail, одного Gmail та одного електронного листа на свій веб-сайт. Я отримав усі, крім Hotmail. Чи маєте ви уявлення, чому це не працює для Hotmail?
antf

Перевірте папку зі спамом у цьому випадку.
Sumoanand

Я вже це робив, це не в спамі, воно взагалі не доходить. Я прочитав трохи більше про цю тему, і, здається, Hotmail вимагає якогось спеціального заголовка, або він не дозволяє електронній пошті передавати їхні сервери ... Я все ж не знайшов рішення.
antf

Я вирішив свою проблему, використовуючи PHPMailer і ввівши дані свого облікового запису електронної пошти з SSL в об’єкт електронної пошти PHPMailer.
antf

Що робити, якщо повідомлення містить вміст HTML та php?

14

Також загляньте у поштовий пакет PEAR Pear Mail Page

Це здається трохи надійнішим за вбудовану стандартну функцію mail () (якщо стандартна функція не є адекватною).

Ось уривок з цієї сторінки, що показує, як вона використовується. Використання PEAR поштою ()

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

будь ласка, дайте посилання для завантаження використаного посилання mail.php та всіх інших пов'язаних файлів у папці. Спасибі
Мухаммед Ашикуззаман

1
@Ashik Mail.phpФайл, на який посилається у моєму прикладі, є частиною пакету грушної пошти. Якщо ви завантажите та встановите пакет Pear Mail, ви зможете включити його Mail.php. Якщо ви натиснете на посилання "Сторінка грушної пошти" вище, з'явиться посилання "Завантажити" з інструкціями.
Кевін S

12

У більшості проектів я сьогодні використовую електронну пошту Swift . Це дуже гнучкий та елегантний об'єктно-орієнтований підхід до надсилання електронних листів, створений тими ж людьми, які подарували нам популярну рамку Symfony та двигун шаблонів Twig .


Основне використання:

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

Дивіться офіційну документацію для отримання додаткової інформації про те, як користуватися розсилкою Swift.


Привіт. Ви сказали, Swift_MailTransportколи пише ваше посилання на документацію Swift_SendmailTransport. Це означає, що ви посилалися на старішу версію швидкої пошти або це помилка, або, можливо, я щось неправильно зрозумів? Мені потрібно встановити старішу версію swift-mailer, оскільки у мене на сервері немає php7. Тому мені потрібно знати, чи не буде документація на поточну версію зі старшою версією пакета. Дякую.
Євген Афанасьєв

1
@YevgeniyAfanasyev: Моя відповідь була правильним способом робити справи 2 роки тому, але Swift_MailTransport був застарілий з часу Swiftmailer v5.4.5 . У будь-якому випадку, якщо ви не можете використовувати PHP 7 для свого проекту, вам слід перейти з Swiftmailer v5.4.9. Це остання стабільна версія, яка все ще підтримує PHP 5. Для документації версії v5.4.9 або деталей щодо відмінностей між v5.4.9 і v6.0.2, ви можете звернутися до Fabien Potencier або порушити проблему на Github .
John Slegers

Дуже дякую. Таким чином, для старшої версії, коли доступні дистрибутори, немає жодної документації. Добре знати.
Євген Афанасьєв

7

це дуже базовий спосіб надсилання простого текстового повідомлення електронною поштою за допомогою функції пошти.

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

Спробуйте це:

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

Повний код приклад ..

Спробуйте один раз ..

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

Для майбутніх читачів: Спробуйте це, якщо інші відповіді не спрацюють (як це було у мене):

1.) Завантажте PHPMailer , відкрийте поштовий файл і витягніть папку у каталог вашого проекту.

3.) Перейменуйте витягнутий каталог у PHPMailer та напишіть код нижче у вашому скрипті php (сценарій повинен бути поза папкою 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

Власна функція PHP mail()не працює для мене. Він видає повідомлення:

503 Цей поштовий сервер вимагає автентифікації під час спроби надсилання на не місцеву адресу електронної пошти

Отже, я зазвичай використовую PHPMailerпакет

Я завантажив версію 5.2.23 з: GitHub .

Я тільки що вибрав 2 файли і помістив їх у свій вихідний корінь PHP

class.phpmailer.php
class.smtp.php

У PHP файл потрібно додати

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

Після цього це просто код:

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

Це працює як шарм


2
Спасибі за вашу відповідь. Ви маєте ту саму пропозицію, що і @norteo, вказану у його відповіді. Зауважте, що версія v5.2 застаріла і не отримує оновлень безпеки. Для v6 можна безпосередньо вимагати:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

4

Основним способом надсилання електронних листів з PHP є використання вбудованої mail()функції, але є кілька готових до використання SDK, які можуть полегшити інтеграцію:

  1. Швидкий мейлер
  2. PHPMailer
  3. Pepipost (працює над HTTP, отже, проблему блоку портів SMTP можна уникнути)
  4. Sendmail

PS Я працевлаштований у Pepipost.


3
Ви працевлаштовані у Pepipost, і ви ставите Pepipost у №3. +1
GeneCode

2
@GeneCode, Якщо щось найкраще, то це так. Не важливо, працюєте ви з ними чи ні :) Swiftmailer та PHPMailer, безумовно, є одним з найкращих інструментів з відкритим кодом для надсилання електронних листів (отже, я зберігав їх у 1 і 2). Але, водночас, у них є певні обмеження та блокатори, до яких ми намагалися вирішити свою проблему у нашому SDK щодо Pepipost.
Діб'я Саху

3

Ви можете використовувати веб-сервіс електронної пошти, наприклад Поштова марка, Sendgrid тощо.

Sendgrid vs Postmark vs Amazon SES та інші провайдери API / SMTP API?

Редагувати: я просто використовую API Gmail Gmail . У мене виникли проблеми з надсиланням нагадування електронною поштою до організації мого роботодавця через суворі фільтри. Але Gmail працює до тих пір, поки ви не спамуєте людей.


1

Надіслано електронний лист із цим сценарієм

<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";
    }
  }
?>

Після натискання кнопки "Надіслати електронну пошту" повідомлення електронної пошти буде надіслано на адресу 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);
}


?>

Наведений вище код працює для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.