강력한 객체 지향 아키텍처로 구축된 IMAP 프로토콜을 통해 이메일을 읽고 처리하는 PHP IMAP 라이브러리입니다.
이 라이브러리에는 IMAP, iconv 및 멀티바이트 문자열 확장이 설치된 PHP >= 8.3이 필요합니다.
IMAP 라이브러리를 설치하는 권장 방법은 Composer를 사용하는 것입니다.
$ 작곡가에게는 ddeboer/imap이 필요합니다.
이 명령을 사용하려면 Composer 설명서의 설치 장에 설명된 대로 Composer를 전역적으로 설치해야 합니다.
DdeboerImapServer 사용;$server = new Server('imap.gmail.com');// $connection은 DdeboerImapConnection$connection = $server->authenticate('my_username', 'my_password')의 인스턴스입니다.
서버에 포트, 플래그 및 매개변수를 지정할 수 있습니다.
$server = new Server($hostname, // 필수$port, // 기본값은 '993'$flags, // 기본값은 '/imap/ssl/validate-cert'$parameters);
메일 서버에서 사서함(메일 폴더라고도 함)을 검색하고 반복합니다.
$mailboxes = $connection->getMailboxes();foreach ($mailboxes as $mailbox) {// 컨테이너 전용 메일함 건너뛰기// @see https://secure.php.net/manual/en/function.imap-getmailboxes .phpif ($mailbox->getAttributes() & LATT_NOSELECT) {계속; }// $mailbox는 DdeboerImapMailboxprintf('Mailbox "%s" has %s message', $mailbox->getName(), $mailbox->count());의 인스턴스입니다. }
또는 특정 사서함을 검색합니다.
$mailbox = $connection->getMailbox('INBOX');
사서함 삭제:
$connection->deleteMailbox($mailbox);
사서함 메시지의 플래그를 UID별로 대량 설정하거나 지울 수 있습니다.
$mailbox->setFlag('Seen Flagged', ['1:5', '7', '9']);$mailbox->setFlag('Seen', '1,3,5,6: 8');$mailbox->clearFlag('Flagged', '1,3');
경고 단일 메시지 플래그를 새로 고치려면 플래그를 대량 수정하는 경우 새 메시지 인스턴스를 검색해야 합니다.
사서함에서 메시지(이메일)를 검색하고 반복합니다.
$messages = $mailbox->getMessages();foreach ($messages as $message) {// $message는 DdeboerImapMessage의 인스턴스입니다.}
방금 보낸 새 메시지를 보낸 편지함에 삽입하고 표시되는 대로 플래그를 지정하려면 다음을 수행하세요.
$mailbox = $connection->getMailbox('보냈음');$mailbox->addMessage($messageMIME, 'Seen');
메시지는 MIME 형식의 문자열이어야 합니다(RFC2045에 설명된 대로).
DdeboerImapSearchExpression 사용; DdeboerImapSearchEmailTo 사용; DdeboerImapSearchTextBody 사용;$search = new SearchExpression();$search->addCondition(new To('[email protected]'));$search->addCondition(new Body('contents')) ;$messages = $mailbox->getMessages($search);
경고 현재는 공백 과 큰따옴표를 함께 이스케이프 처리할 수 없습니다. 현재는 공백만 올바르게 이스케이프됩니다. DdeboerImapSearchRawExpression
사용하여 전체 검색 조건을 직접 작성할 수 있습니다.
imap_sort 함수에 따라 메시지를 정렬하여 검색할 수도 있습니다.
$today = new DateTimeImmutable();$thirtyDaysAgo = $today->sub(new DateInterval('P30D'));$messages = $mailbox->getMessages(new DdeboerImapSearchDateSince($thirtyDaysAgo),SORTDATE, // 정렬 기준true // 내림차순);
PHP imap 라이브러리는 OR
과 같은 일부 IMAP4 검색 기준을 완전히 지원하지 않는 https://www.washington.edu/imap/에서 사용할 수 있는 c-client
라이브러리에 의존합니다. 지원되지 않는 기준을 원하는 경우 최신 버전(이 커밋 당시 2011년 7월 23일의 imap-2007f
)을 수동으로 패치하고 패치된 c-client
라이브러리에 PHP를 다시 컴파일해야 합니다.
그런데 대부분의 일반적인 검색 기준이 사용 가능하고 작동하고 있으므로 ./src/Search
에서 찾아보세요.
참고자료:
https://stackoverflow.com/questions/36356715/imap-search-unknown-search-criterion-or
imap-2007f.tar.gz: ./src/c-client/mail.c
및 ./docs/internal.txt
<...> 형식으로 메시지 번호와 고유 메시지 ID를 가져옵니다.
$message->getNumber();$message->getId();
다른 메시지 속성을 가져옵니다.
$message->getSubject();$message->getFrom(); // 메시지EmailAddress$message->getTo(); // MessageEmailAddress$message->getDate() 배열; // DateTimeImmutable$message->isAnswered();$message->isDeleted();$message->isDraft();$message->isSeen();
메시지 헤더를 DdeboerImapMessageHeaders 개체로 가져옵니다.
$메시지->getHeaders();
메시지 본문을 HTML 또는 일반 텍스트로 가져오기(첫 번째 부분만):
$message->getBodyHtml(); // text/html 부분의 내용(있는 경우)$message->getBodyText(); // 텍스트/일반 부분의 내용(있는 경우)
전체 본문(모든 부분) 가져오기:
$body = $message->getCompleteBodyHtml(); // text/html 부분의 내용(ifpresentif) ($body === null) { // body가 null이면 HTML 부분이 없으므로 텍스트를 가져와 보겠습니다. body$body = $message->getCompleteBodyText() ; // 텍스트/일반 부분의 내용(있는 경우)}
메시지 본문을 읽으면 메시지가 보이지 않는 상태로 유지됩니다. 메시지를 본 것으로 표시하려면 다음을 수행하세요.
$메시지->markAsSeen();
또는 플래그를 설정하거나 지울 수 있습니다.
$message->setFlag('Seen Flagged');$message->clearFlag('Flagged');
메시지를 다른 편지함으로 이동하려면 다음 단계를 따르세요.
$mailbox = $connection->getMailbox('another-mailbox');$message->move($mailbox);
메시지 삭제:
$mailbox->getMessage(1)->delete();$mailbox->getMessage(2)->delete();$connection->expunge();
메시지 첨부 파일(인라인 및 첨부 파일 모두)을 가져와서 반복합니다.
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {// $attachment는 DdeboerImapMessageAttachment의 인스턴스입니다.}
메시지 첨부 파일을 로컬 파일로 다운로드합니다.
// getDecodedContent()는 첨부 파일의 내용을 자동으로 디코딩합니다:file_put_contents('/my/local/dir/' . $attachment->getFilename(),$attachment->getDecodedContent() );
첨부 파일이 메시지에 포함되어 있는지 확인하고 가져옵니다.
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {if ($attachment->isEmbeddedMessage()) {$embeddedMessage = $attachment->getEmbeddedMessage();// $embeddedMessage는 DdeboerImapMessageEmbeddedMessage의 인스턴스입니다. } }
EmbeddedMessage에는 복사, 이동 또는 삭제와 같은 플래그 및 작업을 제외하고 일반 메시지와 동일한 API가 있습니다.
IMAP 확장은 다양한 작업에 대한 시간 초과 시간(초)을 조정하기 위해 imap_timeout 함수를 제공합니다.
그러나 확장의 구현은 기능을 특정 컨텍스트나 연결에 연결하지 않고 대신 전역적입니다. 따라서 이 라이브러리 외부의 기능에 영향을 주지 않기 위해 우리는 모든 imap_*
호출을 사용자가 제공한 시간 초과 옵션으로 래핑할지 아니면 이 작업을 사용자에게 맡길지 선택해야 했습니다.
IMAP 서버의 이기종 세계와 전자의 약간의 이득에 대한 높은 복잡성 부담 비용 때문에 우리는 후자를 선택했습니다.
모의 가능성은 각 API에 존재하는 인터페이스에 의해 부여됩니다. 모의 작업 흐름의 예를 보려면 MockabilityTest를 살펴보세요.
컴퓨터에서 빌드를 실행하려면 Docker가 필요합니다.
실행해야 할 첫 번째 명령은 IMAP 서버를 로컬로 시작하는 make start-imap-server
입니다.
그런 다음 베어 make
사용하여 로컬 빌드를 트리거할 수 있습니다.
개발이 완료되면 make stop-imap-server
사용하여 로컬 IMAP 서버를 중지합니다.