php实现收发邮件的方法详解
<?php
declare(strict_types=1);
namespace AppControllerv1email;
use AppControllerAbstractController;
use PhpImapException;
use PhpImapMailbox;
use PHPMailerPHPMailerPHPMailer;
use PHPMailerPHPMailerSMTP;
/**
* Desc: 电子邮件相关
*/
class EmailController extends AbstractController
{
public const imapServer = '{imap.qq.com:993/imap/ssl}'; // QQ 邮箱的 IMAP 服务器地址
public const imapUsername = '11***039@qq.com'; // 您的 QQ 邮箱地址
public const imapPassword = '***'; // 您的 QQ 邮箱密码
public const attachmentPath = BASE_PATH . '/storage/email/'; // 您的 附件 保存目录
/**
* Desc: 方法一 邮件发送与接收 -- 如果乱码需要配置 GB2312 UTF-8
* Date: 2023-10-31 18:38
* @return PsrHttpMessageResponseInterface
*/
public function receiveMailWithAttachments()
{
$params = $this->request->post();
$imapServer = $params['imapServer'] ?? self::imapServer; // QQ 邮箱的 IMAP 服务器地址
$smtpServer = $params['smtpServer'] ?? self::imapServer; // QQ 邮箱的 smtp 服务器地址
$imapUsername = $params['imapUsername'] ?? self::imapUsername; // 您的 QQ 邮箱地址
$imapPassword = $params['imapPassword'] ?? self::imapPassword; // 您的 QQ 邮箱密码
var_dump($imapServer, $smtpServer, $imapUsername, $imapPassword);
$mail = new PHPMailer(true);
try {
//Server settings
$mail->SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output
$mail->isSMTP(); //Send using SMTP
$mail->Host = $smtpServer;//'smtp.example.com'; //Set the SMTP server to send through
$mail->SMTPAuth = true; //Enable SMTP authentication
$mail->Username = $imapUsername;//'user@example.com'; //SMTP username
$mail->Password = $imapPassword; //SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption
$mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
//测发送 -- 成功
$mail->setFrom($imapUsername, 'Mailer');
$mail->addAddress('28***511@qq.com', 'John Doe');
$mail->Subject = 'PHPMailer SMTP test';
$mail->Body = 'This is a test email message';
if (!$mail->send()) {
echo 'Message could not be sent.' . "
";
echo 'Mailer Error: ' . $mail->ErrorInfo . "
";
} else {
echo 'Message has been sent' . "
";
}
$msg_id = $mail->getLastMessageID();
echo "LastMessageID => " . $msg_id . "
";
//测收件
$inbox = imap_open($imapServer, $imapUsername, $imapPassword);
$result = imap_search($inbox, 'UNSEEN');
foreach ($result as $mail_id) {
$structure = imap_fetchstructure($inbox, $mail_id);
for ($i = 0; $i < count($structure->parts); $i++) {
if ($structure->parts[$i]->ifdparameters) {
foreach ($structure->parts[$i]->dparameters as $object) {
if (strtolower($object->attribute) == 'filename') {
$filename = $object->value;
$file_data = imap_fetchbody($inbox, $mail_id, (string)($i + 1));
$file_mime = imap_fetchmime($inbox, $mail_id, (string)($i + 1));
$file_text = imap_fetchtext($inbox, $mail_id);
$file_structure = imap_fetchstructure($inbox, $mail_id);
// 处理附件内容...
var_dump('读取1 file:[' . $mail_id . ']', $filename, $file_mime, $file_text, $file_structure);
// 将附件保存到指定目录
file_put_contents(self::attachmentPath . $filename, $file_data);
}
}
}
}
}
imap_close($inbox);
} catch (Throwable $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
var_dump($e->getLine() . ' ' . $e->getMessage());
}
return response_api(200, 'success');
}
/** 方法二 邮件接收
* @throws Exception
*/
public function receiveMailWithAttachmentsImap()
{
$params = $this->request->post();
$imapServer = $params['imapServer'] ?? self::imapServer; // QQ 邮箱的 IMAP 服务器地址
$smtpServer = $params['smtpServer'] ?? self::imapServer; // QQ 邮箱的 smtp 服务器地址
$imapUsername = $params['imapUsername'] ?? self::imapUsername; // 您的 QQ 邮箱地址
$imapPassword = $params['imapPassword'] ?? self::imapPassword; // 您的 QQ 邮箱密码
$attachmentPath = $params['attachmentPath'] ?? self::attachmentPath; // 您的附件存放地址
var_dump($imapServer, $smtpServer, $imapUsername, $imapPassword);
$mailbox = new PHPMailer(true);
$mailbox->isSMTP();
$mailbox = new Mailbox($imapServer, $imapUsername, $imapPassword, $attachmentPath);
$mailIds = $mailbox->searchMailbox('UNSEEN'); // 搜索未读邮件
var_dump('-------------2--------------', $mailIds);
foreach ($mailIds as $mailId) {
$email = $mailbox->getMail($mailId);
// 获取邮件主题、发件人、正文等信息
$subject = $email->subject;//正文text内容
$from = $email->fromName;//发送者 **@qq.com
$textHtml = $email->textHtml;//正文html内容
$date = $email->date;//收件时间
$getAttachments = $email->getAttachments();//附件数组
$fromAddress = $email->fromAddress;//来件者地址名称 **@qq.com
$fromName = $email->fromName;//来件者姓名
var_dump($subject);
var_dump($from);
var_dump($textHtml);
var_dump($date);
var_dump($getAttachments);
var_dump($fromAddress);
var_dump($fromName);
// 处理附件
// foreach ($getAttachments as $attachment) {
// $filename = $attachment->name;
// $filePath = $attachment->filePath;
//
// // 将附件保存到指定目录
file_put_contents($attachmentPath . $filename, $contents);
// }
// 在这里可以执行你的逻辑,例如将邮件信息写入数据库或者进行其他处理
}
}
}