質問編集履歴

4

かんせーい

2022/06/22 06:13

投稿

UserName
UserName

スコア3

test CHANGED
File without changes
test CHANGED
@@ -162,3 +162,160 @@
162
162
 
163
163
  -----------------------
164
164
  ATTACH_FILE_NAME:
165
+
166
+
167
+
168
+ ↓完成!!!!🌟
169
+ ```Python
170
+
171
+ import sys
172
+ import email
173
+ from email.header import decode_header
174
+ import datetime
175
+ import glob
176
+ import openpyxl
177
+
178
+ class MailParser(object):
179
+ """
180
+ メールファイルのパスを受け取り、それを解析するクラス
181
+ """
182
+
183
+ def __init__(self, mail_file_path):
184
+ self.mail_file_path = mail_file_path
185
+ # emlファイルからemail.message.Messageインスタンスの取得
186
+ with open(mail_file_path, 'rb') as email_file:
187
+ self.email_message = email.message_from_bytes(email_file.read())
188
+ self.subject = None
189
+ self.to_address = None
190
+ self.cc_address = None
191
+ self.from_address = None
192
+ self.body = ""
193
+ self.date = None
194
+ # 添付ファイル関連の情報
195
+ # {name: file_name, data: data}
196
+ self.attach_file_list = []
197
+ # emlの解釈
198
+ self._parse()
199
+
200
+ def get_attr_data(self):
201
+ """
202
+ メールデータの取得
203
+ """
204
+ result = """\
205
+ 日時: {}
206
+ FROM: {}
207
+ TO: {}
208
+ CC: {}
209
+ -----------------------
210
+ 本文:
211
+ {}
212
+ -----------------------
213
+ ATTACH_FILE_NAME:
214
+ {}
215
+ """.format(
216
+ self.date,
217
+ self.from_address,
218
+ self.to_address,
219
+ self.cc_address,
220
+ self.body,
221
+ ",".join([ x["name"] for x in self.attach_file_list])
222
+ )
223
+ return result
224
+
225
+
226
+ def _parse(self):
227
+ """
228
+ メールファイルの解析
229
+ __init__内で呼び出している
230
+ """
231
+ self.subject = self._get_decoded_header("Subject")
232
+ self.to_address = self._get_decoded_header("To")
233
+ self.cc_address = self._get_decoded_header("Cc")
234
+ self.from_address = self._get_decoded_header("From")
235
+ # 変更したところ
236
+ self.date = datetime.datetime.strptime(
237
+ self._get_decoded_header("Date"),
238
+ "%a, %d %b %Y %H:%M:%S %z"
239
+ )
240
+
241
+ # メッセージ本文部分の処理
242
+ for part in self.email_message.walk():
243
+ # ContentTypeがmultipartの場合は実際のコンテンツはさらに
244
+ # 中のpartにあるので読み飛ばす
245
+ if part.get_content_maintype() == 'multipart':
246
+ continue
247
+ # ファイル名の取得
248
+ attach_fname = part.get_filename()
249
+ # ファイル名がない場合は本文のはず
250
+ if not attach_fname:
251
+ charset = str(part.get_content_charset())
252
+ if charset:
253
+ self.body += part.get_payload(decode=True).decode(charset, errors="replace")
254
+ else:
255
+ self.body += part.get_payload(decode=True)
256
+ else:
257
+ # ファイル名があるならそれは添付ファイルなので
258
+ # データを取得する
259
+ self.attach_file_list.append({
260
+ "name": attach_fname,
261
+ "data": part.get_payload(decode=True)
262
+ })
263
+
264
+ def _get_decoded_header(self, key_name):
265
+ """
266
+ ヘッダーオブジェクトからデコード済の結果を取得する
267
+ """
268
+ ret = ""
269
+
270
+ # 該当項目がないkeyは空文字を戻す
271
+ raw_obj = self.email_message.get(key_name)
272
+ if raw_obj is None:
273
+ return ""
274
+ # デコードした結果をunicodeにする
275
+ for fragment, encoding in decode_header(raw_obj):
276
+ if not hasattr(fragment, "decode"):
277
+ ret += fragment
278
+ continue
279
+ # encodeがなければとりあえずUTF-8でデコードする
280
+ if encoding:
281
+ ret += fragment.decode(encoding)
282
+ else:
283
+ ret += fragment.decode("UTF-8")
284
+ return ret
285
+
286
+ if __name__ == "__main__":
287
+ # ブックを取得
288
+ book = openpyxl.load_workbook(r'C:\Users\ああああ\Desktop\あああ\あああああ.xlsx')
289
+ # シートを取得
290
+ sheet = book['Sheet1']
291
+
292
+ tifCounter = len(glob.glob1("./mail","*.eml"))
293
+ print("🙌総メール件数",tifCounter,"件🙌")
294
+
295
+ i=2
296
+ for mail_file_path in glob.glob('./mail/*'):
297
+ try:
298
+ result = MailParser(mail_file_path)
299
+ # セルへ書き込む
300
+ sheet.cell(row=i, column=1).value = i-1
301
+ sheet.cell(row=i, column=2).value = result.date.replace(tzinfo=None)
302
+ sheet.cell(row=i, column=4).value = result.from_address.split("<")[0]
303
+ sheet.cell(row=i, column=5).value = result.from_address[:-1].split("<")[1]
304
+ sheet.cell(row=i, column=6).value = result.body
305
+
306
+ print(i-1,"件目💕書き込んだよ😘")
307
+ print(mail_file_path)
308
+ print()
309
+ except ValueError:
310
+ print(i-1,"件目エラーだよ😒")
311
+ print(mail_file_path)
312
+ print("👿👿👿👿👿👿👿👿👿👿👿👿👿👿")
313
+ print()
314
+
315
+ i+=1
316
+
317
+ # 保存する
318
+ book.save(r'C:\Users\ああああ\Desktop\あああ\あああああ.xlsx')
319
+ print("終わったよ😍")
320
+
321
+ ```

