Gửi email PHP MySQL

Có nhiều cách bạn có thể gửi email cho khách hàng được lấy từ cơ sở dữ liệu. Trong bài viết này, tôi sẽ giải thích mã mà tôi đã viết để gửi email hàng loạt đến danh sách khách hàng được lấy từ cơ sở dữ liệu MySQL

Trang đăng nhập an toàn bằng PHP với MySQL

Vui lòng bật JavaScript

Trang đăng nhập an toàn bằng PHP với MySQL với mã nguồn Tải xuống miễn phí 2021

Tập lệnh PHP để gửi Email

Mã nhỏ nhất bạn có thể viết để gửi email bằng PHP ở bên dưới

[email protected]";
 
   if ( mail($to, $subject, $body, $header)) {
      echo("Success");
   } else {
      echo("Failed");
   }
?>

Bây giờ hãy mở rộng mã này để gửi email đến danh sách khách hàng. Chúng tôi sẽ lấy danh sách khách hàng từ cơ sở dữ liệu MySQL

Chào mừng bạn đến với hướng dẫn cách gửi email hàng loạt bằng PHP và MYSQL. Tôi biết, PHP không được tạo chính xác để xử lý email hàng loạt và thật kỳ lạ là có rất ít giải pháp trên Internet, với một số trong số đó là các tập lệnh trả phí. Chà, một số trong số đó là tốt, nhưng một vài trong số đó khiến tôi phải lắc đầu – Đặc biệt là một “giải pháp” với AJAX long polling

Một cách đáng tin cậy hơn để gửi hàng loạt bản tin email bằng PHP và MYSQL là

  • Tạo bảng cơ sở dữ liệu để lưu trữ danh sách người đăng ký
  • Tạo thư viện bản tin PHP sẽ gửi hàng loạt bản tin email cho người đăng ký theo đợt
  • Chạy tập lệnh PHP trong dòng lệnh

Điều này được thực hiện như thế nào?

ⓘ Tôi đã bao gồm một tệp zip chứa tất cả mã nguồn khi bắt đầu hướng dẫn này, vì vậy bạn không cần phải sao chép-dán mọi thứ… Hoặc nếu bạn chỉ muốn đi sâu vào

 

 

TLDR – TRANG TRÌNH BÀY NHANH

Tải xuống & Ghi chú

 

TẢI XUỐNG & LƯU Ý

Đầu tiên, đây là liên kết tải xuống mã nguồn như đã hứa

 

GHI CHÚ NHANH

  • Tạo cơ sở dữ liệu và nhập 1-database.sql
  • Thay đổi cài đặt cơ sở dữ liệu trong 2-lib-newsletter.php thành cài đặt của riêng bạn
  • Chạy 3b-process.php trong dòng lệnh
Nếu bạn phát hiện ra một lỗi, hãy bình luận bên dưới. Tôi cũng cố gắng trả lời các câu hỏi ngắn, nhưng đó là một người so với cả thế giới… Nếu bạn cần câu trả lời gấp, vui lòng xem danh sách các trang web của tôi để được trợ giúp về lập trình

 

MÃ VÍ DỤ TẢI XUỐNG

Nhấp vào đây để tải xuống mã nguồn, tôi đã phát hành nó theo giấy phép MIT, vì vậy hãy thoải mái xây dựng trên mã nguồn hoặc sử dụng nó trong dự án của riêng bạn

 

 

PHP GỬI SỐ LƯỢNG LỚN BẢN TIN EMAIL

Được rồi, bây giờ chúng ta hãy bắt đầu với ví dụ về cách gửi bản tin email hàng loạt bằng PHP MYSQL

 

BƯỚC 1) BẢNG CƠ SỞ DỮ LIỆU BẢN TIN

1-cơ sở dữ liệu. sql

