ezstoritve/m365-mail

Laravel M365 Mail Package 使用 MSGraph API

v1.1.6 2024-09-02 17:16 UTC

This package is auto-updated.

Last update: 2024-09-05 17:19:10 UTC


README

Latest Stable Version Total Downloads Donate

Laravel M365 Mail Package

此包提供对 Microsoft M365 邮件功能的无缝访问,允许您轻松地将电子邮件处理集成到您的 Laravel 应用程序中。它支持使用 Microsoft Graph API 发送和读取电子邮件,使得直接从您的代码中处理 M365 邮箱变得容易。使用此包,您可以利用发送、获取电子邮件和下载附件等功能,同时通过 Microsoft Azure 应用凭证安全地管理身份验证。

安装

您可以通过 composer 安装此包

// add repository to composer.json in your project - not needed anymore as package is on https://packagist.org.cn/packages/ezstoritve/m365-mail
"repositories": [
    {
        "type": "vcs",
        "url": "https://github.com/ezstoritve/m365-mail.git"
    }
],
    
// install package
composer require ezstoritve/m365-mail

配置

注册并配置 Microsoft Azure 应用

快速入门:使用 Microsoft 身份平台注册应用程序

配置您的 Laravel 应用程序

要集成 m365-mail 驱动程序,请先在您的 config/mail.php 配置文件中的 mailers 数组中添加一个新条目

'mailers' => [
    'm365-mail' => [
        'transport' => 'm365-mail',
        'tenant_id' => env('MICROSOFT_GRAPH_TENANT_ID'),
        'client_id' => env('MICROSOFT_GRAPH_CLIENT_ID'),
        'client_secret' => env('MICROSOFT_GRAPH_CLIENT_SECRET'),
        'from_address' => env('MAIL_FROM_ADDRESS'),
        'from_name' => env('MAIL_FROM_NAME')
    ],
    ...
]

此条目配置了 m365-mail 传输并设置了所需的凭证和发件人信息。

接下来,在您的 .env 文件中配置以下变量以使用 Microsoft Azure 应用的凭证

MAIL_MAILER=m365-mail
MICROSOFT_GRAPH_TENANT_ID="your_tenant_id"
MICROSOFT_GRAPH_CLIENT_ID="your_client_id"
MICROSOFT_GRAPH_CLIENT_SECRET="your_client_secret_value"
MAIL_FROM_ADDRESS="from.mail@domain.com"
MAIL_FROM_NAME="from_name"

这些变量将用于通过 Microsoft Graph API 进行身份验证和发送电子邮件,确保您的 Laravel 应用程序正确连接到您的 Azure 设置。

使用方法

Mail::send 方法以及回调中的 $m 对象接受所有标准 Laravel 参数,包括

  • To, Cc, Bcc:指定收件人。
  • Subject:设置电子邮件主题。
  • From:定义发件人的电子邮件。
  • ReplyTo:设置回复地址。
  • 附件:将文件附加到电子邮件。
  • 正文(文本或 HTML):编写电子邮件内容。

这些参数允许在应用程序中对电子邮件消息进行全面自定义。

示例代码

Mail::send('blade.file', [], function ($m) {
    $m->to('email.to@domain.com', 'Recipient Name')
        ->subject('Mail subject')
        ->getHeaders()->addTextHeader('X-Save', 'true'); // save an email to the sent items folder - optional
});

Mail::read 函数接受以下参数

  • FolderPath(Inbox\Folder1...):指定要从中读取的 Microsoft 365 邮箱中的哪个文件夹。
  • Mailbox(用户电子邮件):要读取的用户邮箱的电子邮件地址。
  • GetFiles(true, false):确定是否检索附件内容Bytes,允许手动下载。
  • Download(true, false):自动将附件下载到指定的文件夹。
  • FilePath(例如,public_path('temp')):允许您为下载的文件设置自定义路径。

此代码可以根据您的特定要求进行自定义。

示例代码

$folderPath = 'Inbox\Folder1';
$mailbox = 'user.mail@domain.com';

$result = Mail::read([
    MailReadParams::FolderPath => $folderPath,
    MailReadParams::Mailbox => $mailbox,
    MailReadParams::GetFiles => false
], function ($emails) {
    $output = '';
    foreach ($emails as $email) {
        $output .= '<h3>' . htmlspecialchars($email['subject']) . '</h3>';
        $output .= '<p>From: ' . htmlspecialchars($email['fromName']) . ' (' . htmlspecialchars($email['from']) . ')</p>';
        $output .= '<p>To: ' . htmlspecialchars(implode(', ', array_column($email['to'], 'address'))) . '</p>';
        $output .= '<p>CC: ' . htmlspecialchars(implode(', ', array_column($email['cc'], 'address'))) . '</p>';
        $output .= '<p>BCC: ' . htmlspecialchars(implode(', ', array_column($email['bcc'], 'address'))) . '</p>';
        $output .= '<p>Date: ' . htmlspecialchars($email['receivedDateTime']) . '</p>';
        $output .= '<p>' . htmlspecialchars($email['bodyPreview']) . '</p>';
        if (!empty($email['attachments'])) {
            $output .= '<p>Attachments:</p><ul>';
            foreach ($email['attachments'] as $attachment) {
                $output .= '<li>' . htmlspecialchars($attachment['name']) . '</li>';
                //$output .= '<li>' . htmlspecialchars($attachment['contentBytes']) . '</li>';
            }
            $output .= '</ul>';
        }
        $output .= '<hr>';
    }
    return $output;
});

print_r($result);

Mail::read 方法返回一个包含以下字段的数组

  • id:电子邮件的唯一标识符。
  • subject:电子邮件的主题行。
  • from:发件人的电子邮件地址。
  • fromName:发件人的显示名称。
  • bodyPreview:电子邮件正文的预览。
  • receivedDateTime:电子邮件接收的时间戳。
  • hasAttachments:布尔值,指示电子邮件是否有附件。
  • to:收件人数组,包括他们的地址和姓名。
  • cc:CC 收件人数组,包括他们的地址和姓名。
  • bcc:BCC 收件人数组,包括他们的地址和姓名。
  • attachments:附件数组,每个附件包括文件名和 contentBytes(如果 GetFiles 为 true,允许手动下载)。
$emailDetails = [
    'id' => $email['id'],
    'subject' => $email['subject'],
    'from' => $email['from']['emailAddress']['address'],
    'fromName' => $email['from']['emailAddress']['name'],
    'bodyPreview' => $email['bodyPreview'],
    'receivedDateTime' => $email['receivedDateTime'],
    'hasAttachments' => $email['hasAttachments'],
    'to' => array_map(fn($recipient) => [
        'address' => $recipient['emailAddress']['address'],
        'name' => $recipient['emailAddress']['name'],
    ], $email['toRecipients'] ?? []),
    'cc' => array_map(fn($recipient) => [
        'address' => $recipient['emailAddress']['address'],
        'name' => $recipient['emailAddress']['name'],
    ], $email['ccRecipients'] ?? []),
    'bcc' => array_map(fn($recipient) => [
        'address' => $recipient['emailAddress']['address'],
        'name' => $recipient['emailAddress']['name'],
    ], $email['bccRecipients'] ?? []),
    'attachments' => [
        0 => [
            'name' => 'file name', 
            'contentBytes' => '' // if GetFiles is set to true - you can manualy download files in Mail:read function
        ],
        ...
    ]
];

更新日志

有关最近更改的更多信息,请参阅 更新日志

鸣谢

许可证

麻省理工学院许可证(MIT)。更多信息请参阅许可证文件