3

ファイル

2022/06/22 01:20

投稿

UserName
UserName

スコア3

test CHANGED
File without changes
test CHANGED
@@ -121,7 +121,7 @@
121
121
  print(tifCounter)
122
122
  for mail_file_path in glob.glob('./mail/*'):
123
123
  # ブックを取得
124
- book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop')
124
+ book = openpyxl.load_workbook(r'C:\Users\Desktop')
125
125
  # シートを取得
126
126
  sheet = book['Sheet1']
127
127
  # セルへ書き込む

2

フォルダ名

2022/06/22 01:16

投稿

UserName
UserName

スコア3

test CHANGED
File without changes
test CHANGED
@@ -121,14 +121,14 @@
121
121
  print(tifCounter)
122
122
  for mail_file_path in glob.glob('./mail/*'):
123
123
  # ブックを取得
124
- book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
124
+ book = openpyxl.load_workbook(r'C:\Users\mediamagic\Desktop')
125
125
  # シートを取得
126
126
  sheet = book['Sheet1']
127
127
  # セルへ書き込む
128
128
  sheet['A1'] = 'ナンバー'
129
129
  sheet['B1'] = 100
130
130
  # 保存する
131
- book.save(r'C:\Users\mediamagic\Desktop\SES\SES.xlsx')
131
+ book.save(r'C:\Users\)
132
132
 
133
133
  result = MailParser(mail_file_path).get_attr_data()
134
134
 

1

下に追加しましたー!!!!

2022/06/21 08:50

投稿

UserName
UserName

スコア3

test CHANGED
File without changes
test CHANGED
@@ -146,3 +146,19 @@
146
146
 
147
147
  https://teratail.com/questions/09h52spph2wsst
148
148
  ↑↑ここの回答者さんが説明を書いてくれてます〜。
149
+
150
+
151
+ print結果
152
+
153
+ 総メール件数 1 件
154
+ 日時: 2022-06-21 17:46:21+09:00
155
+ FROM: たこ焼きくん <aaaaa@aaaa.aaa>
156
+ TO: cccc@ccccc.cccc
157
+ CC:
158
+ -----------------------
159
+ 本文:
160
+ はまやらわ
161
+
162
+
163
+ -----------------------
164
+ ATTACH_FILE_NAME: