要實(shí)現(xiàn)PHP定時(shí)發(fā)送郵件,你可以使用以下方法:
<?php
// 收件人、發(fā)件人和SMTP服務(wù)器設(shè)置
$to = 'recipient@example.com';
$from = 'sender@example.com';
$smtp_server = 'smtp.example.com';
$smtp_port = 587;
$smtp_username = 'your_username';
$smtp_password = 'your_password';
// 創(chuàng)建PHPMailer實(shí)例
$mail = new PHPMailer();
$mail->isSMTP();
$mail->Host = $smtp_server;
$mail->SMTPAuth = true;
$mail->Username = $smtp_username;
$mail->Password = $smtp_password;
$mail->SMTPSecure = 'tls';
$mail->Port = $smtp_port;
// 發(fā)件人和收件人
$mail->setFrom($from);
$mail->addAddress($to);
// 郵件內(nèi)容
$mail->isHTML(true);
$mail->Subject = '定時(shí)郵件';
$mail->Body = '這是一封定時(shí)發(fā)送的郵件。';
// 發(fā)送郵件
if(!$mail->send()) {
echo '郵件發(fā)送失敗: ' . $mail->ErrorInfo;
} else {
echo '郵件發(fā)送成功';
}
?>
接下來(lái),設(shè)置一個(gè)定時(shí)任務(wù)(Linux中的cron或Windows中的Task Scheduler)來(lái)定期運(yùn)行上面的腳本。
composer require symfony/event-dispatcher
接下來(lái),創(chuàng)建一個(gè)PHP腳本,使用event庫(kù)來(lái)創(chuàng)建一個(gè)定時(shí)任務(wù):
<?php
require 'vendor/autoload.php';
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;
class SendEmailEvent extends Event
{
const NAME = 'send_email';
public $to;
public $from;
public $smtp_server;
public $smtp_port;
public $smtp_username;
public $smtp_password;
public function __construct(
$to,
$from,
$smtp_server,
$smtp_port,
$smtp_username,
$smtp_password
) {
$this->to = $to;
$this->from = $from;
$this->smtp_server = $smtp_server;
$this->smtp_port = $smtp_port;
$this->smtp_username = $smtp_username;
$this->smtp_password = $smtp_password;
}
}
class EmailSender
{
private $dispatcher;
public function __construct(EventDispatcher $dispatcher)
{
$this->dispatcher = $dispatcher;
}
public function sendEmail(SendEmailEvent $event)
{
// 在這里實(shí)現(xiàn)發(fā)送郵件的邏輯(使用上面的示例代碼)
}
}
// 創(chuàng)建事件分發(fā)器實(shí)例
$dispatcher = new EventDispatcher();
// 創(chuàng)建郵件發(fā)送器實(shí)例
$emailSender = new EmailSender($dispatcher);
// 創(chuàng)建定時(shí)任務(wù)
$event = new SendEmailEvent(
'recipient@example.com',
'sender@example.com',
'smtp.example.com',
587,
'your_username',
'your_password'
);
// 將定時(shí)任務(wù)添加到事件分發(fā)器
$dispatcher->addListener(
SendEmailEvent::NAME,
function (SendEmailEvent $event) use ($emailSender) {
$emailSender->sendEmail($event);
}
);
// 設(shè)置定時(shí)任務(wù)的執(zhí)行間隔(例如:每分鐘運(yùn)行一次)
$interval = 60;
// 使用無(wú)限循環(huán)來(lái)保持腳本持續(xù)運(yùn)行
while (true) {
// 分發(fā)定時(shí)任務(wù)事件
$dispatcher->dispatch(SendEmailEvent::NAME);
// 等待指定的時(shí)間間隔
sleep($interval);
}
這個(gè)示例中,我們創(chuàng)建了一個(gè)名為SendEmailEvent
的事件類,并在其中存儲(chǔ)了發(fā)送郵件所需的所有信息。我們還創(chuàng)建了一個(gè)名為EmailSender
的類,該類負(fù)責(zé)處理郵件發(fā)送邏輯。最后,我們使用一個(gè)無(wú)限循環(huán)來(lái)定期分發(fā)定時(shí)任務(wù)事件。
注意:這種方法需要你的腳本持續(xù)運(yùn)行,以便在指定的時(shí)間間隔內(nèi)發(fā)送郵件。你可以考慮將其部署到一個(gè)長(zhǎng)期運(yùn)行的服務(wù)器上,如Apache或Nginx。