首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

WordPress 批次查詢留言者 Email 並匯出:SQL、PHP 腳本與郵件發送策略

     編輯:PHP 相關知識

WordPress 留言資料表 wp_comments 儲存留言者 Email。本文提供安全、高效的查詢腳本、去重匯出 CSV、大量郵件發送策略 (避免被封)、GDPR 合規提醒,並說明為何不建議直接使用原文的 mysql_* 與字串拼接方式。

安全查詢腳本 (WP CLI / 獨立 PHP)

<?php
// export-comment-emails.php
// 用法:php export-comment-emails.php > emails.csv

require_once __DIR__ . '/wp-load.php'; // 載入 WordPress 環境

global $wpdb;

// 1. 參數化查詢:去重、排除管理員、僅核准留言
$sql = "
    SELECT DISTINCT comment_author_email
    FROM {$wpdb->comments}
    WHERE comment_approved = '1'
      AND comment_type = ''
      AND comment_author_email NOT LIKE '%@example.com'  -- 排除測試域
      AND comment_author_email != '' 
    ORDER BY comment_author_email
";

$emails = $wpdb->get_col($sql); // 直接回傳單欄陣列

// 2. 基本驗證與清理
$validEmails = array_filter($emails, function($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
});

// 3. 輸出 CSV (標準輸出)
$out = fopen('php://stdout', 'w');
fputcsv($out, ['email']); // 標題列
foreach ($validEmails as $email) {
    fputcsv($out, [$email]);
}
fclose($out);

// 錯誤輸出至 stderr
fwrite(STDERR, "Exported " . count($validEmails) . " unique emails.\n");

進階:分頁處理大量資料 (避免記憶體溢出)

function exportEmailsChunked(int $chunkSize = 1000): Generator
{
    global $wpdb;
    $offset = 0;

    do {
        $sql = $wpdb->prepare("
            SELECT DISTINCT comment_author_email
            FROM {$wpdb->comments}
            WHERE comment_approved = '1' AND comment_type = ''
            ORDER BY comment_author_email
            LIMIT %d OFFSET %d
        ", $chunkSize, $offset);

        $chunk = $wpdb->get_col($sql);
        if (empty($chunk)) break;

        foreach ($chunk as $email) {
            if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
                yield $email;
            }
        }
        $offset += $chunkSize;
    } while (count($chunk) === $chunkSize);
}

// 使用
$out = fopen('emails.csv', 'w');
fputcsv($out, ['email']);
foreach (exportEmailsChunked() as $email) {
    fputcsv($out, [$email]);
}
fclose($out);

大量郵件發送策略 (避免進垃圾箱/被封)

策略說明工具/服務
使用交易郵件服務商專業 IP 信譽、退信處理、開啟追蹤SendGrid, Mailgun, Amazon SES, Postmark
自建 SMTP + 信譽預熱需配置 SPF、DKIM、DMARC、rDNS、IP 預熱Postfix + 監控
分批發送、間隔控制每小時不超過提供商限制,加入隨機延遲佇列系統 (Redis + Worker)
清單清洗移除硬退信、投訴、無效格式、角色帳號ZeroBounce, NeverBounce, 自建驗證
單發而非群發 (BCC)每封郵件獨立 To,個性化內容,降低垃圾分數郵件模板引擎
退信/投訴自動處理Webhook 接收退信事件,自動加入抑制清單服務商提供

GDPR / 隱私法合規提醒

  • 合法依據:發送行銷郵件需「明確同意」(Opt-in),單純留言不代表同意接收行銷信。
  • 退訂機制:每封郵件必須包含一鍵退訂連結,並即時生效。
  • 資料最小化:僅匯出 Email,不要攜帶 IP、User Agent、留言內容等敏感資料。
  • 資料保留期限:達成目的後應刪除或匿名化。
  • 資料主體權利:提供存取、更正、刪除、限制處理、資料可攜帶的管道。

WordPress 專用外掛推薦

  • Export Comments:後台一鍵匯出 CSV/Excel,支援欄位選擇。
  • MailPoet / Newsletter:內建留言者匯入、訂閱管理、GDPR 合規。
  • WP Mail SMTP:修正 WordPress 郵件發送機制,接入專業服務商。

直接操作資料庫雖快,但繞過 WordPress 核心可能導致快取不一致、外掛鉤子未觸發。建議優先使用 WP_Comment_Query 或 $wpdb 並遵循 WordPress 編碼標準,郵件發送務必接入專業服務商,切勿自建 SMTP 除非有專業運維團隊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved