質問編集履歴

5

質問内容の再確認

2019/01/02 14:22

投稿

kg7652
kg7652

スコア14

test CHANGED
File without changes
test CHANGED
@@ -281,3 +281,21 @@
281
281
 
282
282
 
283
283
  3つの課題について引き続き何か情報をいただけましたら幸いです。
284
+
285
+
286
+
287
+ 【追記】
288
+
289
+ 2つ目のソースで正規表現を利用してHTMLメールを削除していますが、これをやりたかったわけではなく、出力されるファイルにHTMLメールが含まれると、ざっと出力ファイル内を目視するときにじゃまだったから削除している状況です。最終的にはHTMLソースの状態でも検索はできると考えています。
290
+
291
+
292
+
293
+ 基本的に、
294
+
295
+ ・Macで正規表現(後読み、先読みが使えるのがよい)を検索に使えるメーラーがあるか
296
+
297
+ ・でなければ、直接mail.appのデーターにスクリプト言語からアクセスできないか
298
+
299
+ というのが質問の内容です。
300
+
301
+ 最初に質問した後に発見したブログに掲載されていたpythonコードで、mboxファイルを扱えそうだったので試しましたが、数件だけ出力されて止まってしまったため、とりあえず正常終了するように手直ししたところまでを追記しました。この質問には回答は付いていないもののそこそこ閲覧数があったので、興味を持たれる方もいのだと思い、自分なりの試行錯誤を追記しています。どなたかが試していただければ情報を得られるかもしれないと期待しております。

4

その後の作業に関して追記

2019/01/02 14:22

投稿

kg7652
kg7652

スコア14

test CHANGED
File without changes
test CHANGED
@@ -127,3 +127,157 @@
127
127
  【追記】
128
128
 
129
129
  別のメールボックス(12MB)で試したところ、全384件が出力され、待ち時間もほぼ感じない程度でした。
130
+
131
+
132
+
133
+ 【追記】
134
+
135
+ その後、止まった時のエラーメッセージをよく見てソースをいじったところ、スクリプト自体は正常終了するようになりました。
136
+
137
+
138
+
139
+ ```python
140
+
141
+ import mailbox
142
+
143
+ from email.header import decode_header
144
+
145
+ import re
146
+
147
+
148
+
149
+ mail_box = mailbox.mbox("/pathTo/mbox")
150
+
151
+ for key in mail_box.keys():
152
+
153
+ try:
154
+
155
+ a_msg = mail_box.get(key)
156
+
157
+ except:
158
+
159
+ pass
160
+
161
+
162
+
163
+ from_str = a_msg.get_from()
164
+
165
+ print(from_str)
166
+
167
+
168
+
169
+ usbj = ''
170
+
171
+ for bstr,enc in decode_header(str(a_msg['Subject'])) :
172
+
173
+ if enc == None:
174
+
175
+ pass
176
+
177
+ else:
178
+
179
+ usbj += bstr.decode(enc, "ignore")
180
+
181
+ print("subject: "+usbj)
182
+
183
+
184
+
185
+ for aa_msg in a_msg.walk():
186
+
187
+ if not 'text' in aa_msg.get_content_type():
188
+
189
+ continue #"text"パートでなかったら次のパートへ
190
+
191
+ if aa_msg.get_content_charset() :
192
+
193
+ a_text = aa_msg.get_payload(decode=True).decode(aa_msg.get_content_charset(), "ignore")
194
+
195
+ else:
196
+
197
+ if "charset=shift_jis" in str(aa_msg.get_payload(decode=True)):
198
+
199
+ #ひとまず シフトJISだけ特別対応。
200
+
201
+ a_text = aa_msg.get_payload(decode=True).decode("cp932", "ignore")
202
+
203
+ else:
204
+
205
+ print ("** Cannot decode.Cannot specify charset ***"+str(aa_msg.get("From")))
206
+
207
+ a_text = re.sub(r'<(?:!|HTML|html).*>', '' , a_text, flags=re.DOTALL)
208
+
209
+ print(a_text)
210
+
211
+ continue
212
+
213
+ ```
214
+
215
+ と変更してエラーを無視するようにしました。
216
+
217
+
218
+
219
+ 結果、全15800件くらいのメールのうち、14500件ほどが出力されます。
220
+
221
+
222
+
223
+ 1300件ほどが出力されていませんが、エラーの理由はよくわかっていません。
224
+
225
+
226
+
227
+ 最初に出ていたエラーメッセージを根拠に
228
+
229
+ 元のソースの13行目を修正したあと、以下のようなことなるエラーメッセージでました。
230
+
231
+
232
+
233
+ Traceback (most recent call last):
234
+
235
+ File "mailSearch.py", line 6, in <module>
236
+
237
+ a_msg = mail_box.get(key)
238
+
239
+ File "/usr/local/Cellar/python/3.7.2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/mailbox.py", line 66, in get
240
+
241
+ return self.__getitem__(key)
242
+
243
+ File "/usr/local/Cellar/python/3.7.2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/mailbox.py", line 73, in __getitem__
244
+
245
+ return self.get_message(key)
246
+
247
+ File "/usr/local/Cellar/python/3.7.2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/mailbox.py", line 781, in get_message
248
+
249
+ msg.set_from(from_line[5:].decode('ascii'))
250
+
251
+ UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)
252
+
253
+
254
+
255
+ これは、ライブラリが関わっていたので、元のソースの6行目を変更してエラーを無視すうるようにした流れです。
256
+
257
+
258
+
259
+ 出力されないメールの共通点はよくわからず、同じ相手からの似たようなメールでも出力されているものとされないものがあったりします。
260
+
261
+
262
+
263
+ 修正後のコードで正規表現を使っていますが、これはHTMLメールを削除するためで、本当はHTMLメールを適切にテキスト化したいのですが、方法がわからず、その段階に至っていません。
264
+
265
+
266
+
267
+ 今後、
268
+
269
+ ・HTMLメールのテキスト化のやり方
270
+
271
+ ・エラーの原因と対応法
272
+
273
+ が解決したら、当初の目的の正規表現を用いた検索もできそうだと思っています。
274
+
275
+ mboxのファイルサイズが大きいのでかなり待たされますが、それでも人力で検索することが困難であれば、数分待つだけで結果が得られればありがたいです。
276
+
277
+
278
+
279
+ ただ、あらかじめmboxを書き出さずに直接mail.appのメールボックスをpythonからアクセスできるのいいのですが方法がわかりません。
280
+
281
+
282
+
283
+ 3つの課題について引き続き何か情報をいただけましたら幸いです。

3

新たに行ったテストの結果の追記

2019/01/02 13:02

投稿

kg7652
kg7652

スコア14

test CHANGED
File without changes
test CHANGED
@@ -121,3 +121,9 @@
121
121
 
122
122
 
123
123
  ```
124
+
125
+
126
+
127
+ 【追記】
128
+
129
+ 別のメールボックス(12MB)で試したところ、全384件が出力され、待ち時間もほぼ感じない程度でした。

2

その後試したことの追記

2019/01/01 08:31

投稿

kg7652
kg7652

スコア14

test CHANGED
File without changes
test CHANGED
@@ -9,3 +9,115 @@
9
9
  あるいは、PHPやPythonなどのスクリプト言語から標準メーラーのメールボックスを検索することができますでしょうか?
10
10
 
11
11
  具体的な方法または関連情報などお教えいただけましたら幸いです。
12
+
13
+
14
+
15
+
16
+
17
+ 【追記】
18
+
19
+ 一度、mail.appの「メールボックスを書き出す」で書き出した上で、
20
+
21
+ http://techu1999.sakura.ne.jp/python/category/%E3%83%A1%E3%83%BC%E3%83%AB%E5%87%A6%E7%90%86/
22
+
23
+ こちらのブログの「Thunderbirdに届いたメールを処理する」という記事中のサンプルソースをデータファイルのパス以外はそのまま試し、
24
+
25
+ ・メールアドレス+日時
26
+
27
+ ・サブジェクト
28
+
29
+ ・本文
30
+
31
+ のセットが次々と出力されるテストをしました。(結果はテキストファイルへリダイレクト)
32
+
33
+
34
+
35
+ 今回書き出したmboxファイルは2.15GBで、
36
+
37
+ 途中まで(7件)うまく書き出されましたが8件目のメールアドレス+日時の行が出力されたところで止まってしまいました。
38
+
39
+ そこまで数十秒待たされる感じです。
40
+
41
+
42
+
43
+ 仮にうまくいっても待ち時間が長いので現状のメールボックスの状態では使いにくいと感じました。
44
+
45
+
46
+
47
+ でも、そのあたりがクリアできれば、正規表現での検索も一応は実現できそうです。
48
+
49
+
50
+
51
+ なにか問題(途中で終わってしまう。あるいは処理に時間がかかる)の解決につながる情報がございましたらお教えいただけましたら幸いです。
52
+
53
+
54
+
55
+
56
+
57
+ 以下、上記ブログに掲載されていたソース(パスの部分のみ改変あり)です
58
+
59
+ ```python
60
+
61
+ import mailbox
62
+
63
+ from email.header import decode_header
64
+
65
+
66
+
67
+ mail_box = mailbox.mbox("/pathTo/mbox")
68
+
69
+ for key in mail_box.keys():
70
+
71
+ a_msg = mail_box.get(key)
72
+
73
+ from_str = a_msg.get_from()
74
+
75
+ print(from_str)
76
+
77
+
78
+
79
+ usbj = ''
80
+
81
+ for bstr,enc in decode_header(a_msg['Subject']) :
82
+
83
+ if enc == None:
84
+
85
+ usbj += bstr.decode("ascii", "ignore")
86
+
87
+ else:
88
+
89
+ usbj += bstr.decode(enc, "ignore")
90
+
91
+ print("subject: "+usbj)
92
+
93
+
94
+
95
+ for aa_msg in a_msg.walk():
96
+
97
+ if not 'text' in aa_msg.get_content_type():
98
+
99
+ continue #"text"パートでなかったら次のパートへ
100
+
101
+ if aa_msg.get_content_charset() :
102
+
103
+ a_text = aa_msg.get_payload(decode=True).decode(aa_msg.get_content_charset(), "ignore")
104
+
105
+ else:
106
+
107
+ if "charset=shift_jis" in str(aa_msg.get_payload(decode=True)):
108
+
109
+ #ひとまず シフトJISだけ特別対応。
110
+
111
+ a_text = aa_msg.get_payload(decode=True).decode("cp932", "ignore")
112
+
113
+ else:
114
+
115
+ print ("** Cannot decode.Cannot specify charset ***"+msg.get("From"))
116
+
117
+ print(a_text)
118
+
119
+ continue
120
+
121
+
122
+
123
+ ```

1

OSのバージョンを明記

2019/01/01 08:04

投稿

kg7652
kg7652

スコア14

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- Macの標準メーラーを使用していますが、おそらくメールの検索に正規表現が使えません。
1
+ Mac(macOS 10.14.2)の標準メーラーを使用していますが、おそらくメールの検索に正規表現が使えません。
2
2
 
3
3
  (調べた限りでは情報が見つかりません)
4
4