Làm thế nào để gửi email bằng PHP?


Câu trả lời:


442

Sử dụng mail()chức năng của PHP là có thể. Hãy nhớ chức năng thư sẽ không hoạt động trên máy chủ cục bộ.

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

Tài liệu tham khảo:


6
Nếu tôi cần gửi email từ máy chủ cục bộ thì sao? ý tôi là có cách nào để truy cập máy chủ gửi thư gần nhất và làm cho nó gửi thư cho tôi. ý tôi là tôi có thể tìm địa chỉ của một máy chủ gửi thư yahoo và sau đó tôi sử dụng máy chủ đó cho mục đích gửi thư ... điều này có thể không?
dùng590849

19
Bạn cần cấu hình SMTP trên máy chủ cục bộ của bạn. Hãy xem bài đăng tương tự này, stackoverflow.com/questions/4652566/php-mail-setup-in-xampp
Muthu Kumaran 17/03/2016

Xin chào @MuthuKumaran nếu thư rác có giải pháp tốt để giải quyết nó, vui lòng trả lời.
Muhammad Ashikuzzaman

@MuhammadAshikuzzaman Bạn không thể giải quyết vấn đề thư rác trong PHP. Vui lòng đặt câu hỏi mới trên trang web StackExchange thích hợp nếu điều này vẫn còn liên quan.
Uli Köhler

Làm thế nào để đảm bảo hoặc xác minh nếu điều này hoạt động trên máy chủ cục bộ của tôi? Nếu không thể phương pháp để làm như vậy, đề nghị một số lựa chọn thay thế xin vui lòng. cảm ơn bạn.
abhishah901

120

Bạn cũng có thể sử dụng lớp PHPMailer tại https://github.com/PHPMailer/PHPMailer .

Nó cho phép bạn sử dụng chức năng thư hoặc sử dụng máy chủ smtp trong suốt. Nó cũng xử lý các email và tệp đính kèm dựa trên HTML để bạn không phải viết bản thực hiện của riêng mình.

Lớp này ổn định và được sử dụng bởi nhiều dự án khác như Drupal, SugarCRM, Yii và Joomla!

Đây là một ví dụ từ trang trên:

<?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
Nếu không sử dụng trình soạn nhạc:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

43

Nếu bạn quan tâm đến email định dạng html, hãy đảm bảo vượt qua Content-type: text/html;trong tiêu đề. Thí dụ:

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

Để biết thêm chi tiết, kiểm tra chức năng thư php .


Xin chào, tôi mệt mỏi với mã này, tôi đã thêm 3 người nhận, một Hotmail, một Gmail và một email trang web của tôi. Tôi đã nhận được tất cả ngoại trừ trên Hotmail. Bạn có biết tại sao nó không hoạt động cho Hotmail không?
antf

Vui lòng kiểm tra thư mục thư rác trong trường hợp đó.
Sumoanand

Tôi đã làm rồi, nó không nằm trong thư rác, nó không đạt được. Tôi đã đọc thêm một chút về chủ đề này và có vẻ như Hotmail yêu cầu một số tiêu đề đặc biệt hoặc nó không cho phép email vượt qua máy chủ của họ ... Mặc dù vậy tôi vẫn không tìm thấy giải pháp.
antf

Tôi đã giải quyết vấn đề của mình bằng cách sử dụng PHPMailer và nhập dữ liệu tài khoản email của mình bằng SSL vào đối tượng email của PHPMailer.
antf

Nếu tin nhắn có nội dung HTML và php thì sao?

14

Cũng xem xét gói thư PEAR Trang Pear Mail

Nó dường như mạnh hơn một chút so với hàm mail () tiêu chuẩn được tích hợp (nếu chức năng tiêu chuẩn không đủ).

Đây là một đoạn trích từ trang này cho thấy nó được sử dụng như thế nào. PEAR Mail gửi () sử dụng

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

vui lòng cung cấp liên kết tải xuống của liên kết mail.php đã sử dụng của bạn và tất cả các tệp được liên kết khác trong một thư mục. Cảm ơn
Muhammad Ashikuzzaman

1
@Ashik Mail.phpTệp được tham chiếu trong ví dụ của tôi là một phần của gói Pear Mail. Nếu bạn tải xuống và cài đặt gói Pear Mail, bạn sẽ có thể bao gồm Mail.php. Nếu bạn nhấp vào liên kết 'Trang thư Pear' ở trên, có một liên kết Tải xuống có hướng dẫn.
Kevin S

12

Đối với hầu hết các dự án, tôi sử dụng Swift mailer những ngày này. Đó là một cách tiếp cận hướng đối tượng rất linh hoạt và thanh lịch để gửi email, được tạo ra bởi chính những người đã cho chúng tôi khung công tác Symfony phổ biến và công cụ mẫu Twig .


Cách sử dụng cơ bản:

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

Xem tài liệu chính thức để biết thêm thông tin về cách sử dụng Swift mailer.


Chào. Bạn nói Swift_MailTransportkhi liên kết của bạn đến tài liệu nói Swift_SendmailTransport. Điều đó có nghĩa là bạn đang đề cập đến phiên bản cũ hơn của mail swift hay đó là một lỗi đánh máy, hoặc có thể tôi hiểu nhầm điều gì đó? Tôi cần cài đặt phiên bản cũ hơn của swift-mailer vì tôi không có php7 trên máy chủ của mình. Vì vậy, tôi cần phải biết nếu tài liệu cho phiên bản hiện tại sẽ đi với phiên bản cũ hơn của gói. Cảm ơn.
Yevgeniy Afanasyev

1
@YevgeniyAfanasyev: Câu trả lời của tôi là cách chính xác để thực hiện 2 năm trước, nhưng Swift_MailTransport đã không được chấp nhận kể từ Swiftmailer v5.4.5 . Dù sao, nếu bạn không thể sử dụng PHP 7 cho dự án của mình, bạn nên dùng Swiftmailer v5.4.9. Đó là phiên bản ổn định cuối cùng vẫn hỗ trợ PHP 5. Đối với tài liệu của phiên bản v5.4.9 hoặc chi tiết về sự khác biệt giữa v5.4.9 và v6.0.2, bạn có thể muốn liên hệ với Fabien Potencier hoặc nêu vấn đề trên Github .
John Slegers

Cảm ơn rât nhiều. Vì vậy, không có tài liệu nào có sẵn cho phiên bản cũ hơn, khi các bản phân phối có sẵn. Tốt để biết.
Yevgeniy Afanasyev

7

đây là phương pháp rất cơ bản để gửi email văn bản đơn giản bằng chức năng thư.

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

Thử cái này:

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

Ví dụ mã đầy đủ ..

Hãy thử một lần ..

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

Đối với độc giả tương lai: Hãy thử điều này nếu các câu trả lời khác không hoạt động (Như trường hợp của tôi):

1.) Tải xuống PHPMailer , mở tệp zip và giải nén thư mục vào thư mục dự án của bạn.

3.) Đổi tên thư mục được trích xuất thành PHPMailer và viết mã bên dưới vào tập lệnh php của bạn (tập lệnh phải nằm ngoài thư mục 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

Hàm PHP gốc mail()không hoạt động đối với tôi. Nó đưa ra thông báo:

503 Máy chủ thư này yêu cầu xác thực khi cố gửi đến một địa chỉ email không cục bộ

Vì vậy, tôi thường sử dụng PHPMailergói

Tôi đã tải xuống phiên bản 5.2.23 từ: GitHub .

Tôi vừa chọn 2 tệp và đặt chúng vào thư mục gốc PHP của mình

class.phpmailer.php
class.smtp.php

Trong PHP, tập tin cần phải được thêm vào

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

Sau này, nó chỉ là mã:

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

Nó hoạt động như một say mê


2
Cảm ơn bạn vì câu trả lời. Bạn có cùng một gợi ý như @norteo chỉ ra trong câu trả lời của anh ấy. Xin lưu ý rằng v5.2 không được dùng nữa và không nhận được cập nhật bảo mật. Đối với v6, bạn có thể yêu cầu trực tiếp:use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once('src/PHPMailer.php'); require_once('src/Exception.php');
Wtower

4

Cách cốt lõi để gửi email từ PHP là sử dụng mail()chức năng tích hợp sẵn của nó , nhưng có một vài SDK sẵn sàng sử dụng có thể dễ dàng tích hợp:

  1. Swiftmailer
  2. Trình soạn thảo PHP
  3. Pepipost (hoạt động trên HTTP do đó có thể tránh được sự cố chặn cổng SMTP)
  4. Gửi thư

Tái bút: Tôi đang làm việc với Pepipost.


3
Bạn được tuyển dụng với Pepipost và bạn đặt Pepipost ở vị trí thứ 3. +1
GeneCode

2
@GeneCode, Nếu cái gì đó là tốt nhất, thì nó là. Không quan trọng bạn có làm việc với họ hay không :) Swiftmailer và PHPMailer, chắc chắn là một trong những công cụ nguồn mở tốt nhất để gửi email (do đó tôi giữ chúng trong 1 và 2). Nhưng, đồng thời, họ có những hạn chế và trình chặn nhất định mà chúng tôi đã cố gắng giải quyết trong SDK Pepipost của chúng tôi.
Dibya Sahoo


1

Đã gửi Email với tập lệnh này

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

Khi bạn nhấn nút Gửi email, email sẽ được gửi đến 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);
}


?>

Các mã trên đang làm việc cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.