vymak/eden-mail

Eden POP3、IMAP 和 SMTP 组件

4.0.4 2018-03-23 14:30 UTC

This package is not auto-updated.

Last update: 2024-09-23 07:38:22 UTC


README

Build Status

安装

composer install eden/mail

为了使用

启用 Eden

以下文档在示例引用中使用 eden()。启用此功能需要额外步骤,如本节所述,如果使用以下方式访问此包则不需要。

Eden\Core\Control::i();

当使用 composer 时,没有简单的方法来访问包中的函数。作为解决方案,在您的代码中添加此常量将允许 eden() 在之后可用。

Eden::DECORATOR;

例如

Eden::DECORATOR;

eden()->inspect('Hello World');

简介

Eden 提供了与邮件服务器交互的常见三种方式,包括 SMTP、IMAP 和 POP3。访问每种协议的方式如图 1 所示。

图 1. 工厂

$imap = eden('mail')->imap(
    'imap.gmail.com', 
    'your_email@gmail.com', 
    '[YOUR PASSWORD]', 
    993, 
    true);

$pop3 = eden('mail')->pop3(
    'pop.gmail.com', 
    'your_email@gmail.com', 
    '[YOUR PASSWORD]', 
    995, 
    true);

$smtp = eden('mail')->smtp(
    'smtp.gmail.com', 
    'your_email@gmail.com', 
    '[YOUR PASSWORD]', 
    465, 
    true);

对于所有三种协议,都需要四个要求,并且所有要求都取决于您特定的电子邮件提供商。在上面的图中,我们使用 GMAIL 设置作为示例。最后一个参数是一个标志。如果您的电子邮件提供商需要 SSL,则将其设置为 true。

IMAP

Eden 的 IMAP 对象使用 fsocket() 而不是 PHP 内置的 IMAP 函数。我们选择使用 fsocket() 完全是出于性能原因。您会发现使用 Eden 设置 IMAP 总体上更容易。图 2 显示了如何设置 IMAP 对象。

图 2. 设置 IMAP 对象

$imap = eden('mail')->imap(
    'imap.gmail.com', 
    'your_email@gmail.com', 
    '[YOUR PASSWORD]', 
    993, 
    true);

非常简单,需要四个要求,并且所有要求都取决于您特定的电子邮件提供商。在上面的图中,我们使用 GMAIL 设置作为示例。最后一个参数是一个标志。如果您的电子邮件提供商需要 SSL,则将其设置为 true。

邮箱

接下来,我们想了解可以设置为活动的可用邮箱。要获取邮箱列表,请参照图 3。

图 3. 邮箱列表

$mailboxes = $imap->getMailboxes(); 

执行上述命令将得到以下结果。

Array (
    [0] => Deleted Messages
    [1] => Drafts
    [2] => INBOX
    [3] => Junk E-mail
    [4] => Notes
    [5] => Sent Messages
    [6] => Trash
    [9] => [Gmail]/All Mail
    [10] => [Gmail]/Drafts
    [11] => [Gmail]/Important
    [12] => [Gmail]/Personal
    [13] => [Gmail]/Sent Mail
    [14] => [Gmail]/Spam
    [15] => [Gmail]/Starred
    [16] => [Gmail]/System
    [17] => [Gmail]/Trash
    [18] => [Gmail]/Unsorted
)

我们查看的每个邮件服务器都有 INBOX 文件夹。因此,在不确定的情况下,我们可以说这应该是默认的活动邮箱。接下来,让我们将 INBOX 设置为活动邮箱。图 4 显示了如何在一行中设置和检索活动邮箱。

图 4. 设置活动邮箱 FIRST!

echo $imap->setMailboxes('INBOX')->getActiveInbox(); //--> INBOX 

电子邮件

现在我们已经设置了活动邮箱,我们可以继续获取电子邮件列表。图 5 显示了如何进行操作。

图 5. 获取电子邮件列表

$emails = $imap->getEmails(0, 3); 
$count = $imap->getEmailTotal(); 

执行上述图将产生类似以下片段的结果。

图 5a. 示例电子邮件结果

Array (
    [0] => Array
        (
            [id] => <50041ab1c9383_178f6b3294527919f@job01.tmail>
            [parent] => 
            [topic] => Trending Startups and Updates
            [mailbox] => INBOX
            [uid] => 22363
            [date] => 1342446257
            [subject] => Trending Startups and Updates
            [from] => Array( [name] => AngelList [email] => noreply@angel.co )
            [flags] => Array ( [0] => seen )
            [to] => Array ( [0] => Array( [email] => youremail@gmail.com ) )
            [cc] => Array()
            [bcc] => Array()
        )
     
    ...
)

如您所意识到,电子邮件列表不包含完整的正文或附件。标准的 IMAP 实践解释说,您不应尝试获取详细列表,因为完整数据的仅大小就可能需要很长时间。当用户特别要求查看正文时才应检索完整详情。图 6 显示了如何获取电子邮件的详细信息。

图 6. 获取完整的电子邮件详情

$email = $imap->getUniqueEmails(22363, true); 
echo $email['body']['text/html'];

在上面的图中,我们调用 getUniqueEmails(),第一个参数应该是 图 5a 中找到的唯一标识符 (UID)。第二个参数是是否要获取正文,通常保持为 true。您可以使用以下方式通过 UIDs 获取一封或多封电子邮件,用逗号分隔。

图6a. 获取多个邮件详情

$emails = $imap->getUniqueEmails(array(22363, 22364), true);

