>  기사  >  백엔드 개발  >  IMAP 프로토콜을 사용하여 PHP를 사용하여 사서함 이메일을 수신하는 자세한 프로세스

IMAP 프로토콜을 사용하여 PHP를 사용하여 사서함 이메일을 수신하는 자세한 프로세스

WBOY
WBOY원래의
2023-05-22 08:35:022465검색

이메일이 우리 삶에서 점점 더 중요한 역할을 함에 따라 이메일을 받고 관리하는 방법에 대한 사람들의 요구도 늘어나고 있습니다. 일반적으로 사용되는 프로그래밍 언어인 PHP는 IMAP 프로토콜을 통해 이메일을 수신하고 작동할 수 있습니다. 이 기사에서는 독자가 이 기능을 구현하는 단계를 빠르게 이해할 수 있도록 PHP를 사용하여 IMAP 프로토콜을 사용하여 사서함 이메일을 수신하는 자세한 프로세스를 소개합니다.

1단계: 이메일 서버에 연결

IMAP 프로토콜을 사용하여 이메일을 받기 전에 이메일 서버에 연결할 세션을 만들어야 합니다. 이 단계는 PHP에 내장된 imap_open() 함수를 사용하여 쉽게 수행할 수 있습니다. 일반적으로 이메일 서버에 연결하려면 다음 정보를 제공해야 합니다.

  • 이메일 서버의 호스트 이름
  • IMAP 프로토콜 사용 시 포트 번호(기본값은 993)
  • 이메일의 사용자 이름과 비밀번호 account

예를 들어 다음 코드는 Gmail 메일함 서버 세션 연결을 구현합니다.

$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'your_email@gmail.com';
$password = 'your_password';

$mailbox = imap_open($hostname, $username, $password) 
  or die('Cannot connect to Gmail: ' . imap_last_error());

2단계: 메일함 폴더 선택

연결이 성공한 후 이메일을 받을 메일함 폴더를 선택해야 합니다. IMAP 프로토콜을 사용하면 이메일 서버에 받은 편지함, 보낸 편지함, 휴지통, 임시 보관함 등과 같은 여러 폴더를 만들 수 있습니다. 세션 중에 다른 메일함 폴더 간에 전환하려면 imap_reopen() 함수를 사용하십시오. 예를 들어 다음 코드는 현재 폴더를 받은 편지함으로 전환합니다.

$folder = 'INBOX';
imap_reopen($mailbox, $hostname . $folder) or die('Cannot open folder: ' . $folder);

3단계: 메일링 목록 가져오기

다음으로 현재 메일함 폴더에서 메일링 목록을 가져와야 합니다. imap_search() 함수를 사용하여 읽지 않은 이메일 검색, 읽은 이메일 검색, 특정 주제의 이메일 검색 등과 같은 간단한 이메일 검색을 구현합니다. 다음 코드는 읽지 않은 메일 목록을 가져오는 방법을 보여줍니다.

$unseen_emails = imap_search($mailbox, 'UNSEEN');

모든 메일을 가져오려면 검색 조건을 'ALL'로 설정하면 됩니다.

$emails = imap_search($mailbox, 'ALL');

imap_search() 함수는 메일 식별자의 배열을 반환합니다. 모두 메시지를 나타내며 이 식별자는 후속 작업에 사용될 수 있습니다.

4단계: 이메일 내용 구문 분석

이메일 식별자 배열을 얻은 후 imap_fetchstructure() 함수를 사용하여 이메일 본문의 구조를 얻을 수 있습니다. 텍스트 이메일의 경우 HTML 이메일, 첨부 이메일 등의 경우 간단한 텍스트 부분만 구조에 포함되어 있어 구조가 더 복잡할 수 있습니다. 따라서 이메일 본문의 구조를 분석하고 필요에 따라 보낸 사람, 받는 사람, 제목, 본문 내용, 첨부 파일 등 관련 정보를 추출해야 합니다.

다음 코드는 이메일 내용을 구문 분석하는 방법을 보여줍니다.

foreach ($emails as $email) {
  $structure = imap_fetchstructure($mailbox, $email);

  $from = $this->parseAddress($this->findHeader($structure, 'from'));
  $to = $this->parseAddress($this->findHeader($structure, 'to'));
  $subject = $this->findHeader($structure, 'subject');
  $body = '';

  if ($structure->encoding === 0) {
    // 解析纯文本邮件
    $body = imap_fetchbody($mailbox, $email, 1);
  } else {
    // 解析HTML邮件
    $parts = $this->getParts($structure);

    foreach ($parts as $part) {
      if ($part['subtype'] === 'PLAIN') {
        $body = imap_fetchbody($mailbox, $email, $part['partnum']);
      } else if ($part['subtype'] === 'HTML') {
        $body = imap_fetchbody($mailbox, $email, $part['partnum'], FT_UID | FT_PEEK);
      }
    }
  }

  // 处理邮件内容,例如保存到数据库、发送回执等等
}

function findHeader($structure, $header_name) {
  foreach ($structure->parts as $part) {
    if (isset($part->parameters) && $part->parameters[0]->attribute == $header_name) {
      return $part->parameters[0]->value;
    }
  }

  return '';
}

function getParts($structure) {
  $parts = [];

  if ($structure->parts) {
    foreach ($structure->parts as $index => $substructure) {
      $parts[$index] = [
        'ctype' => $substructure->ctype,
        'encoding' => $substructure->encoding,
        'subtype' => $substructure->subtype,
        'partnum' => ($index + 1)
      ];

      if (isset($substructure->params['name'])) {
        $parts[$index]['filename'] = $substructure->params['name'];
      }
    }
  } else {
    $parts[0] = [
      'ctype' => $structure->ctype,
      'encoding' => $structure->encoding,
      'subtype' => $structure->subtype,
      'partnum' => 1
    ];

    if (isset($structure->params['name'])) {
      $parts[0]['filename'] = $structure->params['name'];
    }
  }

  return $parts;
}

function parseAddress($address) {
  $name = '';
  $email = '';

  foreach (imap_rfc822_parse_adrlist($address, '') as $addr) {
    if (isset($addr->mailbox) && isset($addr->host)) {
      $name = $addr->personal;
      $email = $addr->mailbox . '@' . $addr->host;
    }
  }

  return [
    'name' => $name,
    'email' => $email
  ];
}

5단계: 연결 닫기

작업이 완료된 후 리소스를 해제하고 계정 정보를 보호하기 위해 이메일 서버와의 연결을 닫는 것을 잊지 마세요. 이 단계는 imap_close() 함수를 사용하여 수행할 수 있습니다.

imap_close($mailbox);

요약하자면, 편지함 이메일을 수신하기 위해 IMAP 프로토콜을 사용하는 PHP 프로세스는 다음 5가지 단계로 요약할 수 있습니다: 편지함 서버에 연결, 편지함 폴더 선택, 메일 목록 가져오기, 메일 내용 구문 분석 및 닫기 연결. 독자는 이 코드를 사용하여 자신만의 이메일 수신 시스템을 구축하고 확장할 수 있습니다.

위 내용은 IMAP 프로토콜을 사용하여 PHP를 사용하여 사서함 이메일을 수신하는 자세한 프로세스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.