CREATE TABLE `newsletter` (
  `id` bigint(20) NOT NULL,
  `name` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ALTER TABLE `newsletter`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `email` (`email`),
  ADD KEY `name` (`name`);

ALTER TABLE `newsletter`
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
 
INSERT INTO `newsletter` (`id`, `name`, `email`) VALUES
(1, 'John Doe', '[email protected]'),
(2, 'Jane Doe', '[email protected]'),
(3, 'Apple Doe', '[email protected]'),
(4, 'Beck Doe', '[email protected]'),
(5, 'Charlie Doe', '[email protected]');

Không có gì đặc biệt ở đây, chỉ là một bảng bản tin đơn giản với 3 trường

  • pdo = new PDO(
          "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
          DB_USER, DB_PASSWORD, [
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]);
      }
    
      // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
      function __destruct () {
        if ($this->stmt!==null) { $this->stmt = null; }
        if ($this->pdo!==null) { $this->pdo = null; }
      }
    
      // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
      function count () {
        $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
        $this->stmt->execute();
        return $this->stmt->fetchColumn();
      }
    
      // (E) GET SUBSCRIBERS
      function get ($start=0, $end=10) {
        $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
        $this->stmt->execute();
        return $this->stmt->fetchAll();
      }
     
      // (F) SEND NEWSLETTER
      function send ($subject, $template, $replace=null) {
        // (F1) EMAIL HEADERS
        $header = implode("\r\n", [
          "From: " . $this->from,
          "MIME-Version: 1.0",
          "Content-Type: text/html; charset=utf-8",
        ]);
     
        // (F2) LOAD TEMPLATE
        if (!file_exists($template)) {
          $this->error = "$template not found";
          return false;
        }
        $template = file_get_contents($template);
     
        // (F3) SEND BATCH BY BATCH
        for ($i=0; $i<$this->count(); $i+=$this->each) {
          $subs = $this->get($i, $this->each);
          foreach ($subs as $s) {
            // (F3-1) EMAIL TEMPLATE REPLACE
            $msg = $template;
            if ($replace != null) { foreach ($replace as $from=>$to) {
              $msg = str_replace($from, $s[$to], $msg);
            }}
     
            // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
            if (@mail($s["email"], $subject, $msg, $header)) {
              // OK
            } else {
              // NOT OK
            }
          }
     
          // (F3-3) NEXT CYCLE
          sleep($this->pause);
        }
      }
    }
     
    // (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
    define("DB_HOST", "localhost");
    define("DB_NAME", "test");
    define("DB_CHARSET", "utf8mb4");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
     
    // (H) NEWSLETTER OBJECT
    $_NEWS = new Newsletter();
    
    0 ID người đăng ký, khóa chính
  • pdo = new PDO(
          "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
          DB_USER, DB_PASSWORD, [
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]);
      }
    
      // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
      function __destruct () {
        if ($this->stmt!==null) { $this->stmt = null; }
        if ($this->pdo!==null) { $this->pdo = null; }
      }
    
      // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
      function count () {
        $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
        $this->stmt->execute();
        return $this->stmt->fetchColumn();
      }
    
      // (E) GET SUBSCRIBERS
      function get ($start=0, $end=10) {
        $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
        $this->stmt->execute();
        return $this->stmt->fetchAll();
      }
     
      // (F) SEND NEWSLETTER
      function send ($subject, $template, $replace=null) {
        // (F1) EMAIL HEADERS
        $header = implode("\r\n", [
          "From: " . $this->from,
          "MIME-Version: 1.0",
          "Content-Type: text/html; charset=utf-8",
        ]);
     
        // (F2) LOAD TEMPLATE
        if (!file_exists($template)) {
          $this->error = "$template not found";
          return false;
        }
        $template = file_get_contents($template);
     
        // (F3) SEND BATCH BY BATCH
        for ($i=0; $i<$this->count(); $i+=$this->each) {
          $subs = $this->get($i, $this->each);
          foreach ($subs as $s) {
            // (F3-1) EMAIL TEMPLATE REPLACE
            $msg = $template;
            if ($replace != null) { foreach ($replace as $from=>$to) {
              $msg = str_replace($from, $s[$to], $msg);
            }}
     
            // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
            if (@mail($s["email"], $subject, $msg, $header)) {
              // OK
            } else {
              // NOT OK
            }
          }
     
          // (F3-3) NEXT CYCLE
          sleep($this->pause);
        }
      }
    }
     
    // (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
    define("DB_HOST", "localhost");
    define("DB_NAME", "test");
    define("DB_CHARSET", "utf8mb4");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
     
    // (H) NEWSLETTER OBJECT
    $_NEWS = new Newsletter();
    
    1 Tên đầy đủ của người đăng ký
  • pdo = new PDO(
          "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
          DB_USER, DB_PASSWORD, [
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]);
      }
    
      // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
      function __destruct () {
        if ($this->stmt!==null) { $this->stmt = null; }
        if ($this->pdo!==null) { $this->pdo = null; }
      }
    
      // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
      function count () {
        $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
        $this->stmt->execute();
        return $this->stmt->fetchColumn();
      }
    
      // (E) GET SUBSCRIBERS
      function get ($start=0, $end=10) {
        $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
        $this->stmt->execute();
        return $this->stmt->fetchAll();
      }
     
      // (F) SEND NEWSLETTER
      function send ($subject, $template, $replace=null) {
        // (F1) EMAIL HEADERS
        $header = implode("\r\n", [
          "From: " . $this->from,
          "MIME-Version: 1.0",
          "Content-Type: text/html; charset=utf-8",
        ]);
     
        // (F2) LOAD TEMPLATE
        if (!file_exists($template)) {
          $this->error = "$template not found";
          return false;
        }
        $template = file_get_contents($template);
     
        // (F3) SEND BATCH BY BATCH
        for ($i=0; $i<$this->count(); $i+=$this->each) {
          $subs = $this->get($i, $this->each);
          foreach ($subs as $s) {
            // (F3-1) EMAIL TEMPLATE REPLACE
            $msg = $template;
            if ($replace != null) { foreach ($replace as $from=>$to) {
              $msg = str_replace($from, $s[$to], $msg);
            }}
     
            // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
            if (@mail($s["email"], $subject, $msg, $header)) {
              // OK
            } else {
              // NOT OK
            }
          }
     
          // (F3-3) NEXT CYCLE
          sleep($this->pause);
        }
      }
    }
     
    // (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
    define("DB_HOST", "localhost");
    define("DB_NAME", "test");
    define("DB_CHARSET", "utf8mb4");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
     
    // (H) NEWSLETTER OBJECT
    $_NEWS = new Newsletter();
    
    2 Địa chỉ email của người đăng ký

 

 

