বিলম্বিত ইমেল পাঠান

সময় ঠিক না? ইমেল খুব তাড়াতাড়ি পাঠানো হয়েছে? ইমেল বিলম্বিত করা অনেক পরিস্থিতিতে কার্যকর হতে পারে: নিজেকে পর্যালোচনার সময় দিতে বা আপনার নিজের কাজের চাপ কার্যকরভাবে পরিচালনা করতে - সময় গুরুত্বপূর্ণ হতে পারে। এখানে তিনটি উপায় রয়েছে যে আপনি ইমেল পাঠাতে বিলম্ব করতে পারেন এবং আপনার নিজস্ব যোগাযোগগুলি অপ্টিমাইজ করতে পারেন৷


আউটলুক

মাইক্রোসফ্ট আউটলুক একটি অন্তর্নির্মিত বৈশিষ্ট্য অফার করে যা আপনাকে ইমেলগুলি বিলম্বিত করতে দেয়। এটি করার জন্য আপনি ফাংশন ব্যবহার করুন "বিকল্প > বিলম্ব বিতরণ":

এই সমাধানের বড় অসুবিধা হল (এমনকি এক্সচেঞ্জ পরিবেশেও) আউটলুক পাঠানোর সময় ক্লায়েন্ট সাইডে চলতে হবে।

গুগল

Gmail এখানে একটি সামান্য ভাল সমাধান অফার করে। এটি করার জন্য, একটি ইমেল পাঠানোর আগে "শিডিউল পাঠান" এ যান।:

ইতিমধ্যে পাঠানো ইমেলগুলিও 30 সেকেন্ডের মধ্যে "পূর্বাবস্থায় ফেরানো" হতে পারে। এটি করার জন্য, আপনি প্রথমে "কল আপ সমস্ত সেটিংস" এর অধীনে সংশ্লিষ্ট সেটিংস সেট করুন।:

আপনি যদি এখন একটি ইমেল পাঠান, আপনি নীচের বাম দিকে এই সময়ের মধ্যে এটি পূর্বাবস্থায় ফেরাতে পারেন৷:

বুমেরাং

আউটলুকের জন্য বুমেরাং- এর মতো অর্থপ্রদানকারী পরিষেবা প্রদানকারী রয়েছে যা অনুস্মারক বা স্বয়ংক্রিয় ফলো-আপ ছাড়াও বিলম্বিত ইমেল প্রেরণের প্রস্তাব দেয়।:

এখানে অসুবিধা হল যে ইমেলগুলি তৃতীয় পক্ষের সার্ভারগুলিতে শেষ হয় এবং সেগুলি ব্যবহার করার জন্য একটি চার্জ রয়েছে৷

পিএইচপি

নিজে কিছু তৈরি করার জন্য যথেষ্ট কারণ: আপনি একটি ছোট পিএইচপি স্ক্রিপ্টের সাহায্যে আপনি যা চান তা অর্জন করতে পারেন। প্রথমত, আমরা আমাদের মেলবক্সে একটি ফোল্ডার গঠন তৈরি করি:

এটি কাঙ্ক্ষিত শিপিং সময় প্রতিফলিত করে। ওয়ার্কফ্লোতে এখন লিখিত ইমেলটি পাঠানোর পরিবর্তে এটিকে একটি খসড়া হিসাবে সংরক্ষণ করা এবং প্রাসঙ্গিক ফোল্ডারে স্থানান্তর করা রয়েছে। তারপরে আমরা প্রয়োজনীয় সমস্ত পিএইচপি প্যাকেজ ইনস্টল করি:

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
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 সামঞ্জস্যপূর্ণ) অ্যাকাউন্টের সাথে কাজ করে। কিন্তু আপনি Outlook বা Gmail-এ ইন্টিগ্রেটেড ফাংশন ব্যবহার করুন না কেন, বুমেরাং-এর মতো উন্নত টুল ব্যবহার করুন বা একটি স্বতন্ত্র সমাধান প্রয়োগ করুন - সময়-বদলের ভিত্তিতে ইমেল পাঠানো আপনার নিজের উত্পাদনশীলতা বাড়ানোর জন্য একটি মূল্যবান হাতিয়ার।

পেছনে