lucasccs/imap-bundle
PHP-IMAP 和 Symfony 集成。
Requires
- php: >=8.0
- php-imap/php-imap: ~4.4|~5.0
- symfony/dependency-injection: ~6.0|~7.0
- symfony/framework-bundle: ~6.0|~7.0
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 的自定义内容?没问题!此应用程序可以做到这一切,还有更多!
安装
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 商业环境,您很可能想连接到共享邮箱。在这种情况下,您需要指定参数 authuser
和 user
。其中 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(); }
请注意,这将在成功时断开您的当前连接并创建一个新的连接。在大多数情况下,这不是问题。