BƯỚC 2) THƯ VIỆN BẢN TIN PHP

2-bản tin. php

pdo = new PDO(
      "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
      DB_USER, DB_PASSWORD, [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
  }

  // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
  function __destruct () {
    if ($this->stmt!==null) { $this->stmt = null; }
    if ($this->pdo!==null) { $this->pdo = null; }
  }

  // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
  function count () {
    $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
    $this->stmt->execute();
    return $this->stmt->fetchColumn();
  }

  // (E) GET SUBSCRIBERS
  function get ($start=0, $end=10) {
    $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
    $this->stmt->execute();
    return $this->stmt->fetchAll();
  }
 
  // (F) SEND NEWSLETTER
  function send ($subject, $template, $replace=null) {
    // (F1) EMAIL HEADERS
    $header = implode("\r\n", [
      "From: " . $this->from,
      "MIME-Version: 1.0",
      "Content-Type: text/html; charset=utf-8",
    ]);
 
    // (F2) LOAD TEMPLATE
    if (!file_exists($template)) {
      $this->error = "$template not found";
      return false;
    }
    $template = file_get_contents($template);
 
    // (F3) SEND BATCH BY BATCH
    for ($i=0; $i<$this->count(); $i+=$this->each) {
      $subs = $this->get($i, $this->each);
      foreach ($subs as $s) {
        // (F3-1) EMAIL TEMPLATE REPLACE
        $msg = $template;
        if ($replace != null) { foreach ($replace as $from=>$to) {
          $msg = str_replace($from, $s[$to], $msg);
        }}
 
        // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
        if (@mail($s["email"], $subject, $msg, $header)) {
          // OK
        } else {
          // NOT OK
        }
      }
 
      // (F3-3) NEXT CYCLE
      sleep($this->pause);
    }
  }
}
 
// (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8mb4");
define("DB_USER", "root");
define("DB_PASSWORD", "");
 
// (H) NEWSLETTER OBJECT
$_NEWS = new Newsletter();

