Email küldése SMTP szerveren keresztül – Egyszerű és Haladó Megoldások

Az SMTP-alapú emailküldés többféle módon valósítható meg, legyen szó alapvető vagy haladóbb megközelítésekről. Az alábbiakban bemutatjuk az egyszerűbb és összetettebb lehetőségeket is, valamint egy példa PHP-kódot.


Egyszerű megoldás: Bérelj tárhelyet és domaint

A legegyszerűbb módja az SMTP-alapú levelezésnek, ha bérlünk egy tárhelyet és domaint.
A legtöbb tárhely támogatja a PHP futtatását és előre beállított SMTP-t, így a leveleket közvetlenül küldhetjük a PHP mail() függvényével, az alábbiak szerint:

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

?>

Fontos tipp: Randomizált tartalom a SPAM elkerüléséhez

A SPAM szűrők elkerüléséről szóló cikkünkben már hangsúlyoztuk, hogy a levelek tartalmát érdemes randomizálni. A fenti PHP-kód is ezt teszi, a tárgyak és mondatok véletlenszerű választásával.


Haladó megoldás: Lokális webszerver és adatbázis használata

Amennyiben komplexebb megoldásra van szükséged, lokális webszerver (például Apache vagy Nginx) futtatása is lehetséges. A következő kód egy MySQL adatbázisból veszi a címzetteket, miközben szintén randomizált tartalommal küldi el az emaileket:

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

Kapcsolódó cikkek

Mind az egyszerűbb, mind a haladóbb módszer rugalmas lehetőségeket nyújt a tömeges emailküldéshez. Válaszd ki az igényeidnek megfelelő megoldást, és kezdj bele a kampányokba!