-
Notifications
You must be signed in to change notification settings - Fork 0
/
POPMail.php
285 lines (245 loc) · 9.33 KB
/
POPMail.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
<?php
/**
* Created by PhpStorm.
* User: Ian
* Date: 2015/12/18
* Time: 0:39
*/
include_once "POPServer.php";
function popAllMail($cntAttris){
$host = $cntAttris['host'];
$port = $cntAttris['port'];
$user = $cntAttris['user'];
$password = $cntAttris['password'];
$checkmail = $cntAttris['checkmail'];
$saveFile = $cntAttris['saveFile'];
$socket = null;
if (!($socket = fsockopen(gethostbyname($host), $port, $errno, $errstr))){
exit($errno . ': ' . $errstr);
}
set_socket_blocking($socket, true);
//1. check
$command = "USER " . $user . "\r\n";
fwrite($socket, $command);
$msg = fgets($socket);
echo 'USER: ',$msg, '<br />';
$command = "PASS " . $password . "\r\n";
fwrite($socket, $command);
$msg = fgets($socket);
echo 'PSWD: ',$msg,'<br />';
$command = "stat \r\n";
fwrite($socket, $command);
$msg = fgets($socket);
echo $msg;
// $command = "list \r\n";
// fwrite($socket, $command);
// $all_mails = array();
// while (true) {
// $msg = fgets($socket);
// echo '*',$msg,'*<br/>';
// if (!preg_match('/^\+OK/', $msg) && !preg_match('/^\./', $msg)) {
// $msg = preg_replace('/\ .*\r\n/', '', $msg);
// array_push($all_mails, $msg);
// }
// if (preg_match('/^\./', $msg))
// break;
// }
// getSpecific(null, $socket);
$index = 200;
$allContents = array();
for($index=199;$index<210;$index++){
$mailContent='';
$command = "RETR ".$index."\r\n";
fwrite($socket, $command);
$content = getContent($socket,'[email protected]');
echo '<br/>----------------gotContent()--------------<br/>',$index,'<br/>';
echo $content,'<br/>---------------------<br/>';
$allContents[] = $content;
}
$command = "QUIT\r\n";
fwrite($socket, $command);
$msg = fgets($socket);
echo $msg;
writeFile($allContents, $saveFile);
}
function getContent($socket, $targetSender){
$rawContent = '';
$caughtEncoding = false;
$charset = null;
$caughtSender = false;
while(true){
$line = fgets($socket);
if(preg_match('/^\./', $line)){
break;
}
//发件人
if(preg_match('/From:\s[\w\?\s=]*</', $line)){
$sender = explode('>', explode('<', $line)[1])[0];
$caughtSender = true;
echo '<br/>', $line,'@@@@@',explode('>', explode('<', $line)[1])[0],'<br/>';
if($sender != $targetSender){
fwrite($socket, 'RSET\r\n');
echo '<br>the sender is ',$sender,' move to next', fgets($socket),'<br/>';
return '';
}
}else{
echo '<br/>(',$line,')<br/>';
}
$rawContent .= $line;
// echo '#',$line,'%';
$codeTypes = getCodingType($line);
$encoding = $codeTypes['encoding'];
if($codeTypes['charset']!=null && $codeTypes['charset']!=''){
$charset = $codeTypes['charset'];
// echo '$$get charset = ',$charset;
}
if(encodingValid($encoding)){//接下来的是正文内容,需要解码
$caugtEncoding = true;
echo '<br/>正文开始,encoding='.$encoding;
$decodedContent = decode($rawContent, $encoding);
while(true){
$rawLine = fgets($socket);
$codeTypes = getCodingType($rawLine);
$rawContent .= $rawLine;
// echo $rawLine;
if(preg_match('/^\./', $rawLine)){//读取结束
echo '<br/>内容读取结束';
if($caughtSender){
return $decodedContent;
}else{
echo ',未发现发件人<br/>';
return '';
}
}else if(encodingValid($codeTypes['encoding'])){//编码转换
echo '<br/><br/>编码转换,encoding=',$encoding;
// while(preg_match('/^\./', fgets($socket))){
//
// }
// if($caughtSender){
// return $decodedContent; //针对163的特殊优化
// }else{
// return '';
// }
$encoding = getCodingType($rawLine)['encoding'];
continue;
}else if($codeTypes['charset'] !== null){
// $charset = $codeTypes['charset'];
}
// $decodedContent .= decode($rawLine, $encoding);
// echo '<br/>**|||',$charset,'|||<br/><br/>';
$decodedContent .= toUTF8($charset, decode($rawLine, $encoding));
}
}
}
//如果没有指明encoding
if(!$caughtEncoding){
echo '<br/><br/>_______________no encoding___________<br/>';
// echo decode($rawContent, 'base64');
return decode($rawContent, 'base64');
}
}
function encodingValid($encoding){
if($encoding == null){
return false;
}
$encodingArray = array('base64','Quoted-Printable','quoted-printable','8bit');
foreach($encodingArray as $e){
// echo '<br/>',$encoding,'<br/>';
if(strpos($encoding, $e) !== false){
// echo 'valid!!!<br/>';
return true;
}
}
return false;
}
function decode($str, $encoding){
// echo '<br/>',$encoding,'decoding: ',$str,'<br/>';
$result = $str;
if(strpos($encoding,'base64') !== false){
// echo '***base64 encoding';
$result = base64_decode($str);
// echo $result,'<br/>';
}else if($encoding == '8bit'){
}else if($encoding == null){
$result = '';
// echo '***null encoding';
}else if(strpos($encoding, 'Quoted-Printable') !==false || strpos($encoding, 'quoted-printable')){
$result = quoted_printable_decode($str);
}else{
echo '错误的编码';
}
// echo 'result:',$result,'<br/>';
return $result;
}
function toUTF8($charset, $content){
if($charset == 'GBK' || $charset == 'gbk' || $charset=='GB2312'){
// return $content;
return iconv('GBK', 'UTF-8//IGNORE', $content);
// Linux下编译要加参数
// return mb_convert_encoding($content, 'UTF-8', 'GB2312');
}else if($charset == 'UTF-8' || $charset == 'utf-8'){
return $content;
}else{
echo '<br/><br/>no charset',$charset,'<br/><br/>';
return $content;
}
}
function getCodingType($line){
// echo $line;
$charset = null;
if(preg_match('/\bcharset=[\w-\"]*\b/', $line, $charsets)){
$charset = $charsets[0];
$charset = substr($charset, 8);
// echo '<br/>****',$charset,'<br/>';
}else if(preg_match('/\?GBK\?/', $line)){
$charset = 'GBK';
}
// echo '***charset=',$charset,'<br/><br/>';
$encoding = null;
if(preg_match('/Content-Transfer-Encoding:\s[-\w]*/', $line, $encodes)){
// print_r($encodes/**/);
$encoding = $encodes[0];
// $encoding = substr($encoding, 26);
}else{
// echo '<br/>no specified encoding<br/>',$line,'<br/>';
}
return array("charset"=>$charset, "encoding"=>$encoding);
}
function writeFile($contentArray, $filePath){
$allContent = '';
$count = 0;
foreach($contentArray as $content){
if($content === ''){
++$count;
continue;
}
echo '写入',$count,'<br/>';
$allContent .= $content;
}
file_put_contents($filePath, $allContent);
}
function getSpecific($address, $socket){
for($i=1;$i<2;$i++){
$command = 'TOP '.$i.' 10\r\n';
fwrite($socket,$command);
$isNeed = false;
while (true) {
$msg = fgets($socket);
if(preg_match('/From:\s[\?\w]\s<', $msg)){
echo '<br/>',$msg;
};
if (preg_match('/^\./', $msg))
break;
}
}
}
//popAllMail($array_163);
//$str = ' 鍖椾含 鏅� 鏅� qing qing 鍖楅 鏃犳寔缁鍚� 3-4 鈮�3 2 -7 2 2 2 2 7 3 1 6 鏆傛棤 鏆傛棤 鏆傛棤 妫夎。銆佸啲澶ц。銆佺毊澶瑰厠銆佸唴鐫€琛~鎴栫緤姣涘唴琛c€佹瘺琛c€佸缃╁ぇ琛� 杞诲害 寮� 杈冨喎 鏆傛棤 鏆傛棤 钖勫啲琛� 寤鸿寮€鍚�(鍒剁儹) 闈炲父閫傚疁 鏆傛棤 瀵圭┖姘旀薄鏌撶墿鎵╂暎鏃犳槑鏄惧奖鍝� 绱绾垮急 澶栧嚭娲诲姩瑕佹埓钖勬墜濂楋紝钖勫洿宸惧拰甯藉瓙銆� 寤鸿寮€鍚┖璋� 娲楄溅鍚庤嚦灏戞湭鏉�4澶╁唴娌℃湁闄嶆按銆佸ぇ椋庛€佹矙灏樺ぉ姘旓紝淇濇磥鏃堕棿闀匡紝闈炲父閫傚疁娲楄溅銆傛敞鎰忔礂杞﹀綋鏃ユ皵娓╀笉鑳藉お浣庝互鍏嶇粨鍐般€� 2 澶氬彂鏈� 澶╂皵杈冨喎锛屽鍐呭娓╁樊杈冨ぇ锛岃緝鏄撳紩璧锋劅鍐掞紱 5 涓嶉€傚疁 澶╂皵杈冨喎锛屽鏁颁汉涓嶉€傚疁鎴峰杩愬姩锛� 2016-01-07 2016-01-07 2016-01-07 2016-01-07 08:10:00 ';
//$str = base64_decode($str);
//echo $str;
//echo quoted_printable_decode($str);
//getCodingType('Content-Transfer-Encoding: base64 ');
//echo iconv("GB2312","UTF-8//IGNORE", $str);
//getContent($str);
//getCodingType('Content-Transfer-Encoding: base64');
//echo preg_match('/\bFrom:\s/', 'From: =?GBK?B?wO7QptHg?= <[email protected]>');