Cái này trông có vẻ đồ sộ, nhưng hãy bình tĩnh và xem xét cẩn thận. Sẽ không giải thích từng dòng, nhưng đây là một bản tóm tắt nhanh

  • (B, C, H) Khi
    pdo = new PDO(
          "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
          DB_USER, DB_PASSWORD, [
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]);
      }
    
      // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
      function __destruct () {
        if ($this->stmt!==null) { $this->stmt = null; }
        if ($this->pdo!==null) { $this->pdo = null; }
      }
    
      // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
      function count () {
        $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
        $this->stmt->execute();
        return $this->stmt->fetchColumn();
      }
    
      // (E) GET SUBSCRIBERS
      function get ($start=0, $end=10) {
        $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
        $this->stmt->execute();
        return $this->stmt->fetchAll();
      }
     
      // (F) SEND NEWSLETTER
      function send ($subject, $template, $replace=null) {
        // (F1) EMAIL HEADERS
        $header = implode("\r\n", [
          "From: " . $this->from,
          "MIME-Version: 1.0",
          "Content-Type: text/html; charset=utf-8",
        ]);
     
        // (F2) LOAD TEMPLATE
        if (!file_exists($template)) {
          $this->error = "$template not found";
          return false;
        }
        $template = file_get_contents($template);
     
        // (F3) SEND BATCH BY BATCH
        for ($i=0; $i<$this->count(); $i+=$this->each) {
          $subs = $this->get($i, $this->each);
          foreach ($subs as $s) {
            // (F3-1) EMAIL TEMPLATE REPLACE
            $msg = $template;
            if ($replace != null) { foreach ($replace as $from=>$to) {
              $msg = str_replace($from, $s[$to], $msg);
            }}
     
            // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
            if (@mail($s["email"], $subject, $msg, $header)) {
              // OK
            } else {
              // NOT OK
            }
          }
     
          // (F3-3) NEXT CYCLE
          sleep($this->pause);
        }
      }
    }
     
    // (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
    define("DB_HOST", "localhost");
    define("DB_NAME", "test");
    define("DB_CHARSET", "utf8mb4");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
     
    // (H) NEWSLETTER OBJECT
    $_NEWS = new Newsletter();
    
    3 được tạo, hàm tạo sẽ tự động kết nối với cơ sở dữ liệu. Hàm hủy đóng kết nối
  • (D, E, F) Chỉ có 3 chức năng liên quan đến bản tin
    • pdo = new PDO(
            "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
            DB_USER, DB_PASSWORD, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
          ]);
        }
      
        // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
        function __destruct () {
          if ($this->stmt!==null) { $this->stmt = null; }
          if ($this->pdo!==null) { $this->pdo = null; }
        }
      
        // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
        function count () {
          $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
          $this->stmt->execute();
          return $this->stmt->fetchColumn();
        }
      
        // (E) GET SUBSCRIBERS
        function get ($start=0, $end=10) {
          $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
          $this->stmt->execute();
          return $this->stmt->fetchAll();
        }
       
        // (F) SEND NEWSLETTER
        function send ($subject, $template, $replace=null) {
          // (F1) EMAIL HEADERS
          $header = implode("\r\n", [
            "From: " . $this->from,
            "MIME-Version: 1.0",
            "Content-Type: text/html; charset=utf-8",
          ]);
       
          // (F2) LOAD TEMPLATE
          if (!file_exists($template)) {
            $this->error = "$template not found";
            return false;
          }
          $template = file_get_contents($template);
       
          // (F3) SEND BATCH BY BATCH
          for ($i=0; $i<$this->count(); $i+=$this->each) {
            $subs = $this->get($i, $this->each);
            foreach ($subs as $s) {
              // (F3-1) EMAIL TEMPLATE REPLACE
              $msg = $template;
              if ($replace != null) { foreach ($replace as $from=>$to) {
                $msg = str_replace($from, $s[$to], $msg);
              }}
       
              // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
              if (@mail($s["email"], $subject, $msg, $header)) {
                // OK
              } else {
                // NOT OK
              }
            }
       
            // (F3-3) NEXT CYCLE
            sleep($this->pause);
          }
        }
      }
       
      // (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
      define("DB_HOST", "localhost");
      define("DB_NAME", "test");
      define("DB_CHARSET", "utf8mb4");
      define("DB_USER", "root");
      define("DB_PASSWORD", "");
       
      // (H) NEWSLETTER OBJECT
      $_NEWS = new Newsletter();
      
      4 Đếm tổng số người đăng ký
    • pdo = new PDO(
            "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
            DB_USER, DB_PASSWORD, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
          ]);
        }
      
        // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
        function __destruct () {
          if ($this->stmt!==null) { $this->stmt = null; }
          if ($this->pdo!==null) { $this->pdo = null; }
        }
      
        // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
        function count () {
          $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
          $this->stmt->execute();
          return $this->stmt->fetchColumn();
        }
      
        // (E) GET SUBSCRIBERS
        function get ($start=0, $end=10) {
          $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
          $this->stmt->execute();
          return $this->stmt->fetchAll();
        }
       
        // (F) SEND NEWSLETTER
        function send ($subject, $template, $replace=null) {
          // (F1) EMAIL HEADERS
          $header = implode("\r\n", [
            "From: " . $this->from,
            "MIME-Version: 1.0",
            "Content-Type: text/html; charset=utf-8",
          ]);
       
          // (F2) LOAD TEMPLATE
          if (!file_exists($template)) {
            $this->error = "$template not found";
            return false;
          }
          $template = file_get_contents($template);
       
          // (F3) SEND BATCH BY BATCH
          for ($i=0; $i<$this->count(); $i+=$this->each) {
            $subs = $this->get($i, $this->each);
            foreach ($subs as $s) {
              // (F3-1) EMAIL TEMPLATE REPLACE
              $msg = $template;
              if ($replace != null) { foreach ($replace as $from=>$to) {
                $msg = str_replace($from, $s[$to], $msg);
              }}
       
              // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
              if (@mail($s["email"], $subject, $msg, $header)) {
                // OK
              } else {
                // NOT OK
              }
            }
       
            // (F3-3) NEXT CYCLE
            sleep($this->pause);
          }
        }
      }
       
      // (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
      define("DB_HOST", "localhost");
      define("DB_NAME", "test");
      define("DB_CHARSET", "utf8mb4");
      define("DB_USER", "root");
      define("DB_PASSWORD", "");
       
      // (H) NEWSLETTER OBJECT
      $_NEWS = new Newsletter();
      
      5 Thu hút người đăng ký
    • pdo = new PDO(
            "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
            DB_USER, DB_PASSWORD, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
          ]);
        }
      
        // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
        function __destruct () {
          if ($this->stmt!==null) { $this->stmt = null; }
          if ($this->pdo!==null) { $this->pdo = null; }
        }
      
        // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
        function count () {
          $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
          $this->stmt->execute();
          return $this->stmt->fetchColumn();
        }
      
        // (E) GET SUBSCRIBERS
        function get ($start=0, $end=10) {
          $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
          $this->stmt->execute();
          return $this->stmt->fetchAll();
        }
       
        // (F) SEND NEWSLETTER
        function send ($subject, $template, $replace=null) {
          // (F1) EMAIL HEADERS
          $header = implode("\r\n", [
            "From: " . $this->from,
            "MIME-Version: 1.0",
            "Content-Type: text/html; charset=utf-8",
          ]);
       
          // (F2) LOAD TEMPLATE
          if (!file_exists($template)) {
            $this->error = "$template not found";
            return false;
          }
          $template = file_get_contents($template);
       
          // (F3) SEND BATCH BY BATCH
          for ($i=0; $i<$this->count(); $i+=$this->each) {
            $subs = $this->get($i, $this->each);
            foreach ($subs as $s) {
              // (F3-1) EMAIL TEMPLATE REPLACE
              $msg = $template;
              if ($replace != null) { foreach ($replace as $from=>$to) {
                $msg = str_replace($from, $s[$to], $msg);
              }}
       
              // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
              if (@mail($s["email"], $subject, $msg, $header)) {
                // OK
              } else {
                // NOT OK
              }
            }
       
            // (F3-3) NEXT CYCLE
            sleep($this->pause);
          }
        }
      }
       
      // (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
      define("DB_HOST", "localhost");
      define("DB_NAME", "test");
      define("DB_CHARSET", "utf8mb4");
      define("DB_USER", "root");
      define("DB_PASSWORD", "");
       
      // (H) NEWSLETTER OBJECT
      $_NEWS = new Newsletter();
      
      6 Gửi bản tin. Không nên kết xuất hàng nghìn mục nhập cùng một lúc, vì vậy thay vào đó, mục này được thực hiện theo lô
  • (G) Tự giải thích. Thay đổi cài đặt thành của riêng bạn

 

 

BƯỚC 3) GỬI SỐ LƯỢNG LỚN BẢN TIN EMAIL

3A) MẪU EMAIL

mẫu 3a. html


Dear [NAME],

There will be a super sale going on next week!

All items will be going at a 20% discount, so grab it while stocks last!

Đây là mẫu email demo sẽ được gửi đi. Hãy lưu ý rằng sau này,

pdo = new PDO(
      "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
      DB_USER, DB_PASSWORD, [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
  }

  // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
  function __destruct () {
    if ($this->stmt!==null) { $this->stmt = null; }
    if ($this->pdo!==null) { $this->pdo = null; }
  }

  // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
  function count () {
    $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
    $this->stmt->execute();
    return $this->stmt->fetchColumn();
  }

  // (E) GET SUBSCRIBERS
  function get ($start=0, $end=10) {
    $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
    $this->stmt->execute();
    return $this->stmt->fetchAll();
  }
 
  // (F) SEND NEWSLETTER
  function send ($subject, $template, $replace=null) {
    // (F1) EMAIL HEADERS
    $header = implode("\r\n", [
      "From: " . $this->from,
      "MIME-Version: 1.0",
      "Content-Type: text/html; charset=utf-8",
    ]);
 
    // (F2) LOAD TEMPLATE
    if (!file_exists($template)) {
      $this->error = "$template not found";
      return false;
    }
    $template = file_get_contents($template);
 
    // (F3) SEND BATCH BY BATCH
    for ($i=0; $i<$this->count(); $i+=$this->each) {
      $subs = $this->get($i, $this->each);
      foreach ($subs as $s) {
        // (F3-1) EMAIL TEMPLATE REPLACE
        $msg = $template;
        if ($replace != null) { foreach ($replace as $from=>$to) {
          $msg = str_replace($from, $s[$to], $msg);
        }}
 
        // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
        if (@mail($s["email"], $subject, $msg, $header)) {
          // OK
        } else {
          // NOT OK
        }
      }
 
      // (F3-3) NEXT CYCLE
      sleep($this->pause);
    }
  }
}
 
// (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8mb4");
define("DB_USER", "root");
define("DB_PASSWORD", "");
 
// (H) NEWSLETTER OBJECT
$_NEWS = new Newsletter();
7 sẽ được thay thế bằng tên của người đăng ký và vui lòng thay đổi mẫu này thành bất cứ thứ gì bạn muốn

 

3B) PHIẾU XỬ LÝ THƯ PHP

quy trình 3b. php

send(
  "[STORE] Crazy sales", // subject
  "3a-template.html", // email template
  ["[NAME]" => "name"] // replace "[NAME]" with database name column
);

Không có gì nhiều, tải thư viện và sử dụng nó để gửi bản tin – Chỉ cần chỉ định chủ đề, mẫu sẽ sử dụng và biến nào sẽ thay thế

 

 

BƯỚC 4) CHẠY Script TRONG DÒNG LỆNH

4A) CHẠY DÒNG LỆNH

# FOR WINDOWS
php 3b-process.php

# LINUX OR MAC
php -f /var/www/test/3b-process.php

Cuối cùng, chỉ cần chạy "tập lệnh xử lý" trong dòng lệnh và để nó cuộn

 

4B) CHẠY THEO LỊCH TRÌNH

Ngoài ra, chúng ta cũng có thể lên lịch chạy tập lệnh vào một thời điểm nhất định

  • Người dùng Windows – Sử dụng Trình lập lịch tác vụ
  • Người dùng Mac và Linux – Sử dụng Cron

Nếu bạn không chắc chắn cách thực hiện, tôi sẽ để lại các liên kết trong phần bổ sung bên dưới

 

4C) CHẠY NỀN

Cách chạy tập lệnh PHP trong nền – Ví dụ đơn giản

Một cách khác là sử dụng PHP để chạy một tập lệnh PHP khác trong nền theo yêu cầu. Những kẻ troll ngu ngốc có thể hét lên “điều này thật ngu ngốc và phức tạp” tất cả những gì họ muốn, nhưng tôi thích “nhấp và đi uống trà”… Không phải “nhấp và nhìn chằm chằm vào màn hình AJAX thăm dò dài”

 

BIT BỔ SUNG & LIÊN KẾT

Đó là một tập lệnh gửi email hàng loạt có đầy đủ chức năng, nhưng nó mới chỉ là bước khởi đầu; . Dưới đây là một số mẹo và tính năng bổ sung có thể hữu ích

 

ĐẶT THỜI GIAN NGOÀI MYSQL

Khi bạn đang trích xuất một lượng lớn dữ liệu từ cơ sở dữ liệu, đôi khi bạn sẽ gặp phải thời gian chờ. Sẽ là khôn ngoan khi phân bổ thêm một chút thời gian để chạy các truy vấn và đây là cách đặt thời gian chờ truy vấn MYSQL

Hết thời gian chờ câu lệnh CHỌN phía máy chủ

 

 

ĐĂNG NHẬP LỊCH SỬ GỬI CỦA BẠN

Học hỏi từ những sai lầm của tôi. Vậy điều gì sẽ xảy ra nếu kịch bản chạy giữa chừng và chết? . Tôi thực sự khuyên bạn nên ghi nhật ký các bản tin mà bạn đã gửi đến cơ sở dữ liệu. Ví dụ

