通过 SMTP 服务器发送电子邮件——简单和高级解决方案

基于SMTP的电子邮件发送可以通过多种方式实现,无论是基础方法还是高级方法。以下我们展示了更简单和更复杂的选项,以及一个PHP代码示例。

简单解决方案:租用主机和域名

使用基于SMTP的电子邮件发送的最简单方法是租用主机和域名。
大多数主机服务支持PHP执行并预先配置了SMTP,因此可以直接使用PHP的mail()函数发送电子邮件,如下所示:

<?php

function sendEmail($emailAddresses, $subjects, $sentences) {
foreach ($emailAddresses as $email) {
// Select a random subject
$subject = $subjects[array_rand($subjects)];

// Generate the email body
$message = '';
foreach ($sentences as $sentenceOptions) {
$message .= $sentenceOptions[array_rand($sentenceOptions)] . " ";
}

// Send the email
$headers = "From: no-reply@domain.com\r\n";
if (mail($email, $subject, $message, $headers)) {
echo "Email successfully sent to: $email\n";
} else {
echo "Failed to send email to: $email\n";
}
}
}

// Define email addresses
$emailAddresses = [
"example1@domain.com",
"example2@domain.com",
"example3@domain.com",
];

// Define possible subjects
$subjects = [
"Important Notification",
"New Offer Available",
"Discover Our Latest Services",
];

// Define possible sentences (with variations)
$sentences = [
["Welcome!", "Hello!", "Dear customer,"],
["We are excited to share our latest promotion.", "Our newest updates might interest you.", "Don't miss out on our latest opportunities!"],
["Please visit our website for more information.", "Details can be found on our website.", "Find additional information on our homepage."],
];

// Send emails
sendEmail($emailAddresses, $subjects, $sentences);

?>

重要提示:通过随机化内容避免垃圾邮件
在我们关于如何避免垃圾邮件过滤器的文章中,我们已经强调了随机化电子邮件内容的重要性。上述PHP代码也通过随机选择主题和句子来实现这一点。

    高级解决方案:使用本地Web服务器和数据库
    如果需要更复杂的解决方案,也可以运行本地Web服务器(例如Apache或Nginx)。以下代码从MySQL数据库中获取收件人,同时发送具有随机化内容的电子邮件。

    <?php
    //exit;

    set_time_limit(999999999);
    ini_set("max_execution_time", 30000); //sec

    ini_set("display_errors", 1);
    ini_set("display_startup_errors", 1);
    error_reporting(E_ALL);
    header("Content-Type: text/html; charset=utf-8");
    header("Content-Type: text/html; charset=UTF-8");

    mb_internal_encoding("UTF-8");
    mb_http_output("UTF-8");
    mb_http_input("UTF-8");
    mb_regex_encoding("UTF-8");

    //---------sanitize incoming parameters start

    if (!empty($_POST)) {
    foreach ($_POST as $post => $value) {
    $_POST[$post] = addslashes($_POST[$post]);
    }
    }
    if (!empty($_PUT)) {
    foreach ($_PUT as $put => $value) {
    $_PUT[$put] = addslashes($_PUT[$put]);
    }
    }
    if (!empty($_GET)) {
    foreach ($_GET as $get => $value) {
    $_GET[$get] = addslashes($_GET[$get]);
    }
    }
    if (!empty($_REQUEST)) {
    foreach ($_REQUEST as $key => $value) {
    $_REQUEST[$key] = addslashes($_REQUEST[$key]);
    }
    }
    //---------sanitize incoming parameters end

    require_once dirname(__FILE__) . "/phpmailer-6.1.1/Exception.php";
    require_once dirname(__FILE__) . "/phpmailer-6.1.1/OAuth.php";
    require_once dirname(__FILE__) . "/phpmailer-6.1.1/PHPMailer.php";
    require_once dirname(__FILE__) . "/phpmailer-6.1.1/POP3.php";
    require_once dirname(__FILE__) . "/phpmailer-6.1.1/SMTP.php";

    /*CONFIG*/
    /*CONFIG*/
    /*CONFIG*/
    /*CONFIG*/

    echo memory_get_usage() . "<br>";

    $host = "localhost";
    $user = "root";
    $pswd = "";
    $database = "multikuldo";

    $connect = mysqli_connect($host, $user, $pswd, $database);

    mysqli_query($connect, "set names utf8");
    mysqli_select_db($connect, $database);

    $sleeptime = 3; // 3 is optimal
    $runtime = 0;
    $testcount = 50; // Send test email every 50th email
    $testemail = "yourtest@gmail.com";
    $table_name = "emails";

    function getRandElementFromArray($array)
    {
    return $array[array_rand($array, 1)];
    }

    /*SENTENCE VARIATIONS*/
    /*SENTENCE VARIATIONS*/
    /*SENTENCE VARIATIONS*/
    /*SENTENCE VARIATIONS*/
    /*SENTENCE VARIATIONS*/
    /*SENTENCE VARIATIONS*/

    $fromemail[0][] = "sender@gmail.com";

    $sender[0][] = "sender name1";
    $sender[0][] = "sender name2";
    $sender[0][] = "sender name3";

    $subject[0][] = "subject1";
    $subject[0][] = "subject2";
    $subject[0][] = "subject3";

    $body[0][] = "Welcome!";
    $body[0][] = "Dear Editor!";

    $body[1][] = "body1";
    $body[1][] = "body2";
    $body[1][] = "body3";
    $body[2][] = "body1";
    $body[2][] = "body2";
    $body[2][] = "body3";
    $body[3][] = "body1";
    $body[3][] = "body2";
    $body[3][] = "body3";

    /*SENTENCE VARIATIONS*/
    /*SENTENCE VARIATIONS*/
    /*SENTENCE VARIATIONS*/
    /*SENTENCE VARIATIONS*/
    /*SENTENCE VARIATIONS*/
    /*SENTENCE VARIATIONS*/

    do {
    // Start the loop if not redirected via JavaScript
    sleep($sleeptime);

    // Create a PHPMailer instance
    $phpmailer = new PHPMailer\PHPMailer\PHPMailer();

    set_time_limit(9999999);

    $isz = file_get_contents("isz.txt"); // previous email id
    echo "<br>isz: " . $isz . "<br>";

    // Fetch the data to be sent
    $query =
    "
    SELECT *
    FROM " .
    $table_name .
    "
    WHERE
    sended = '0'
    LIMIT 1

    ";

    echo $query . "<hr>";
    $sql_result = mysqli_query($connect, $query);

    $result = [];
    while ($row = mysqli_fetch_array($sql_result)) {
    $result[] = $row;
    }
    //print_r($result);
    if (empty($result)) {
    die("the end");
    }
    //exit;

    file_put_contents("isz.txt", $result[0]["id"]); // one more than what was written
    $log = file_get_contents("log.txt");

    try {
    // Debugging settings
    $phpmailer->SMTPDebug = 1;

    // Set character encoding
    $phpmailer->CharSet = "UTF-8";

    // Set email format to HTML
    $phpmailer->isHTML(true);

    // Sender details
    $phpmailer->setFrom(
    $fromemail[0][rand(0, count($fromemail[0]) - 1)],
    $sender[0][rand(0, count($sender[0]) - 1)]
    );
    $phpmailer->AddReplyTo(
    $fromemail[0][rand(0, count($fromemail[0]) - 1)],
    $sender[0][rand(0, count($sender[0]) - 1)]
    );

    $phpmailer->Sender = $phpmailer->From;

    // Recipient details
    $cimzettnev = explode("@", $result[0]["email"]);
    $phpmailer->addAddress($result[0]["email"], $cimzettnev[1]);

    // SMTP connection settings for sending the email
    $phpmailer->isSMTP();
    $phpmailer->Host = "ssl://smtp.gmail.com";
    $phpmailer->Port = 465;
    $phpmailer->SMTPAuth = true;
    $phpmailer->AuthType = "LOGIN"; // 'CRAM-MD5', 'PLAIN', 'LOGIN
    //$phpmailer->SMTPSecure = false;
    $phpmailer->SMTPSecure = "ssl";
    //$phpmailer->SMTPAutoTLS = false;
    $phpmailer->Username = "your@gmail.com";
    $phpmailer->Password = "12345";

    // Message content
    $phpmailer->Subject = "" . $subject[0][rand(0, count($subject[0]) - 1)];

    // HTML body
    $phpmailer->Body =
    '<html> ... </html>'; // Truncated for brevity

    // Send the email
    $phpmailer->Send();

    // Mark the sent data
    $query =
    "
    UPDATE " .
    $table_name .
    "
    SET sended = 1
    WHERE id = '" .
    $result[0]["id"] .
    "'
    ";

    mysqli_query($connect, $query);

    } catch (phpmailerException $err) {
    // Log mailer error
    } catch (Exception $err) {
    // Log general error
    }
    } while (!empty($result));
    echo memory_get_usage() . "<br>";
    echo "ready";
    ?>

    相关链接:

      无论是简单还是高级的方法,都为批量发送电子邮件提供了灵活的选项。选择适合您需求的解决方案,开始您的活动!