質問編集履歴
5
質問内容の再確認
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
その後の作業に関して追記
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
新たに行ったテストの結果の追記
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
その後試したことの追記
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のバージョンを明記
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
|
|