CREATE TABLE `news_sent` (
  `newsletter_id` int(11) NOT NULL,
  `email` varchar(255) NOT NULL,
  `timestamp` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `news_sent`
  ADD PRIMARY KEY (`newsletter_id`,`email`),
  ADD KEY `timestamp` (`timestamp`);
  • pdo = new PDO(
          "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
          DB_USER, DB_PASSWORD, [
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]);
      }
    
      // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
      function __destruct () {
        if ($this->stmt!==null) { $this->stmt = null; }
        if ($this->pdo!==null) { $this->pdo = null; }
      }
    
      // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
      function count () {
        $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
        $this->stmt->execute();
        return $this->stmt->fetchColumn();
      }
    
      // (E) GET SUBSCRIBERS
      function get ($start=0, $end=10) {
        $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
        $this->stmt->execute();
        return $this->stmt->fetchAll();
      }
     
      // (F) SEND NEWSLETTER
      function send ($subject, $template, $replace=null) {
        // (F1) EMAIL HEADERS
        $header = implode("\r\n", [
          "From: " . $this->from,
          "MIME-Version: 1.0",
          "Content-Type: text/html; charset=utf-8",
        ]);
     
        // (F2) LOAD TEMPLATE
        if (!file_exists($template)) {
          $this->error = "$template not found";
          return false;
        }
        $template = file_get_contents($template);
     
        // (F3) SEND BATCH BY BATCH
        for ($i=0; $i<$this->count(); $i+=$this->each) {
          $subs = $this->get($i, $this->each);
          foreach ($subs as $s) {
            // (F3-1) EMAIL TEMPLATE REPLACE
            $msg = $template;
            if ($replace != null) { foreach ($replace as $from=>$to) {
              $msg = str_replace($from, $s[$to], $msg);
            }}
     
            // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
            if (@mail($s["email"], $subject, $msg, $header)) {
              // OK
            } else {
              // NOT OK
            }
          }
     
          // (F3-3) NEXT CYCLE
          sleep($this->pause);
        }
      }
    }
     
    // (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
    define("DB_HOST", "localhost");
    define("DB_NAME", "test");
    define("DB_CHARSET", "utf8mb4");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
     
    // (H) NEWSLETTER OBJECT
    $_NEWS = new Newsletter();
    
    8 là ID duy nhất của chiến dịch của bạn
  • pdo = new PDO(
          "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
          DB_USER, DB_PASSWORD, [
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]);
      }
    
      // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
      function __destruct () {
        if ($this->stmt!==null) { $this->stmt = null; }
        if ($this->pdo!==null) { $this->pdo = null; }
      }
    
      // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
      function count () {
        $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
        $this->stmt->execute();
        return $this->stmt->fetchColumn();
      }
    
      // (E) GET SUBSCRIBERS
      function get ($start=0, $end=10) {
        $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
        $this->stmt->execute();
        return $this->stmt->fetchAll();
      }
     
      // (F) SEND NEWSLETTER
      function send ($subject, $template, $replace=null) {
        // (F1) EMAIL HEADERS
        $header = implode("\r\n", [
          "From: " . $this->from,
          "MIME-Version: 1.0",
          "Content-Type: text/html; charset=utf-8",
        ]);
     
        // (F2) LOAD TEMPLATE
        if (!file_exists($template)) {
          $this->error = "$template not found";
          return false;
        }
        $template = file_get_contents($template);
     
        // (F3) SEND BATCH BY BATCH
        for ($i=0; $i<$this->count(); $i+=$this->each) {
          $subs = $this->get($i, $this->each);
          foreach ($subs as $s) {
            // (F3-1) EMAIL TEMPLATE REPLACE
            $msg = $template;
            if ($replace != null) { foreach ($replace as $from=>$to) {
              $msg = str_replace($from, $s[$to], $msg);
            }}
     
            // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
            if (@mail($s["email"], $subject, $msg, $header)) {
              // OK
            } else {
              // NOT OK
            }
          }
     
          // (F3-3) NEXT CYCLE
          sleep($this->pause);
        }
      }
    }
     
    // (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
    define("DB_HOST", "localhost");
    define("DB_NAME", "test");
    define("DB_CHARSET", "utf8mb4");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
     
    // (H) NEWSLETTER OBJECT
    $_NEWS = new Newsletter();
    
    2… địa chỉ email của người dùng
  • 
    Dear [NAME],

    There will be a super sale going on next week!

    All items will be going at a 20% discount, so grab it while stocks last!

    0 là thời điểm email được gửi đến người dùng

Với điều này, chúng tôi có thể sửa đổi chức năng thư viện

