質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

解決済

読み込んだemlファイルの情報をExcelに書き出す方法

UserName
UserName

総合スコア3

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

1回答

0評価

1クリップ

378閲覧

投稿2022/06/21 08:23

編集2022/06/22 06:13

Python

import sys import email from email.header import decode_header import datetime import glob import os import openpyxl class MailParser(object): """ メールファイルのパスを受け取り、それを解析するクラス """ def __init__(self, mail_file_path): self.mail_file_path = mail_file_path # emlファイルからemail.message.Messageインスタンスの取得 with open(mail_file_path, 'rb') as email_file: self.email_message = email.message_from_bytes(email_file.read()) self.subject = None self.to_address = None self.cc_address = None self.from_address = None self.body = "" self.date = None # 添付ファイル関連の情報 # {name: file_name, data: data} self.attach_file_list = [] # emlの解釈 self._parse() def get_attr_data(self): """ メールデータの取得 """ result = """\ DATE: {} FROM: {} TO: {} CC: {} ----------------------- BODY: {} ----------------------- ATTACH_FILE_NAME: {} """.format( self.date, self.from_address, self.to_address, self.cc_address, self.body, ",".join([ x["name"] for x in self.attach_file_list]) ) return result def _parse(self): """ メールファイルの解析 __init__内で呼び出している """ self.subject = self._get_decoded_header("Subject") self.to_address = self._get_decoded_header("To") self.cc_address = self._get_decoded_header("Cc") self.from_address = self._get_decoded_header("From") # 変更したところ self.date = datetime.datetime.strptime( self._get_decoded_header("Date"), "%a, %d %b %Y %H:%M:%S %z" ) # メッセージ本文部分の処理 for part in self.email_message.walk(): # ContentTypeがmultipartの場合は実際のコンテンツはさらに # 中のpartにあるので読み飛ばす if part.get_content_maintype() == 'multipart': continue # ファイル名の取得 attach_fname = part.get_filename() # ファイル名がない場合は本文のはず if not attach_fname: charset = str(part.get_content_charset()) if charset: self.body += part.get_payload(decode=True).decode(charset, errors="replace") else: self.body += part.get_payload(decode=True) else: # ファイル名があるならそれは添付ファイルなので # データを取得する self.attach_file_list.append({ "name": attach_fname, "data": part.get_payload(decode=True) }) def _get_decoded_header(self, key_name): """ ヘッダーオブジェクトからデコード済の結果を取得する """ ret = "" # 該当項目がないkeyは空文字を戻す raw_obj = self.email_message.get(key_name) if raw_obj is None: return "" # デコードした結果をunicodeにする for fragment, encoding in decode_header(raw_obj): if not hasattr(fragment, "decode"): ret += fragment continue # encodeがなければとりあえずUTF-8でデコードする if encoding: ret += fragment.decode(encoding) else: ret += fragment.decode("UTF-8") return ret if __name__ == "__main__": tifCounter = len(glob.glob1("./mail","*.eml")) print(tifCounter) for mail_file_path in glob.glob('./mail/*'): # ブックを取得 book = openpyxl.load_workbook(r'C:\Users\Desktop') # シートを取得 sheet = book['Sheet1'] # セルへ書き込む sheet['A1'] = 'ナンバー' sheet['B1'] = 100 # 保存する book.save(r'C:\Users\) result = MailParser(mail_file_path).get_attr_data() print(result)

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

import sys import email from email.header import decode_header import datetime import glob import openpyxl class MailParser(object): """ メールファイルのパスを受け取り、それを解析するクラス """ def __init__(self, mail_file_path): self.mail_file_path = mail_file_path # emlファイルからemail.message.Messageインスタンスの取得 with open(mail_file_path, 'rb') as email_file: self.email_message = email.message_from_bytes(email_file.read()) self.subject = None self.to_address = None self.cc_address = None self.from_address = None self.body = "" self.date = None # 添付ファイル関連の情報 # {name: file_name, data: data} self.attach_file_list = [] # emlの解釈 self._parse() def get_attr_data(self): """ メールデータの取得 """ result = """\ 日時: {} FROM: {} TO: {} CC: {} ----------------------- 本文: {} ----------------------- ATTACH_FILE_NAME: {} """.format( self.date, self.from_address, self.to_address, self.cc_address, self.body, ",".join([ x["name"] for x in self.attach_file_list]) ) return result def _parse(self): """ メールファイルの解析 __init__内で呼び出している """ self.subject = self._get_decoded_header("Subject") self.to_address = self._get_decoded_header("To") self.cc_address = self._get_decoded_header("Cc") self.from_address = self._get_decoded_header("From") # 変更したところ self.date = datetime.datetime.strptime( self._get_decoded_header("Date"), "%a, %d %b %Y %H:%M:%S %z" ) # メッセージ本文部分の処理 for part in self.email_message.walk(): # ContentTypeがmultipartの場合は実際のコンテンツはさらに # 中のpartにあるので読み飛ばす if part.get_content_maintype() == 'multipart': continue # ファイル名の取得 attach_fname = part.get_filename() # ファイル名がない場合は本文のはず if not attach_fname: charset = str(part.get_content_charset()) if charset: self.body += part.get_payload(decode=True).decode(charset, errors="replace") else: self.body += part.get_payload(decode=True) else: # ファイル名があるならそれは添付ファイルなので # データを取得する self.attach_file_list.append({ "name": attach_fname, "data": part.get_payload(decode=True) }) def _get_decoded_header(self, key_name): """ ヘッダーオブジェクトからデコード済の結果を取得する """ ret = "" # 該当項目がないkeyは空文字を戻す raw_obj = self.email_message.get(key_name) if raw_obj is None: return "" # デコードした結果をunicodeにする for fragment, encoding in decode_header(raw_obj): if not hasattr(fragment, "decode"): ret += fragment continue # encodeがなければとりあえずUTF-8でデコードする if encoding: ret += fragment.decode(encoding) else: ret += fragment.decode("UTF-8") return ret if __name__ == "__main__": # ブックを取得 book = openpyxl.load_workbook(r'C:\Users\ああああ\Desktop\あああ\あああああ.xlsx') # シートを取得 sheet = book['Sheet1'] tifCounter = len(glob.glob1("./mail","*.eml")) print("🙌総メール件数",tifCounter,"件🙌") i=2 for mail_file_path in glob.glob('./mail/*'): try: result = MailParser(mail_file_path) # セルへ書き込む sheet.cell(row=i, column=1).value = i-1 sheet.cell(row=i, column=2).value = result.date.replace(tzinfo=None) sheet.cell(row=i, column=4).value = result.from_address.split("<")[0] sheet.cell(row=i, column=5).value = result.from_address[:-1].split("<")[1] sheet.cell(row=i, column=6).value = result.body print(i-1,"件目💕書き込んだよ😘") print(mail_file_path) print() except ValueError: print(i-1,"件目エラーだよ😒") print(mail_file_path) print("👿👿👿👿👿👿👿👿👿👿👿👿👿👿") print() i+=1 # 保存する book.save(r'C:\Users\ああああ\Desktop\あああ\あああああ.xlsx') print("終わったよ😍")

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

TakaiY

2022/06/21 08:37

print(result) で出てきた結果を 1つか2つ、メアドなど差し障りのある内容は伏せ字にして質問に追加してください。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。