実現したいこと
- PHPでImapを使ってメールを取得
前提
メールの受信ボックス(メーラー)を作っています。
ですが、プログラム初心者で、htmlメールを表示できません。
発生している問題・エラーメッセージ
- メールが英語とかに変わってしまう。
元のメッセージ
1【差出人】Name 2【件名】テスト 3【本文】**html**メールです。
htmlここは太字です。
表示されるメッセージ
Message
1Subject: =?UTF-8?B?44OG44K544OI?= From: Name Date: Mon, 27 Mar 2023 19:17:01 +0900 Message ID: HTML Body: PGRpdiBkaXI9Imx0ciI+PGI+aHRtbDwvYj7jg6Hjg7zjg6vjgafjgZnjgII8L2Rpdj4NCg==
該当のソースコード
php
1<?php 2// 文字コードをUTF-8に設定する 3mb_language('ja'); 4mb_internal_encoding('UTF-8'); 5 6// メールサーバーの設定 7$hostname = '{[Server]:993/imap/ssl}INBOX'; 8$username = 'user'; 9$password = 'pw'; 10 11// 接続を確立する 12$inbox = imap_open($hostname, $username, $password) or die('Cannot connect to server: ' . imap_last_error()); 13 14// メールボックスからメールの情報を取得 15$emails = imap_search($inbox, 'ALL'); 16 17if ($emails) { 18 // メールを新しいものから古いものの順に並べる 19 rsort($emails); 20 21 // 各メールについて情報を表示 22 foreach ($emails as $email_number) { 23 // 概要を取得 24 $overview = imap_fetch_overview($inbox, $email_number, 0); 25 echo "Subject: " . mb_convert_encoding($overview[0]->subject, 'UTF-8', 'auto') . "\n"; 26 echo "From: " . mb_convert_encoding($overview[0]->from, 'UTF-8', 'auto') . "\n"; 27 echo "Date: " . $overview[0]->date . "\n"; 28 echo "Message ID: " . $overview[0]->message_id . "\n"; 29 30 // メールの構造を取得 31 $structure = imap_fetchstructure($inbox, $email_number); 32 33 // HTMLパートを探す 34 $html_part_id = find_html_part_id($structure); 35 36 if ($html_part_id) { 37 // HTMLパートを取得 38 $html = imap_fetchbody($inbox, $email_number, $html_part_id); 39 echo "HTML Body: \n" . mb_convert_encoding($html, 'UTF-8', 'auto') . "\n"; 40 } else { 41 echo "No HTML part found.\n"; 42 } 43 44 echo "------------------------------------\n"; 45 } 46} 47 48// 接続を閉じる 49imap_close($inbox); 50 51// メールの構造からHTMLパートを見つける関数 52function find_html_part_id($structure, $part_id = null) { 53 if ($structure->type == 1) { // multipart 54 foreach ($structure->parts as $index => $subpart) { 55 $prefix = $part_id ? $part_id . '.' : ''; 56 $subpart_id = $prefix . ($index + 1); 57 $result = find_html_part_id($subpart, $subpart_id); 58 59 if ($result) { 60 return $result; 61 } 62 } 63 } elseif ($structure->type == 2) { // message/rfc822 64 return find_html_part_id($structure->parts[0], $part_id); 65 } else { 66 if (strtolower($structure-> 67subtype) == 'html') { 68return $part_id ?: '1'; 69} 70} 71return null; 72} 73?>
補足情報(FW/ツールのバージョンなど)
php74
回答1件
あなたの回答
tips
プレビュー