pdo = new PDO(
      "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET, 
      DB_USER, DB_PASSWORD, [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
  }

  // (C) DESTRUCTOR - CLOSE DATABASE CONNECTION
  function __destruct () {
    if ($this->stmt!==null) { $this->stmt = null; }
    if ($this->pdo!==null) { $this->pdo = null; }
  }

  // (D) COUNT TOTAL NUMBER OF SUBSCRIBERS
  function count () {
    $this->stmt = $this->pdo->prepare("SELECT COUNT(*) `cnt` FROM `newsletter`");
    $this->stmt->execute();
    return $this->stmt->fetchColumn();
  }

  // (E) GET SUBSCRIBERS
  function get ($start=0, $end=10) {
    $this->stmt = $this->pdo->prepare("SELECT * FROM `newsletter` LIMIT $x, $y");
    $this->stmt->execute();
    return $this->stmt->fetchAll();
  }
 
  // (F) SEND NEWSLETTER
  function send ($subject, $template, $replace=null) {
    // (F1) EMAIL HEADERS
    $header = implode("\r\n", [
      "From: " . $this->from,
      "MIME-Version: 1.0",
      "Content-Type: text/html; charset=utf-8",
    ]);
 
    // (F2) LOAD TEMPLATE
    if (!file_exists($template)) {
      $this->error = "$template not found";
      return false;
    }
    $template = file_get_contents($template);
 
    // (F3) SEND BATCH BY BATCH
    for ($i=0; $i<$this->count(); $i+=$this->each) {
      $subs = $this->get($i, $this->each);
      foreach ($subs as $s) {
        // (F3-1) EMAIL TEMPLATE REPLACE
        $msg = $template;
        if ($replace != null) { foreach ($replace as $from=>$to) {
          $msg = str_replace($from, $s[$to], $msg);
        }}
 
        // (F3-2) SEND - SAVE THE SEND STATUS HERE IF YOU WANT
        if (@mail($s["email"], $subject, $msg, $header)) {
          // OK
        } else {
          // NOT OK
        }
      }
 
      // (F3-3) NEXT CYCLE
      sleep($this->pause);
    }
  }
}
 
// (G) DATABASE SETTINGS - CHANGE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8mb4");
define("DB_USER", "root");
define("DB_PASSWORD", "");
 
// (H) NEWSLETTER OBJECT
$_NEWS = new Newsletter();
6 để ghi lại sau mỗi lần gửi email thành công

if (mail(TO, SUBJECT, MESSAGE, HEADERS)) {
  // SAVE SEND HISTORY
  $sql = "INSERT INTO `news_sent` (`newsletter_id`, `email`) VALUES (ID, EMAIL)";
  // ...
}

Cuối cùng, thay vào đó, hãy thực hiện


Dear [NAME],

There will be a super sale going on next week!

All items will be going at a 20% discount, so grab it while stocks last!

2 và điều đó sẽ loại trừ tất cả những người đăng ký đã nhận được email

 

LIÊN KẾT và THAM KHẢO

  • Email không gửi đi trong PHP?
  • Gửi Email Bằng Mẫu HTML Trong PHP – Code Boxx
  • Chức năng Thư – PHP
  • Cách tạo tác vụ tự động bằng Trình lập lịch tác vụ trên Windows 10 – Windows Central
  • Cách sử dụng cron trong Linux – mã nguồn mở. com

 

VIDEO HƯỚNG DẪN

 

KẾT THÚC

Cảm ơn bạn đã đọc, và chúng tôi đã đi đến phần cuối của hướng dẫn này. Tôi hy vọng nó đã giúp bạn với dự án của bạn và nếu có bất cứ điều gì bạn muốn thêm vào hướng dẫn này, xin vui lòng bình luận bên dưới. Chúc may mắn và mã hóa hạnh phúc

Làm cách nào để gửi email bằng PHP và MySQL?

PHP sử dụng hàm mail() để gửi email . Chức năng này yêu cầu ba đối số bắt buộc chỉ định địa chỉ email của người nhận, chủ đề của thư và thư thực tế, ngoài ra còn có hai tham số tùy chọn khác. thư (đến, chủ đề, tin nhắn, tiêu đề, tham số);

Làm cách nào để gửi email từ MySQL?

Kết nối với Email thông qua Cổng SQL .
Trong MySQL Workbench, nhấp để thêm kết nối MySQL mới
Đặt tên cho kết nối (CData SQL Gateway for Email)
Đặt các tham số Tên máy chủ, Cổng và Tên người dùng để kết nối với Cổng SQL
Nhấp vào Lưu trữ trong Vault để đặt và lưu trữ mật khẩu

Làm cách nào để gửi email qua PHP?

Sử dụng hàm PHP mail() . Hàm mail() tích hợp sẵn của PHP là một trong những cách đơn giản nhất để gửi email trực tiếp từ chính máy chủ web. Nó chỉ cần ba tham số bắt buộc. địa chỉ email, chủ đề email và nội dung thư—và gửi nó đến người nhận.

Làm cách nào để gửi 10 000 email cùng một lúc trong PHP?

Đơn giản, cron. Tạo bảng để chứa địa chỉ email (hoặc id) của những người dùng đã xử lý, sau đó tạo một công việc định kỳ để chạy 5 phút một lần, chọn 100 người dùng chưa xử lý, gửi thư cho họ rồi đánh dấu họ là đã xử lý< . Không ngủ và không có thời gian chờ. Bish. . No sleep, and no timeouts. Bish.