ovk13 / mail
Eden POP3、IMAP 和 SMTP 组件的分支
Requires
- php: >=5.4.1
- eden/array: 4.*
- eden/core: 4.*
- eden/file: 4.*
- eden/path: 4.*
- eden/string: 4.*
README
安装
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. 首次设置活动邮箱!
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存储库和你的分支机器
- 分支存储库
- 启动本地终端,从你的分支的
v4分支创建一个新的分支,分支名称描述你的更改。可能的分支名称类型- bugfix
- feature
- improvement
- 做出你的更改。始终确保在所有提交上签名(git commit -s -m "提交信息")
制作拉取请求
- 请在制作拉取请求之前确保运行
phpunit。 - 将你的代码推送到你远程分叉的版本。
- 返回到GitHub上的你分叉的版本,并提交拉取请求。
- 一个Eden开发者将审查你的代码,并在它被分类为合适时将其合并。