lucasccs/imap-bundle

PHP-IMAP 和 Symfony 集成。

dev-master / 2.0.x-dev 2024-01-10 15:13 UTC

This package is auto-updated.

Last update: 2024-09-10 16:54:02 UTC


README

为 Symfony 4.4, 5.x 和 6.x 提供的简单 php-imap 集成。

版本 2.0 及以上版本需要 PHP 8.0+ 和 Symfony 4.4+。如果您卡在之前的 PHP 或 Symfony 版本上,请使用版本 1.x。

版本 1.5 及以上版本仅兼容 Symfony 4+。已放弃对先前版本的支持。如果您想使用 Symfony 2.8 或 3.x,则应使用版本 1.4,这是最后一个兼容 Symfony 2.8 和 3.x 的版本。

想支持这个包吗?

考虑购买我们的 macOS 应用程序,允许您自定义 macOS 菜单栏。

Infinite Menu Bar 允许您将自定义元素添加到菜单栏。想显示当前 IP(本地或外部)、Macbook 电池状态、比特币价格,甚至任何 HTTP URL 或 API 的自定义内容?没问题!此应用程序可以做到这一切,还有更多!

Infinite Menu Bar

安装

1. Composer

从命令行运行

$ composer require secit-pl/imap-bundle

如果您使用 Symfony Flex,您已完成,可以进入配置部分;否则,您必须手动注册此包。

2. 注册包

如果您不使用 Symfony Flex,您必须手动在 /config/bundles.php 中注册此包,通过添加包声明。

return [
  ...
  new SecIT\ImapBundle\ImapBundle(),
];

配置

要设置您的邮箱配置,请打开 config/packages/imap.yaml 并调整其内容。

以下是一个示例配置

imap:
    connections:
        example_connection:
            mailbox: "{localhost:993/imap/ssl/novalidate-cert}INBOX"
            username: "email@example.com"
            password: "password"

        another_connection:
            mailbox: "{localhost:143}INBOX"
            username: "username"
            password: "password"
            attachments_dir: "%kernel.project_dir%/var/imap/attachments"
            server_encoding: "UTF-8"

        full_config_connection:
            mailbox: "{localhost:143}INBOX"
            username: "username"
            password: "password"
            attachments_dir: "%kernel.project_dir%/var/imap/attachments"
            create_attachments_dir_if_not_exists: true # default true
            created_attachments_dir_permissions: 777 # default 770
            server_encoding: "UTF-8"

如果您使用 Symfony 连接到 Microsoft 365 商业环境,您很可能想连接到共享邮箱。在这种情况下,您需要指定参数 authuseruser。其中 shared_account 是不带域的用户名,例如

imap:
    connections:
        example_connection:
            mailbox: "{outlook.office365.com:993/imap/ssl/authuser=first.last@example.com/user=shared_account}Root/Folder"
            username: "email@example.com"
            password: "password"

安全性

不要直接在配置文件中设置敏感数据,如邮箱、用户名和密码。您可能需要 编码值。请参阅 基于环境变量的配置在配置文件中引用秘密。更好的做法是在 .env.local 中设置它们,使用 Symfony Secrets 或 CI-Secrets。

imap:
    connections:
        example_connection:
            mailbox:  '%env(EXAMPLE_CONNECTION_MAILBOX)%'
            username: '%env(EXAMPLE_CONNECTION_USERNAME)%'
            password: '%env(EXAMPLE_CONNECTION_PASSWORD)%'

实际配置转储

php bin/console debug:config imap

验证邮箱是否可以正确连接

php bin/console imap-bundle:validate

结果

+--------------------------+-------------------+-------------------------------+--------------------+
| Connection               | Connect Result    | Mailbox                       | Username           |
+--------------------------+-------------------+-------------------------------+--------------------+
| example_connection       | SUCCESS           | {imap.strato.de:993/imap/ssl} | user@mail.com      |
| example_WRONG_connection | FAILED: Reason... | {imap.strato.de:993/imap/ssl} | WRONG              |
+--------------------------+-------------------+-------------------------------+--------------------+

如果连接失败,此命令可能需要一段时间。这是因为超时时间长。如果您在 CI-Pipeline 中使用它,请添加参数 -q。出于安全原因,密码不会显示。您可以设置一个连接数组以验证。

php bin/console imap-bundle:validate example_connection example_connection2

用法

使用自动装配

在您的控制器中

<?php

namespace App\Controller;

use SecIT\ImapBundle\Service\Imap;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class IndexController extends AbstractController
{
    public function indexAction(Imap $imap)
    {
        $exampleConnection = $imap->get('example_connection');
        $anotherConnection = $imap->get('another_connection');

        ...
    }

    ...
}

使用服务容器(仅适用于 Symfony < 6)

在您的控制器中

<?php

namespace App\Controller;

use SecIT\ImapBundle\Service\Imap;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class IndexController extends Controller
{
    public function indexAction()
    {
        $exampleConnection = $this->get('secit.imap')->get('example_connection');
        $anotherConnection = $this->get('secit.imap')->get('another_connection');

        ...
    }

    ...
}

从这一点开始,您可以使用 php-imap 库提供的任何方法。例如

$exampleConnection = $imap->get('example_connection');
$exampleConnection->getMailboxInfo();

要快速测试到服务器的连接,您可以使用 testConnection() 方法

// testing with a boolean response
$isConnectable = $imap->testConnection('example_connection');
var_dump($isConnectable);

// testing with a full error message
try {
    $isConnectable = $imap->testConnection('example_connection', true);
} catch (\Exception $exception) {
    echo $exception->getMessage();
}

请注意,这将在成功时断开您的当前连接并创建一个新的连接。在大多数情况下,这不是问题。