Envío de correos electrónicos a través del servidor SMTP – Soluciones simples y avanzadas

El envío de correos electrónicos basado en SMTP se puede implementar de varias maneras, ya sea con un enfoque básico o avanzado. A continuación, presentamos opciones más simples y más complejas, junto con un ejemplo de código PHP.

Solución simple: Alquila un hosting y un dominio

La forma más sencilla de utilizar el envío de correos electrónicos basado en SMTP es alquilando un hosting y un dominio.
La mayoría de los servicios de hosting admiten la ejecución de PHP y tienen SMTP preconfigurado, lo que te permite enviar correos electrónicos directamente usando la función mail() de PHP, como sigue:

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

?>

Consejo importante: Contenido aleatorio para evitar el SPAM
En nuestro artículo sobre cómo evitar los filtros de SPAM, ya destacamos que vale la pena aleatorizar el contenido de los correos electrónicos. El código PHP anterior también hace esto eligiendo aleatoriamente asuntos y frases.

Solución avanzada: Uso de un servidor web local y una base de datos
Si necesitas una solución más compleja, también es posible ejecutar un servidor web local (por ejemplo, Apache o Nginx). El siguiente código obtiene los destinatarios de una base de datos MySQL mientras envía correos electrónicos con contenido aleatorio.

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

Enlaces relacionados:

Tanto los métodos simples como los avanzados ofrecen opciones flexibles para el envío masivo de correos electrónicos. ¡Elige la solución que mejor se adapte a tus necesidades y comienza tu campaña!