在列表请求中包含正文和附件将花费很长时间,不推荐这样做。

搜索

搜索邮件遵循基本的IMAP搜索格式。如何在图7中搜索的示例。

图7. 搜索

$emails = $imap->search(array('TO "youremail@gmail.com"'), 0, 3); 

搜索限制在活动邮箱中的邮件。这是一个IMAP标准。没有解决办法。

以下列出了搜索查询的组合

ALL - return all messages matching the rest of the criteria
ANSWERED - match messages with the \\ANSWERED flag set
BCC "string" - match messages with "string" in the Bcc: field
BEFORE "date" - match messages with Date: before "date"
BODY "string" - match messages with "string" in the body of the message
CC "string" - match messages with "string" in the Cc: field
DELETED - match deleted messages
FLAGGED - match messages with the \\FLAGGED (sometimes referred to as Important or Urgent) flag set
FROM "string" - match messages with "string" in the From: field
KEYWORD "string" - match messages with "string" as a keyword
NEW - match new messages
OLD - match old messages
ON "date" - match messages with Date: matching "date"
RECENT - match messages with the \\RECENT flag set
SEEN - match messages that have been read (the \\SEEN flag is set)
SINCE "date" - match messages with Date: after "date"
SUBJECT "string" - match messages with "string" in the Subject:
TEXT "string" - match messages with text "string"
TO "string" - match messages with "string" in the To:
UNANSWERED - match messages that have not been answered
UNDELETED - match messages that are not deleted
UNFLAGGED - match messages that are not flagged
UNKEYWORD "string" - match messages that do not have the keyword "string"
UNSEEN - match messages which have not been read yet

操作

你可能还想执行的一些其他操作是移动邮件和删除邮件。以下图示显示了Eden可以执行的基本操作。

图8. 将邮件移动到另一个文件夹

$imap->move(22363, 'Notes'); 

图9. 删除邮件

$imap->remove(22363, true); 

图10. 别忘了断开连接!

$imap->disconnect(); 

POP3

Eden的POP3对象使用fsocket()而不是PHP内置的IMAP功能。我们选择使用fsocket()纯粹是因为性能原因。你会发现使用Eden设置POP3要容易得多。图11显示了如何设置POP3对象。

图11. 设置POP3对象

$pop3 = eden('mail')->pop3(
    'pop.gmail.com', 
    'your_email@gmail.com', 
    '[YOUR PASSWORD]', 
    995, 
    true);

非常简单,需要四个要求,所有要求都取决于你特定的电子邮件提供商。在上面的图中,我们使用GMAIL设置作为示例。最后一个参数是一个标志。如果你的电子邮件提供商需要SSL,请将其设置为true。现在我们已经设置了连接信息,我们可以继续获取邮件列表。图12显示了如何进行。

图12. 获取邮件

$emails = $pop3->getEmails(0, 10); 
$count = $pop3->getEmailTotal();

执行上述图示将返回邮件列表以及总数。你可能还想执行的其他操作是删除邮件。以下图示显示了使用Eden可以执行的基本操作。

图13. 删除邮件

$pop3->remove(100); 

图14. 别忘了断开连接!

$pop3->disconnect(); 

SMTP

在Eden中,SMTP相对容易。我们使用fsocket()而不是PHP内置的SMTP功能。我们选择使用fsocket()是因为PHP的mail()函数很可能将你的邮件放入垃圾邮件文件夹。SMTP效果更好,因为发送的邮件是通过你的实际电子邮件服务器而不是你的网站主机发送的。图15显示了如何设置SMTP对象。

图15. 设置SMTP对象

$smtp = eden('mail')->smtp(
    'smtp.gmail.com', 
    'your_email@gmail.com', 
    '[YOUR PASSWORD]', 
    465, 
    true);

非常简单,需要四个要求,所有要求都取决于你特定的电子邮件提供商。在上面的图中,我们使用GMAIL设置作为示例。最后一个参数是一个标志。如果你的电子邮件提供商需要SSL,请将其设置为true。接下来就是简单地发送你的邮件。

图16. 简单发送

$smtp->setSubject('Welcome!')
    ->setBody('<p>Hello you!</p>', true)
    ->setBody('Hello you!')
    ->addTo('email1@gmail.com')
    ->addTo('email2@gmail.com')
    ->addCC('email3@gmail.com')
    ->addCC('email4@gmail.com')
    ->addBCC('email5@gmail.com')
    ->addBCC('email6@gmail.com')
    ->addAttachment('file.jpg', '/path/to/file.jpg', 'mime-type')
    ->send();

图16中,我们基本上列出了你可以使用的所有可能的发送邮件的方法。设置addTo()方法至少一次是很重要的。

图17. 别忘了断开连接!

$smtp->disconnect(); 

为Eden做贡献

Eden做的贡献遵循Github工作流程。请在贡献之前阅读。

设置你的机器上的Eden存储库和你的分支

  1. 分支存储库
  2. 在你的本地终端中启动,从你的分支的v4分支创建一个新的分支,分支名称描述了你的更改。可能的分支名称类型
    • bugfix
    • feature
    • improvement
  3. 做出你的更改。始终确保在所有提交上签出(git commit -s -m "提交信息")

制作拉取请求

  1. 请在提交拉取请求之前运行phpunit
  2. 将你的代码推送到你的远程分支。
  3. 回到你的GitHub上的分支,提交拉取请求。
  4. 一位Eden开发者将审查您的代码,并在其被认定为合适时将其合并。