이 튜토리얼에서는 대형 이메일 제공업체가 아직 우리를 위해 구축하지 않은 이메일 관리를 위한 새로운 기능을 구축하기 위해 PHP 및 IMAP을 사용하는 방법에 대한 몇 가지 실제 예를 보여 드리겠습니다.
이에 대한 나의 관심은 2010년에 내가 이메일 혁명을 위한 12가지 Gmail 아이디어(다시)를 썼을 때 시작되었지만 내가 원했던 대부분의 아이디어는 여전히 도달할 수 없었습니다. 그 중요성에도 불구하고 애플리케이션으로서의 이메일은 혁신이 상당히 느렸습니다.
이메일은 넘쳐나고 받은 편지함을 관리하는 것은 여전히 큰 부담이 될 수 있습니다. 메일 서비스와 고객은 이와 관련하여 우리에게 거의 도움을 주지 않았습니다. 우리가 받는 대부분의 이메일은 사람이 아닌 기계를 통해 전송되지만, 우리는 이를 모두 개별적으로 처리해야 합니다.
내 이메일을 분석한 결과 230명이 넘는 자동 발신자로부터 이메일을 받은 것으로 나타났습니다. 반면 실제 발신자 수는 훨씬 적었습니다. Gmail에서 필터를 만들고 수많은 구독 취소 양식을 작성하는 데 지쳤습니다. 나는 이메일 관리를 더 잘 제어하고 생활을 단순화하고 싶습니다.
마침내 지난 1년 동안 저는 필요한 기능을 구축하기로 결정했습니다. 그 결과, 다양하고 멋진 새 이메일 기능을 제공하는 직접 호스팅할 수 있는 작은 웹 앱인 Simplify Email(SE)이 탄생했습니다. 이 모든 기능은 프로젝트 웹사이트에서 확인할 수 있습니다.
SE의 멋진 점은 이메일 읽기, 분석, 라우팅 및 관리를 위한 플랫폼이라는 점입니다. 가능성은 무궁무진합니다. 단순화된 이메일은 본질적으로 자신의 이메일을 "해킹"하기 위한 프로그래밍 가능한 놀이터입니다.
PHP, IMAP 및 MySQL을 사용하여 SE에서 이메일 처리의 세 가지 예에 대한 코드를 안내하겠습니다.
이 튜토리얼은 PHP로 IMAP 코드를 작성하는 데 도움이 될 것입니다. 그러나 이메일 단순화 코드 베이스를 직접 사용할 수도 있습니다. 코드는 10달러에 구입할 수 있으며, 이전 오픈 소스 버전도 있습니다(아래에서 설명하는 기능 중 일부가 부족함). 일반적인 Linux 구성에 대한 설치 지침이 제공됩니다. 또한 Digital Ocean에서 사전 설치된 이미지를 25달러에 제공하고 휴대용 주차 대행 설치도 제공합니다. SE는 Yii 프레임워크 내에서 PHP로 작성되었습니다.
PHP용 보안 IMAP 라이브러리를 컴파일하지 않으면 로컬 개발 시스템에서 대부분의 이메일 서버에 액세스할 수 없습니다. 이것이 제가 사람들에게 Digital Ocean의 물방울처럼 Simplify Email을 실행하도록 권장하는 이유 중 하나입니다. IMAP을 통해 로그인할 때 Google 계정을 안전하게 유지하기 위한 몇 가지 팁도 있습니다.
SE를 사용하면 웹 및 모바일 장치에서 선택한 이메일 클라이언트를 계속 사용할 수 있습니다. 응용 프로그램이나 개인 습관을 변경할 필요가 없습니다. SE는 지능형 개인 비서로서 IMAP을 통해 뒤에서 귀하의 이메일 계정에 액세스하며, SE는 귀하가 말하는 모든 내용을 기반으로 메시지를 적절한 위치로 이동하면서 이메일을 사전 처리합니다.
친숙한 발신자로부터 메시지가 도착하면 SE는 해당 메시지를 사용자가 지정한 폴더로 이동합니다. 보낸 사람을 알 수 없는 사람이 처음으로 메시지를 받으면 해당 메시지는 검토 폴더로 이동됩니다.
몇 시간마다(또는 원하는 만큼 자주) SE는 메시지를 이동한 위치와 검토 중인 메시지에 대한 요약을 보내드립니다. 감사 폴더에는 교육 전송자에 대한 링크가 포함되어 있어 시간이 지남에 따라 SE를 매우 쉽게 교육할 수 있습니다.
언제든지 리뷰 폴더를 탐색할 수 있습니다. 요약이 도착할 때까지 기다릴 필요가 없습니다. 그러나 SE의 장점은 더 이상 폴더를 탐색할 필요가 없고 요약만 읽어서 받은 이메일을 보고 새로운 발신자를 교육할 수 있다는 것입니다.
SE는 여러 cron 작업을 사용하여 서버 백그라운드에서 실행됩니다. 각각은 DaemonController.php
에서 호출됩니다.
첫 번째 processInbox
는 자주 호출되므로 빠르게 완료해야 합니다. 이메일을 선별하여 받은 편지함에서 필터 폴더라고 하는 분류된 폴더로 가능한 한 빨리 가져오는 것이 이 작업의 역할입니다.
두 번째 processFiltering
는 처리 집약적이며 이메일에 대해 더 심층적인 작업을 수행하여 궁극적으로 메시지를 최종 대상으로 이동합니다.
Cron 작업은 정기적으로 호출됩니다. processInbox
:
각 계정에 대해 이메일 자격 증명을 해독한 다음 imap_open을 사용하여 받은 편지함 폴더에 대한 IMAP 스트림을 생성합니다.
으아아아In processInbox
우리는 메시지 배열을 검색하기 위해 PHP 라이브러리 함수 imap_search 및 imap_fetch_overview를 사용합니다:
그런 다음 받은 편지함의 메시지 배열을 처리합니다.
으아아아이는 SE가 다양한 작업을 완료하는 데 필요한 추가 정보를 수집하는 공개적으로 사용 가능한 IMAP 헤더 구문 분석 코드를 수정한 버전입니다. 기본적으로 imap_rfc822_parse_adrlist를 사용하여 수신자 정보, 메시지 ID, 제목 및 타임스탬프(또는 보낸 편지함을 스캔할 때 보낸 사람 정보)를 확인합니다.
으아아아발신자 및 메일 봉투에 대한 데이터베이스에 기록을 생성합니다.
으아아아발신자가 우리에게 새로운(알 수 없는) 경우, 화이트리스트 이의제기 이메일을 보내드립니다(아래 다음 섹션에서 화이트리스트 이의제기에 대해 자세히 논의합니다):
으아아아다음으로, 사용자가 다른 폴더의 메시지를 받은편지함으로 다시 드래그했는지 여부를 확인하여 드래그 앤 드롭 방법을 교육합니다. 그렇다면 이 발신자에 대한 교육을 받은 편지함에 설정하겠습니다. 즉, 다음 번에는 이 보낸 사람의 메일만 받은 편지함으로 라우팅하려고 합니다.
으아아아그렇지 않은 경우 추가 처리를 위해 메시지를 필터 폴더로 이동하도록 준비하겠습니다. 먼저, 알림 보낸 사람이 일치하거나 키워드가 일치하는 경우(조용한 시간이 아닌 경우) 사용자의 휴대폰으로 알림을 보낼 수 있습니다.
으아아아메시지를 받은편지함으로 드래그하면 교육 설정이 업데이트됩니다.
으아아아2차 가공방법을 processFiltering
,也在DaemonController.php
中이라고 합니다. 메시지를 적절한 폴더로 이동하는 데 더 많은 시간이 소요되는 작업을 수행합니다.
이 방법을 사용하면 이메일 계정을 열어 최근 메시지를 검색하고 이에 대한 데이터를 수집할 수 있습니다. 또한 imap_search
、imap_fetch_overview
和 parseHeader
:
필터 폴더의 각 메시지에 대한 주요 처리 루프는 매우 상세합니다. SE를 사용하면 수신자 주소별로 폴더를 학습할 수 있으므로 먼저 수신자 주소를 살펴봅니다. 예를 들어 happyvegetarian.com 도메인으로 전송된 메시지는 veggie 폴더로 이동합니다.
으아아아그런 다음 보낸 사람을 조회하고 (필요한 경우) 데이터베이스에 새 기록을 생성합니다. 보낸 사람에 대한 교육이 있는 경우 대상 폴더를 설정할 수 있습니다.
으아아아교육받지 않은(신규) 발신자가 화이트리스트 질문(아래 다음 섹션에서 논의)을 통해 자신을 인증한 경우 이 메시지를 받은 편지함으로 라우팅합니다.
으아아아그런 다음 이 메시지에 대한 봉투 정보가 포함된 메시지 항목을 데이터베이스에 생성합니다.
으아아아알 수 없거나 확인되지 않은 보낸 사람이 보낸 메시지인 경우 메시지를 검토 폴더로 이동할 수 있습니다. 검토 폴더에는 우리가 인식할 수 없는 보낸 사람이 보낸 모든 메시지가 포함되어 있습니다.
알고 있는 발신자가 보낸 메시지이고 목적지가 식별된 경우 조용한 시간이 아닌 한(방해 금지 기능이 꺼져 있는 경우) 메시지를 이동할 수 있습니다.
으아아아침착한 시간에는 메시지가 주로 필터링된 폴더에 저장됩니다.
몇 시간마다 다른 프로세스가 메시지 테이블 기록을 사용하여 메시지 다이제스트를 작성하여 최근에 수신하고 필터링한 이메일과 라우팅 방법을 결정합니다.
화이트리스트 챌린지의 목표는 마케팅 봇이나 스패머 등 알 수 없는 발신자가 보낸 메시지를 받은편지함에 보관하는 것입니다. SE는 알 수 없는 발신자가 보낸 메시지를 검토 폴더에 넣습니다. 그러나 화이트리스트를 활성화하면 발신자가 사람인지 확인할 수 있는 기회를 제공하기 위해 인증 이메일을 보내드립니다. 상대방이 답장하면 해당 메시지가 받은 편지함으로 이동됩니다. 이메일이 원치 않는 것으로 판명되면 다이제스트에서 메시지를 삭제하거나 훈련하려는 폴더로 드래그할 수 있습니다.
사용자는 설정에서 화이트리스트를 켜거나 끌 수 있습니다:
화이트리스트를 구현하기 위해 새로운 발신자가 메시지를 받을 때마다 이메일 확인 메시지를 보냅니다.
으아아아ChallengeSender
사용자가 클릭할 수 있도록 인코딩된 링크를 보냅니다. 또한 부재중 메시지로 인해 이메일 루프에 빠지지 않도록 몇 가지 보호 장치도 마련했습니다.
그런 다음 수신자가 인코딩된 링크를 클릭하면 데이터베이스에서 이를 확인합니다. 발신자 컨트롤러는 이러한 요청을 처리하고 유효성을 확인합니다.
으아아아이것은 이 메시지와 이 보낸 사람의 향후 메시지를 받은 편지함으로 이동하도록 처리 루프에 지시합니다.
有时,查看您已发送但未收到回复的消息摘要会有所帮助。为了识别这些邮件,Simplify Email 会监视已发送但尚未收到回复的邮件。
我们收到的每条消息都包含一个唯一的 ID,称为 message_id(IMAP 规范的一部分)。它通常看起来像这样:
Message-Id: <CALe0OAaF3fb3d=gCq2Fs=Ex61Qp6FdbiA4Mvs6kTQ@mail.gmail.com>
此外,当发送消息以回复其他消息时,它们有一个 in_reply_to
字段,该字段链接回原始 message_id
。
因此,我们使用 SQL 查询来查找所有收到的消息,这些消息没有引用其 message_id
的相应回复消息。为此,我们在没有 in_reply_to
id 的情况下使用 LEFT OUTER JOIN:
public function getUnanswered($account_id,$mode=0, $range_days = 7) { if ($mode==0) $subject_compare = 'not'; else $subject_compare = ''; $query = Yii::app()->db->createCommand("SELECT fi_sent_message.id, fi_sent_message.recipient_id as sender_id,fi_sent_message.subject,fi_sent_message.udate,fi_message.in_reply_to,fi_sent_message.message_id FROM fi_sent_message LEFT OUTER JOIN fi_message ON fi_message.in_reply_to = fi_sent_message.message_id WHERE fi_sent_message.account_id = ".$account_id." AND fi_message.in_reply_to is null and fi_sent_message.udate > ".(time()-(3600*24*$range_days))." and fi_sent_message.subject ".$subject_compare." like 'Re: %' ORDER BY fi_sent_message.udate DESC")->queryAll(); return $query; }
我们使用 $subject_compare
模式来区分我们发送的尚未回复的消息和我们发送给尚未回复的线程的回复。以下是您帐户中的未回复消息报告:
SE 还将此信息作为可选摘要提供,称为未回复电子邮件摘要。您可以每天、每隔几天或每周收到它。
我们还使用类似的 SQL 表格和 Google Charts 来提供有关某些人向您发送电子邮件的频率的报告:
public function reportInbound($account_id,$range=30,$limit = 100) { $result= Yii::app()->db->createCommand('SELECT fi_sender.personal, fi_sender.email,count(sender_id) as cnt FROM fi_message LEFT JOIN fi_sender ON fi_sender.id =fi_message.sender_id WHERE fi_sender.account_id = :account_id AND fi_message.created_at > DATE_SUB( NOW() , INTERVAL :range DAY ) GROUP BY sender_id ORDER BY cnt desc LIMIT :limit ')->bindValue('range',$range)->bindValue('account_id',$account_id)->bindValue('limit',$limit)->queryAll(); return $result; }
我很快就会撰写更多有关 Tuts+ 的 Google Charts 的文章。
我希望您已经发现 Simplify Email 足够有趣,可以尝试 PHP IMAP 编程。您可以构建许多很酷的功能,而不需要大型电子邮件提供商做任何新的事情。
如果您有任何疑问或更正,请在评论中提出。如果您想继续关注我未来的 Tuts+ 教程和其他系列,请关注 @reifman 或访问我的作者页面。您也可以在这里联系我。
以下是一些您可能会觉得有用的附加链接:
위 내용은 IMAP 및 PHP로 고급 이메일 기능 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!