-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.php
298 lines (208 loc) · 8.27 KB
/
index.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
286
287
288
289
290
291
292
293
294
295
296
297
298
<?php
ini_set('display_errors', "On");
// 文字コード設定
header('Content-Type: application/json; charset=UTF-8');
// リクエストした URL
$request_uri = $_SERVER["REQUEST_URI"];
// ここのURL
$url = "/emailCheck/";
// $url = "/emailCheck/";
// フルURL
$full_url = "https://api.itsystem-lab.com".$url;
// $full_url = "http://localhost".$url;
// メールアドレスの解析
$email = substr($request_uri, mb_strlen($url));
/*
構文の確認
*/
// エラー収納用
$error = [];
// もし、Emailが入力されていないなら
if($email == null) array_push($error, "Enter your Email.");
// もし、Emailの文字数が256文字を超えていたら
if( mb_strlen($email) > 256 ) array_push($error, "The Email must be no longer than 256 characters.");
// もし、Emailの文字数が7文字を以下なら
if( mb_strlen($email) < 7 ) array_push($error, "The Email must be at least 7 characters long.");
// 初期値設定
$at = 0; // @(アットマーク)の数を数える用
// emailの文字列を一つずつ繰り返す。 例 [[email protected]]の場合、"s"»"a"»"m"»...»"o"»"m"
for ($i=0; $i < mb_strlen($email); $i++) {
// 文字列を取得
$str = substr($email, $i, 1);
// もし、最初の文字なら
if( $i == 0 ){
// もし、英数字ではないなら
if( !ctype_alnum( $str ) ) array_push($error, "The first character must be alphanumeric.");
}
// もし、アットマークなら
if( $str =="@" ){
// $atの数を一つ増やす。
$at++;
}
// もし、最後の文字なら
if( $i == mb_strlen($email) ){
// もし、英数字ではないなら
if( !ctype_alnum( $str ) ) array_push($error, "The last character must be alphanumeric.");
}
// もし、英数字以外で
if( !ctype_alnum( $str ) ){
// 表示用のn文字目
$n = $i + 1;
// 使える文字列以外を使っている
if( $str != "@" && $str != "_" && $str != "-" && $str != "." ) array_push($error, "An invalid character is used for the $n character. [ $str ]");
}
}
// もし、@(アットマーク)の数が、1つではないなら
if( $at != 1 ) array_push($error, "Only one \"@\" must be placed.");
// @(アットマーク)の直前に[.](ドットマーク)があるなら
if( strpos($email, ".@") ) array_push($error, "Put \".\" just before \"@\".");
// @(アットマーク)の直後に[.](ドットマーク)があるなら
if( strpos($email, "@.") ) array_push($error, "Put \".\" just before \"@\".");
/*
ドメインの確認
*/
// ログ用
$log = [];
// もし、今のところエラーがないなら
if( count($error) == 0 ){
// 構文をtrueにする
$syntax = true;
// @(アットマーク)で分割する
$division = explode("@", $email);
// ユーザーを抽出
$user = $division[0];
// ドメインを抽出
$domain = $division[1];
/*
APIを利用してドメイン情報を取得する
*/
// URLを生成
$url = "https://api.itsystem-lab.com/dns/$domain";
// JSONデータで取得
if( $json = @file_get_contents($url) ){
// 文字化けしないようにする
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
// JSONデータを連想配列の形式にする
$json = json_decode($json, true);
// もし、MXレコードが存在しないなら
if( empty($json["MX"]) || count($json["MX"]) == 0 ) array_push($error, "Failed to retrieve MX record.");
// ソート
asort($json["MX"]);
// MXレコードを定義
$mx = [];
// MXレコードを追加
foreach ($json["MX"] as $m) {
// もし、targetが存在するなら
if( $m["target"] != null && !empty($m["target"]) ){
// MXレコードに追加
array_push($mx, $m);
}
}
}
// もし、JSONデータの取得を失敗したなら
else array_push($error, "Invalid domain. [ $domain ]");
// もし、今のところエラーがないなら
if( count($error) == 0 ){
// MXレコードを繰り返す
foreach($mx as $m){
// MXレコードのサーバーにtelnet接続をする
$socket = @fsockopen($m["target"], 25);
// もし、接続できたら
if($socket){
// localhostに挨拶する
fwrite($socket, "helo localhost\n");
// メールの送り主を設定する
fwrite($socket, "mail from:<[email protected]>\n");
// 宛先のメールアドレスの存在確認
fwrite($socket, "rcpt to:<$email>\n");
// // ソケットのレスポンスを回収 (4つ)
for ($i=0; $i < 4 ; $i++) {
// 回収したレスポンスを $lineに代入
$line = fread($socket, 2048);
// もし、lineに何も入っていないなら
if($line == null || $line == ""){
// 次のループへ
break;
}
// もし、\r\nが含まれているなら
if( strpos($line, "\r\n") ){
// \r\nで分割する
$line = explode("\r\n", $line);
// \r\nで分割したものを繰り返す
foreach ($line as $l) {
// もし、$lに何も入っていないなら
if($l == null || $l == ""){
// 次のループへ
break;
}
// もしレスポンスが 2 から始まっていないなら
if( substr($l, 0, 1) !== "2" ){
// エラー文を追加
array_push($error, $l);
}
// ログに残す
array_push($log, $l);
}
}
// それ以外なら
else{
// もしレスポンスが 2 から始まっていないなら
if( substr($line, 0, 1) !== "2" ){
// エラー文を追加
array_push($error, $line);
}
// ログに残す
array_push($log, $line);
}
}
// もし、今のところエラーがないなら ループ終了
if( count($error) == 0 ) {
// メールサーバーを記録
$mx_server = $m["target"];
// ループ終了
break;
}
}
// もし、接続できなかったら
else array_push($error, "Could not connect to ".$m["target"].":25.");
}
}
}
// 構文チェックでエラーがあった
else{
// 構文をfalseにする
$syntax = false;
}
// レスポンスを定義
$response = [];
// もし、エラーがないなら
if( count($error) == 0 ){
// ステータスを成功(true)にする
$response["status"] = true;
}
// それ以外なら
else{
// ステータスを成功(false)にする
$response["status"] = false;
// サンプルを追加する
array_push($error, "Example: ".$full_url."[email protected]");
}
// 構文チェックの結果を出力
$response["syntax"] = $syntax;
// タイムスタンプを出力
$response["timestamp"] = time();
// メアドを出力
$response["email-address"] = $email;
// ユーザーを出力
$response["user"] = $user;
// ドメインを出力
$response["domain"] = $domain;
// メールサーバーを出力
$response["mail-server"] = $mx_server??"Not found.";
// ログを収納
$response["log"] = $log;
// エラーを収納
$response["error"] = $error;
// 出力
print json_encode($response, JSON_PRETTY_PRINT);
?>