समय ठीक नहीं है? ईमेल बहुत जल्दी भेजा गया? ईमेल में देरी करना कई स्थितियों में उपयोगी हो सकता है: चाहे खुद को समीक्षा के लिए समय देना हो या अपने कार्यभार को प्रभावी ढंग से प्रबंधित करना हो - समय महत्वपूर्ण हो सकता है। यहां तीन तरीके दिए गए हैं जिनसे आप ईमेल भेजने में देरी कर सकते हैं और अपने संचार को अनुकूलित कर सकते हैं।
आउटलुक
माइक्रोसॉफ्ट आउटलुक एक अंतर्निहित सुविधा प्रदान करता है जो आपको ईमेल में देरी करने की अनुमति देता है। ऐसा करने के लिए आप फ़ंक्शन का उपयोग करें "विकल्प > विलंबित डिलीवरी":

इस समाधान का बड़ा नुकसान यह है कि (एक्सचेंज परिवेश में भी) भेजने के समय आउटलुक को क्लाइंट साइड पर चलाना पड़ता है।
गूगल
जीमेल यहां थोड़ा बेहतर समाधान पेश करता है। ऐसा करने के लिए, ईमेल भेजने से पहले "शेड्यूल सेंड" पर जाएं।:

जो ईमेल पहले ही भेजे जा चुके हैं उन्हें 30 सेकंड के भीतर "पूर्ववत" भी किया जा सकता है। ऐसा करने के लिए, आप सबसे पहले संबंधित सेटिंग को "सभी सेटिंग्स को कॉल करें" के अंतर्गत सेट करें।:

यदि आप अब कोई ईमेल भेजते हैं, तो आप नीचे बाईं ओर इस समयावधि के भीतर इसे पूर्ववत कर सकते हैं:

बुमेरांग
आउटलुक के लिए बूमरैंग जैसे सशुल्क सेवा प्रदाता हैं, जो अनुस्मारक या स्वचालित फॉलो-अप के अलावा, विलंबित ईमेल भेजने की भी पेशकश करते हैं।:

यहां नुकसान यह है कि ईमेल तीसरे पक्ष के सर्वर पर पहुंच जाते हैं और उनका उपयोग करने के लिए शुल्क लगता है।
पीएचपी
स्वयं कुछ बनाने के लिए पर्याप्त कारण: आप एक छोटी PHP स्क्रिप्ट की सहायता से भी जो चाहते हैं उसे प्राप्त कर सकते हैं। सबसे पहले, हम अपने मेलबॉक्स में एक फ़ोल्डर संरचना बनाते हैं:

यह वांछित शिपिंग समय को दर्शाता है। वर्कफ़्लो में अब लिखित ईमेल को भेजने और संबंधित फ़ोल्डर में ले जाने के बजाय ड्राफ्ट के रूप में सहेजना शामिल है। फिर हम सभी आवश्यक PHP पैकेज स्थापित करते हैं:
composer require php-imap/php-imap phpmailer/phpmailer vlucas/phpdotenv
अंत में हम एक बनाते हैं .env
-एक्सेस डेटा और सेटिंग्स के साथ फाइल:
HOST_SMTP="xxx"
PORT_SMTP=465
HOST_IMAP="xxx"
PORT_IMAP=993
USERNAME="foo@bar.com"
PASSWORD="xxx"
ENCRYPTION="ssl"
FROM_ADDRESS="foo@bar.com"
FROM_NAME="Foo Bar"
FOLDER_INBOX="INBOX/DELAY"
FOLDER_OUTBOX="Gesendete Elemente"
PHP_EXECUTABLE="/usr/bin/php"
इसके बाद निम्नलिखित PHP स्क्रिप्ट बाकी काम करती है:
<?php
require_once __DIR__ . '/vendor/autoload.php';
class MailDelay
{
private \PhpImap\Mailbox $mailbox;
private array $folders;
public function init(): void
{
$this->loadEnvironmentVariables();
$this->initMailbox();
$this->initFolders();
$this->processFolders();
}
private function loadEnvironmentVariables(): void
{
$dotenv = \Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
}
private function initMailbox(): void
{
$this->mailbox = new \PhpImap\Mailbox(
'{' . $_SERVER['HOST_IMAP'] . ':' . $_SERVER['PORT_IMAP'] . '/imap/ssl}' . $_SERVER['FOLDER_INBOX'],
$_SERVER['USERNAME'],
$_SERVER['PASSWORD'],
sys_get_temp_dir(),
'UTF-8'
);
}
private function initFolders(): void
{
$this->folders = [];
$folders = $this->mailbox->getMailboxes('*');
foreach ($folders as $folder) {
if ($folder['shortpath'] === $_SERVER['FOLDER_INBOX']) {
continue;
}
$this->folders[] = (object) $folder;
}
}
private function processFolders(): void
{
foreach ($this->folders as $folder) {
$this->mailbox->switchMailbox($folder->fullpath);
$mailIds = $this->mailbox->searchMailbox('ALL');
foreach ($mailIds as $mailId) {
$preparedMail = $this->prepareMailData($mailId, $folder->shortpath);
if (
$preparedMail->subject !== 'Dies ist Plain Text' &&
strtotime($preparedMail->time_to_send) > strtotime('now')
) {
continue;
}
try {
$this->sendMail($preparedMail);
echo 'Successfully sent mail #' . $preparedMail->id . '.' . PHP_EOL;
} catch (\Exception $e) {
echo 'Error in sending mail #' . $preparedMail->id . ': ' . $e->getMessage() . PHP_EOL;
}
}
}
echo 'All mails have been processed.' . PHP_EOL;
}
private function prepareMailData(int $id, string $folder): object
{
$mail = $this->mailbox->getMail($id, false); // don't mark as unread
return (object) [
'id' => (string) $mail->id,
'to' => $this->formatEmailAddresses($mail->to),
'cc' => $this->formatEmailAddresses($mail->cc),
'bcc' => $this->formatEmailAddresses($mail->bcc),
'subject' => (string) $mail->subject,
'content_html' => $this->convertEncoding($mail->textHtml),
'content_plain' => $this->convertEncoding($mail->textPlain),
'attachments' => $this->determineAttachments($mail->getAttachments()),
'time_to_send' => $this->determineTimeToSend(explode('/', $folder)[2], $mail->date)
];
}
private function formatEmailAddresses(?array $addresses): ?array
{
if (empty($addresses)) {
return null;
}
return array_map(
function ($key, $value) {
return [
'email' => $key,
'name' => $key === $value ? null : str_replace(' (' . $key . ')', '', $value)
];
},
array_keys($addresses),
$addresses
);
}
private function convertEncoding(string $text): string
{
return mb_detect_encoding($text, 'UTF-8, ISO-8859-1') !== 'UTF-8'
? \UConverter::transcode($text, 'UTF8', 'ISO-8859-1')
: $text;
}
private function determineAttachments(array $attachmentsImap): array
{
$attachments = [];
if (!empty($attachmentsImap)) {
foreach ($attachmentsImap as $attachment) {
$attachments[] = [
'name' => $attachment->name,
'file' => $attachment->filePath,
'disposition' => $attachment->disposition,
'inline_id' => $attachment->contentId
];
}
}
return $attachments;
}
private function determineTimeToSend(string $delayTime, string $date): ?string
{
$timeToSend = null;
if ($delayTime === 'THIS EVENING') {
$timeToSend = date('Y-m-d', strtotime($date)) . ' 18:00:00';
} elseif ($delayTime === 'THIS NIGHT') {
$timeToSend =
date('Y-m-d', strtotime($date . (date('H', strtotime($date)) >= 4 ? ' + 1 day' : ''))) . ' 03:42:00';
} elseif ($delayTime === 'NEXT MORNING') {
$timeToSend =
date('Y-m-d', strtotime($date . (date('H', strtotime($date)) >= 9 ? ' + 1 day' : ''))) . ' 09:00:00';
} elseif ($delayTime === 'NEXT WEEK') {
$date = new \DateTime(date('Y-m-d', strtotime($date)));
$date->modify('next monday');
$timeToSend = $date->format('Y-m-d') . ' 09:00:00';
}
return $timeToSend;
}
private function sendMail(object $preparedMail): void
{
$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
$mail->isSMTP();
$mail->Host = $_SERVER['HOST_SMTP'];
$mail->Port = $_SERVER['PORT_SMTP'];
$mail->Username = $_SERVER['USERNAME'];
$mail->Password = $_SERVER['PASSWORD'];
$mail->SMTPSecure = $_SERVER['ENCRYPTION'];
$mail->setFrom($_SERVER['FROM_ADDRESS'], $_SERVER['FROM_NAME']);
$mail->SMTPAuth = true;
$mail->SMTPOptions = [
'tls' => ['verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true],
'ssl' => ['verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true]
];
$mail->CharSet = 'utf-8';
$this->addRecipients($mail, $preparedMail->to, 'addAddress');
$this->addRecipients($mail, $preparedMail->cc, 'addCC');
$this->addRecipients($mail, $preparedMail->bcc, 'addBCC');
$mail->isHTML(!empty($preparedMail->content_html));
$mail->Subject = $preparedMail->subject;
if (!empty($preparedMail->content_html)) {
$mail->Body = $preparedMail->content_html;
$mail->AltBody = !empty($preparedMail->content_plain)
? $preparedMail->content_plain
: strip_tags(str_replace(['<br>', '<br/>', '<br />'], "\r\n", $preparedMail->content_html));
} else {
$mail->Body = $preparedMail->content_plain;
}
$this->addAttachments($mail, $preparedMail->attachments);
$mail->send();
$this->mailbox->moveMail($preparedMail->id, $_SERVER['FOLDER_OUTBOX']);
}
private function addRecipients(\PHPMailer\PHPMailer\PHPMailer $mail, ?array $recipients, string $method): void
{
if (!empty($recipients)) {
foreach ($recipients as $recipient) {
$mail->$method($recipient['email'], $recipient['name']);
}
}
}
private function addAttachments(\PHPMailer\PHPMailer\PHPMailer $mail, array $attachments): void
{
if (!empty($attachments)) {
foreach ($attachments as $attachment) {
if (!empty($attachment['file']) && !empty($attachment['name']) && file_exists($attachment['file'])) {
if ($attachment['disposition'] === 'attachment') {
$mail->addAttachment($attachment['file'], $attachment['name']);
} elseif ($attachment['disposition'] === 'inline') {
$mail->AddEmbeddedImage(
$attachment['file'],
$attachment['inline_id'],
$attachment['name'],
'base64',
'image/png'
);
}
}
}
}
}
}
$md = new MailDelay();
$md->init();
ताकि यह स्क्रिप्ट बार-बार चले, हम एक बैश फ़ाइल बनाते हैं:
#!/usr/bin/env bash
source $(dirname "$0")/.env
"$PHP_EXECUTABLE" $(dirname "$0")/maildelay.php
फिर हम इस स्क्रिप्ट को क्रॉन जॉब के माध्यम से हर 10 मिनट में चलाते हैं:
*/10 * * * * /path/to/maildelay/maildelay.sh 2>&1
यह समाधान लचीला अनुकूलन योग्य, गोपनीयता-अनुकूल और मुफ़्त है। यह किसी भी (IMAP संगत) खाते के साथ काम करता है। लेकिन चाहे आप आउटलुक या जीमेल में एकीकृत फ़ंक्शन का उपयोग करें, बूमरैंग जैसे उन्नत टूल का उपयोग करें या एक व्यक्तिगत समाधान लागू करें - समय-स्थानांतरित आधार पर ईमेल भेजना आपकी खुद की उत्पादकता बढ़ाने के लिए एक मूल्यवान उपकरण है।