Python
1 2import sys 3import email 4from email.header import decode_header 5import datetime 6import glob 7import os 8import openpyxl 9 10class MailParser(object): 11 """ 12 メールファイルのパスを受け取り、それを解析するクラス 13 """ 14 15 def __init__(self, mail_file_path): 16 self.mail_file_path = mail_file_path 17 # emlファイルからemail.message.Messageインスタンスの取得 18 with open(mail_file_path, 'rb') as email_file: 19 self.email_message = email.message_from_bytes(email_file.read()) 20 self.subject = None 21 self.to_address = None 22 self.cc_address = None 23 self.from_address = None 24 self.body = "" 25 self.date = None 26 # 添付ファイル関連の情報 27 # {name: file_name, data: data} 28 self.attach_file_list = [] 29 # emlの解釈 30 self._parse() 31 32 def get_attr_data(self): 33 """ 34 メールデータの取得 35 """ 36 result = """\ 37DATE: {} 38FROM: {} 39TO: {} 40CC: {} 41----------------------- 42BODY: 43{} 44----------------------- 45ATTACH_FILE_NAME: 46{} 47""".format( 48 self.date, 49 self.from_address, 50 self.to_address, 51 self.cc_address, 52 self.body, 53 ",".join([ x["name"] for x in self.attach_file_list]) 54 ) 55 return result 56 57 58 def _parse(self): 59 """ 60 メールファイルの解析 61 __init__内で呼び出している 62 """ 63 self.subject = self._get_decoded_header("Subject") 64 self.to_address = self._get_decoded_header("To") 65 self.cc_address = self._get_decoded_header("Cc") 66 self.from_address = self._get_decoded_header("From") 67 # 変更したところ 68 self.date = datetime.datetime.strptime( 69 self._get_decoded_header("Date"), 70 "%a, %d %b %Y %H:%M:%S %z" 71 ) 72 73 # メッセージ本文部分の処理 74 for part in self.email_message.walk(): 75 # ContentTypeがmultipartの場合は実際のコンテンツはさらに 76 # 中のpartにあるので読み飛ばす 77 if part.get_content_maintype() == 'multipart': 78 continue 79 # ファイル名の取得 80 attach_fname = part.get_filename() 81 # ファイル名がない場合は本文のはず 82 if not attach_fname: 83 charset = str(part.get_content_charset()) 84 if charset: 85 self.body += part.get_payload(decode=True).decode(charset, errors="replace") 86 else: 87 self.body += part.get_payload(decode=True) 88 else: 89 # ファイル名があるならそれは添付ファイルなので 90 # データを取得する 91 self.attach_file_list.append({ 92 "name": attach_fname, 93 "data": part.get_payload(decode=True) 94 }) 95 96 def _get_decoded_header(self, key_name): 97 """ 98 ヘッダーオブジェクトからデコード済の結果を取得する 99 """ 100 ret = "" 101 102 # 該当項目がないkeyは空文字を戻す 103 raw_obj = self.email_message.get(key_name) 104 if raw_obj is None: 105 return "" 106 # デコードした結果をunicodeにする 107 for fragment, encoding in decode_header(raw_obj): 108 if not hasattr(fragment, "decode"): 109 ret += fragment 110 continue 111 # encodeがなければとりあえずUTF-8でデコードする 112 if encoding: 113 ret += fragment.decode(encoding) 114 else: 115 ret += fragment.decode("UTF-8") 116 return ret 117 118if __name__ == "__main__": 119 tifCounter = len(glob.glob1("./mail","*.eml")) 120 print(tifCounter) 121 for mail_file_path in glob.glob('./mail/*'): 122 # ブックを取得 123 book = openpyxl.load_workbook(r'C:\Users\Desktop') 124 # シートを取得 125 sheet = book['Sheet1'] 126 # セルへ書き込む 127 sheet['A1'] = 'ナンバー' 128 sheet['B1'] = 100 129 # 保存する 130 book.save(r'C:\Users\) 131 132 result = MailParser(mail_file_path).get_attr_data() 133 134 print(result) 135
https://qiita.com/pandachan5228/items/186690c4662ed1d8b823
を参考に複数のemlファイルを読み込みができ、最後にExcelに
日付 差出人名 差出人メールアドレス 内容
の4項目に分けてExcelに書き出すコードを教えてください!
https://teratail.com/questions/09h52spph2wsst
↑↑ここの回答者さんが説明を書いてくれてます〜。
print結果
総メール件数 1 件
日時: 2022-06-21 17:46:21+09:00
FROM: たこ焼きくん aaaaa@aaaa.aaa
TO: cccc@ccccc.cccc
CC:
本文:
はまやらわ
ATTACH_FILE_NAME:
↓完成!!!!🌟
Python
1 2import sys 3import email 4from email.header import decode_header 5import datetime 6import glob 7import openpyxl 8 9class MailParser(object): 10 """ 11 メールファイルのパスを受け取り、それを解析するクラス 12 """ 13 14 def __init__(self, mail_file_path): 15 self.mail_file_path = mail_file_path 16 # emlファイルからemail.message.Messageインスタンスの取得 17 with open(mail_file_path, 'rb') as email_file: 18 self.email_message = email.message_from_bytes(email_file.read()) 19 self.subject = None 20 self.to_address = None 21 self.cc_address = None 22 self.from_address = None 23 self.body = "" 24 self.date = None 25 # 添付ファイル関連の情報 26 # {name: file_name, data: data} 27 self.attach_file_list = [] 28 # emlの解釈 29 self._parse() 30 31 def get_attr_data(self): 32 """ 33 メールデータの取得 34 """ 35 result = """\ 36日時: {} 37FROM: {} 38TO: {} 39CC: {} 40----------------------- 41本文: 42{} 43----------------------- 44ATTACH_FILE_NAME: 45{} 46""".format( 47 self.date, 48 self.from_address, 49 self.to_address, 50 self.cc_address, 51 self.body, 52 ",".join([ x["name"] for x in self.attach_file_list]) 53 ) 54 return result 55 56 57 def _parse(self): 58 """ 59 メールファイルの解析 60 __init__内で呼び出している 61 """ 62 self.subject = self._get_decoded_header("Subject") 63 self.to_address = self._get_decoded_header("To") 64 self.cc_address = self._get_decoded_header("Cc") 65 self.from_address = self._get_decoded_header("From") 66 # 変更したところ 67 self.date = datetime.datetime.strptime( 68 self._get_decoded_header("Date"), 69 "%a, %d %b %Y %H:%M:%S %z" 70 ) 71 72 # メッセージ本文部分の処理 73 for part in self.email_message.walk(): 74 # ContentTypeがmultipartの場合は実際のコンテンツはさらに 75 # 中のpartにあるので読み飛ばす 76 if part.get_content_maintype() == 'multipart': 77 continue 78 # ファイル名の取得 79 attach_fname = part.get_filename() 80 # ファイル名がない場合は本文のはず 81 if not attach_fname: 82 charset = str(part.get_content_charset()) 83 if charset: 84 self.body += part.get_payload(decode=True).decode(charset, errors="replace") 85 else: 86 self.body += part.get_payload(decode=True) 87 else: 88 # ファイル名があるならそれは添付ファイルなので 89 # データを取得する 90 self.attach_file_list.append({ 91 "name": attach_fname, 92 "data": part.get_payload(decode=True) 93 }) 94 95 def _get_decoded_header(self, key_name): 96 """ 97 ヘッダーオブジェクトからデコード済の結果を取得する 98 """ 99 ret = "" 100 101 # 該当項目がないkeyは空文字を戻す 102 raw_obj = self.email_message.get(key_name) 103 if raw_obj is None: 104 return "" 105 # デコードした結果をunicodeにする 106 for fragment, encoding in decode_header(raw_obj): 107 if not hasattr(fragment, "decode"): 108 ret += fragment 109 continue 110 # encodeがなければとりあえずUTF-8でデコードする 111 if encoding: 112 ret += fragment.decode(encoding) 113 else: 114 ret += fragment.decode("UTF-8") 115 return ret 116 117if __name__ == "__main__": 118 # ブックを取得 119 book = openpyxl.load_workbook(r'C:\Users\ああああ\Desktop\あああ\あああああ.xlsx') 120 # シートを取得 121 sheet = book['Sheet1'] 122 123 tifCounter = len(glob.glob1("./mail","*.eml")) 124 print("🙌総メール件数",tifCounter,"件🙌") 125 126 i=2 127 for mail_file_path in glob.glob('./mail/*'): 128 try: 129 result = MailParser(mail_file_path) 130 # セルへ書き込む 131 sheet.cell(row=i, column=1).value = i-1 132 sheet.cell(row=i, column=2).value = result.date.replace(tzinfo=None) 133 sheet.cell(row=i, column=4).value = result.from_address.split("<")[0] 134 sheet.cell(row=i, column=5).value = result.from_address[:-1].split("<")[1] 135 sheet.cell(row=i, column=6).value = result.body 136 137 print(i-1,"件目💕書き込んだよ😘") 138 print(mail_file_path) 139 print() 140 except ValueError: 141 print(i-1,"件目エラーだよ😒") 142 print(mail_file_path) 143 print("👿👿👿👿👿👿👿👿👿👿👿👿👿👿") 144 print() 145 146 i+=1 147 148 # 保存する 149 book.save(r'C:\Users\ああああ\Desktop\あああ\あああああ.xlsx') 150 print("終わったよ😍") 151
print(result) で出てきた結果を 1つか2つ、メアドなど差し障りのある内容は伏せ字にして質問に追加してください。

回答1件
あなたの回答
tips
プレビュー