1 import datetime, zipfile, tarfile, logging, os, string, random, ipaddress, uuid, pytz, py7zr 2 import io, socket 3 from email.mime.text import MIMEText 4 from email.mime.multipart import MIMEMultipart 5 from email.mime.application import MIMEApplication 6 from email.utils import formatdate, make_msgid 7 from email.mime.image import MIMEImage 8 import email.generator, email.message, threading, multiprocessing, pdb, logging.handlers, linecache 9 import openpyxl 10 import tqdm 11 from faker import Faker 12 from multiprocessing import Pool 13 14 # email domain dict 15 email_domain = { 16 0: 'gmail.com', 1: 'yahoo.com', 2: 'msn.com', 3: 'hotmail.com', 4: 'aol.com', 5: '163.com', 6: 'live.com', 17 7: 'qq.com', 8: 'ask.com', 9: '0355.com', 10: 'googlemail.com', 11: 'sina.com', 12: 'sougou.com', 13: 'foxmail.com', 18 14: 'live.com', 15: '163.net', 16: '263.net', 17: 'yeah.net', 18: 'mail.com', 19: 'aim.com', 20: 'walla.com', 19 21: 'inbox.com', 22: 'hongkong.com', 23: 'ctimail.com', 24: 'hknet.com', 25: 'SEED.NET.TW', 20 26: 'TOPMARKEPLG.COM.TW', 27: 'PCHOME.COM.TW', 28: 'netzero.net', 29: 'vsnl.com', 30: 'yandex.ru' 21 } 22 # link dict 23 link_dict = { 24 1: 'https://www.baidu.com', 25 2: 'https://www.gitee.cn', 26 3: 'https://www.ccc.net', 27 4: rf'{random.choice(["www", "https://www"])}.{"".join(random.choices((string.ascii_letters + string.digits + chr(random.randint(0x4E00, 0X9FBF))), k=random.randint(5, 30)))}.{random.choice(["com", "cn", "net"])}', 28 } 29 eml_format = { 30 1: 'eml', 31 2: 'msg', 32 3: 'pst', 33 4: 'fox' 34 } 35 type_list = ['rar', 'tgz', 'zip', '7z'] 36 37 # txt file path 38 PATH_TXT = rf'{os.getcwd()}\article_pic' 39 PATH_SAVE = rf'{os.getcwd()}\eml\eml_file' 40 PATH_ATTACHMENT = rf'{os.getcwd()}\attachment' 41 PATH_COMPRESS = rf'{os.getcwd()}\compressfiles' 42 PATH_LOG = rf'{os.getcwd()}\eml_log' 43 PATH_MSG = rf'{os.getcwd()}\eml\msg_file' 44 PATH_TOOL = rf'{os.getcwd()}\tool_msg\MailConverter.exe' 45 46 recip_dict = {} 47 sender_dict = {} 48 49 50 class Domain: 51 52 def __init__(self): 53 """ 54 define msg structure 55 """ 56 self.msg = MIMEMultipart() 57 self.path = '' 58 logging.basicConfig(level=logging.DEBUG) 59 handler = logging.handlers.RotatingFileHandler(filename=os.path.join(PATH_LOG, 'eml_log.log'), 60 maxBytes=20971520, backupCount=20) 61 self.logger = logging.getLogger() 62 formatter = logging.Formatter('[%(levelname)s] : [%(asctime)s] : [%(lineno)d]%(message)s') 63 handler.setFormatter(formatter) 64 self.logger.setLevel(logging.INFO) 65 self.logger.addHandler(handler) 66 self.fake = Faker() 67 68 # read/write file operation 69 def files_operation(self, name, method, msg_save_flag=False, encoding=None): 70 """ 71 file read/write operation 72 :param name: the file name that need operation, full name 73 :param method: type of operation , read/write 74 :param msg_save_flag: email save flag 75 :param encoding: change encoding way , UTF-8 or auto 76 :return: read return only 77 """ 78 if 'eml' in name or 'fox' in name or 'msg' in name or 'pst' in name: 79 self.path = os.path.join(PATH_SAVE, name) 80 elif 'log' in name: 81 self.path = os.path.join(PATH_LOG, name) 82 else: 83 self.path = os.path.join(PATH_TXT, name) 84 85 if 'rb' in method: 86 if 'PNG' in name: 87 self.path = os.path.join(PATH_TXT, name) 88 else: 89 self.path = os.path.join(PATH_ATTACHMENT, name) 90 91 with open(self.path, method, encoding=encoding) as file: 92 if 'r' in method: 93 if '.log' in name: 94 length = len(file.readlines()) 95 return length 96 else: 97 print(self.path) 98 message = file.read() 99 return message 100 elif method == 'w': 101 if msg_save_flag: 102 file.write(self.msg.as_string()) 103 elif method == 'wb': 104 if msg_save_flag: 105 file.write(self.msg.as_bytes()) 106 if 'fox' in name: 107 gen = email.generator.BytesGenerator(file, mangle_from_=False, maxheaderlen=0) 108 gen.flatten(self.msg) 109 110 # create email local 111 def create_emails(self, recip_name, sender_name, create_num, attachment, debug_flag, att_num=1, picture_flag=1, link_flag=1, 112 flag='close'): 113 """ 114 115 :param recip_name: name list for recipe 116 :param sender_name: name list for sender 117 :param create_num: just for file name 118 :param attachment: whether email need add attachment, 0 true / 1 false 119 :param att_num: attachment number, int 120 :param picture_flag: add picture in eml 121 :param link_flag: add link in article, random location in article or table in the end 122 :param flag: post flag 123 """ 124 125 def cc_list_collect(recip_info): 126 """ 127 dispose cc list information 128 :param recip_info: 129 :return:cc_list 130 """ 131 choose_cc_set = set(recip_dict.values()) - set(recip_info) 132 return random.sample(list(choose_cc_set), random.randint(1, 10)) 133 134 def add_link(body_of_html): 135 """ 136 :param body_of_html: 137 :return: str 138 """ 139 # link location in article 140 article_link_flag = random.randint(0, 3) 141 if article_link_flag == 0: 142 add_num = random.randint(1, 3) 143 local_random = [random.randint(28, len(body_html) - 7) for _ in range(add_num)] 144 # link just url not text 145 for local in local_random: 146 body_of_html = body_of_html[:int(local)] + f'<a href="{link_dict[random.randint(1, 3)]}">' \ 147 f'{link_dict[random.randint(1, 3)]}</a>' + body_of_html[ 148 int(local):] 149 log_info = f'add href in article flag [TRUE], num[{add_num}], url[{link_dict[random.randint(1, 3)]}] ' 150 else: 151 log_info = 'add href in article flag [FALSE]' 152 # link location in the end of article 153 table_flag = random.randint(0, 0) 154 # link in table 155 if table_flag == 0: 156 body_of_html += '<style>td {height: 50px;width: 200px;text-align: center;vertical-align: middle;} ' \ 157 'table {margin: auto;}</style>' \ 158 '<table border="1"><tr><th>index</th><th>link</th><th>end</th></tr>' 159 num_link = random.randint(1, 5) 160 link_choose = [link_dict[random.randint(1, 3)] for _ in range(num_link)] 161 # random num of link 162 for link_add in link_choose: 163 if table_flag == 0: 164 body_of_html += f'<tr data_id="{num_link - 1}"><td>click link</td><td><a href="{link_add}">' \ 165 f'here is a link</a></td><td>jump</td></tr>' 166 else: 167 body_of_html += f'<p><a href="{link_add}">here is a href</a></p>' 168 if table_flag == 0: 169 body_of_html += '</table>' 170 log_info += 'table flag [TRUE]' 171 if not debug_flag: 172 self.logger.info(log_info + f' end href num {num_link}, list:{link_choose}') 173 return body_of_html 174 175 def ip_info_active(num, name, data_real): 176 """ 177 178 :param num: random ip number 179 :param name: recip name 180 :return:list 181 """ 182 for _ in range(num): 183 none_del = [] 184 for ele in [linecache.getline(os.path.join(PATH_LOG, 'ip_info.log'), 185 random.randint(1, self.files_operation('ip_info.log', 'r') - 1) 186 ).rstrip("\n").split(':') for _ in range(4)]: 187 if ele != ['']: 188 none_del.append(ele) 189 if len(none_del) < 2: 190 ip_info_active(1, name) 191 else: 192 if not debug_flag: 193 self.logger.info(f'info:{none_del}') 194 self.msg[ 195 'Received'] = f'from {none_del[0][1]}({random.choice([f"{none_del[0][1]}", "unknown"])} [{none_del[0][0]}]) ' \ 196 f'by {none_del[1][1]} with {random.choice(["SMTP", "ESMTP"])} ' \ 197 f'id {uuid.uuid4().hex} for <{name}>; {data_real}' 198 name = random.choice(list(sender_dict.values())) 199 return num 200 201 def time_map(): 202 start_time = datetime.date(2020, 1, 1) 203 end_time = datetime.date(2020, 12, 31) 204 random_date = start_time + datetime.timedelta(days=random.randint(0, (end_time - start_time).days)) 205 start_min = datetime.time(0, 0, 0) 206 end_min = datetime.time(23, 59, 59) 207 208 random_min = datetime.time( 209 random.randint(start_min.hour, end_min.hour), 210 random.randint(start_min.minute, end_min.minute), 211 random.randint(start_min.second, end_min.second) 212 ) 213 random_datetime = datetime.datetime.combine(random_date, random_min) 214 timestamp = random_datetime.timestamp() 215 dt = datetime.datetime.fromtimestamp(timestamp) 216 format_time = dt.strftime('%a, %d %b %Y %H:%M:%S +0800') 217 return format_time 218 219 # email info 220 save_name = f'2020_{create_num - 1}.{eml_format[random.randint(1, 1)]}' 221 self.msg['Message-ID'] = make_msgid(domain=sender_name.split('@')[-1]) 222 eml_data = time_map() 223 # random read ip\domain form file 224 received_num = ip_info_active(random.randint(1, 1), name=sender_name, data_real=eml_data) 225 self.msg['From'] = sender_name 226 self.msg['To'] = ','.join(recip_name) 227 # main email 228 read_message = random.choice([file for file in os.listdir(PATH_TXT) if file.endswith('.txt')]) 229 self.msg['Subject'] = read_message.split('.')[0] if not read_message.split('.')[0].isdigit() \ 230 else self.fake.sentence(nb_words=10, variable_nb_words=True) 231 info_of_recip = str(recip_name).split('[')[-1].split(']')[0].split(',') 232 body_info = self.files_operation(read_message, 'r', encoding='utf-8') 233 body_html = f'<html><body><div id="info">"{body_info}"</div>' 234 235 cc_flag = random.randint(0, 2) 236 cc_name = ','.join(cc_list_collect(recip_name)) 237 if cc_flag == 0: 238 self.msg['Cc'] = cc_name 239 if not debug_flag: 240 self.logger.info(f'cc list:{cc_list_collect(recip_name)}') 241 242 if "p" in flag: 243 self.post_info(sender_name, recip_name, cc_name, attachment, body_info, debug_flag=debug_flag) 244 else: 245 if link_flag == 0: 246 body_html = add_link(body_html) 247 if picture_flag == 0: 248 pic_link_flag = random.randint(0, 5) 249 if pic_link_flag == 0: 250 # picture only 251 flag_info = True 252 body_html += f'<div><p>Here is a img:</p><a href="{link_dict[random.randint(1, 3)]}">' \ 253 f'<img src="cid:image1"></a></div>' 254 else: 255 # picture have a link to jump web 256 flag_info = False 257 body_html += f'<div><p>Here is a img:</p><img src="cid:image1"></div>' 258 259 picture_add = self.files_operation( 260 random.choice([file for file in os.listdir(PATH_TXT) if file.endswith('.PNG')]), 261 'rb') 262 img = MIMEImage(picture_add) 263 img.add_header('Content-ID', '<image1>') 264 self.msg.attach(img) 265 self.logger.info(f'picture_status:[TRUE] picture link flag: {flag_info}') 266 else: 267 self.logger.info('picture_status:[FALSE]') 268 body_html += '</body></html>' 269 body = MIMEText(body_html.encode('utf-8'), 'html', 'utf-8') 270 271 if 'fox' in save_name: 272 body.add_header('Content-Disposition', 'inline') 273 body.add_header('Content-Type', 'text/html; charset=utf-8') 274 self.msg.attach(body) 275 276 self.logger.info(f'Received number[{received_num}], sender list:{sender_name}') 277 self.logger.info(f'recipe list:{info_of_recip}') 278 279 # set email time 280 # send_time = formatdate(localtime=True) 281 self.msg['Date'] = eml_data 282 self.logger.info(f'email body from file:{read_message} ' 283 f' the number of recip:{len(info_of_recip)} send time:{eml_data}') 284 285 # add attachment 286 if attachment == 0: 287 # num = 1 and any other 288 if att_num == 1: 289 file_name = [random.choice([file for file in os.listdir(PATH_ATTACHMENT)])] 290 else: 291 file_name = random.sample([file for file in os.listdir(PATH_ATTACHMENT)], att_num) 292 293 for att_ele in file_name: 294 att = self.files_operation(att_ele, 'rb') 295 attachment = MIMEApplication(att, name=att_ele) 296 attachment['Content-Disposition'] = f'attachment; filename="{att_ele}"' 297 # attachment.add_header('connect-disposition', 'attachment', filename=att_filename) 298 self.msg.attach(attachment) 299 self.logger.info(f"attachment_flag:[TRUE] push attachment num {att_num} Success!") 300 self.logger.info(f'attachments list:{file_name}') 301 else: 302 self.logger.info(f"push attachment not this time! attachment_flag:[FALSE]") 303 304 # save email 305 self.files_operation(save_name, 'wb', msg_save_flag=True) 306 self.logger.info(f'eml file save as {save_name} in {PATH_SAVE}') 307 os.chmod(os.path.join(PATH_SAVE, save_name), 0o600) 308 309 # random create msg/pst 310 flag_change_type = random.randint(1, 1) 311 if flag_change_type == 0: 312 os.system(PATH_TOOL + ' ' + 'to-msg' + ' ' + os.path.join(PATH_SAVE, save_name) + ' ' + PATH_MSG) 313 self.logger.info('change eml -> msg') 314 315 # IO data to fill the files specify the size 316 def io_size(self, file_name, file_size): 317 """ 318 :param file_name: file name which want change size 319 :param file_size: file size you need, 'int' best 320 :return: 321 """ 322 while os.path.getsize(file_name) < int(file_size): 323 read_eml_info = self.files_operation(file_name, 'r') 324 eml_size_before = len(read_eml_info) 325 if eml_size_before >= file_size: 326 break 327 else: 328 # additional_size = file_size - eml_size_before 329 # additional_content = ''.join(self.files_operation( 330 # random.choice([file for file in os.listdir(PATH_TXT)]), 'r', encoding='utf-8')) 331 additional_content = ''.join( 332 self.files_operation(os.path.join(PATH_TXT, '999.txt'), 'r', encoding='utf-8')) 333 read_eml_info += additional_content 334 self.files_operation(file_name, 'wb', msg_save_flag=True) 335 # print(len(read_eml_info)) 336 337 @staticmethod 338 def random_name(): 339 """ 340 random name with string, length 5 - 12 341 :return: str 342 """ 343 name_length = random.randint(5, 12) 344 return ''.join(random.choices((string.ascii_letters + string.digits), k=name_length)) 345 346 # compress files 347 def compress_files(self, file_formats, com_time=1, passwd=''): 348 """ 349 handles file compression 350 :param file_formats: file format , support .rar/.zip/.msg/.pst/.fox/.7z/tgz 351 :param com_time: the number of times that the file was compressed 352 :param passwd: whether encryption is required, True/False 353 """ 354 355 def file_active(obj, file_name, type_files): 356 """ 357 dispose compress files save method 358 :param obj: compress objective 359 :param file_name: filename list 360 :param type_files: compress type 361 """ 362 for name in file_name: 363 if 'tgz' in name or 'zip' in name or 'rar' in name or '7z' in name: 364 path = os.path.join(PATH_COMPRESS, name) 365 elif '.eml' in name: 366 path = os.path.join(PATH_SAVE, name) 367 elif '.msg' in name: 368 path = os.path.join(PATH_MSG, name) 369 else: 370 path = os.path.join(PATH_ATTACHMENT, name) 371 372 if type_files == 'tgz': 373 obj.add(path, arcname=name) 374 elif type_files == 'rar' or type_files == '7z': 375 self.logger.info(f'{path}') 376 obj.writeall(path, arcname=name) 377 elif type_files == 'zip': 378 obj.write(path, arcname=name) 379 380 for file_format in file_formats: 381 for _ in range(com_time): 382 file_names = [] 383 # file_list = [file for file in os.listdir(PATH_MSG)] + [file for file in os.listdir(PATH_SAVE) 384 # + [file for file in os.listdir(PATH_ATTACHMENT)]] 385 file_list = [file for file in os.listdir(PATH_SAVE)] 386 if _ >= 1: 387 file_names.append([f'test_{_ - 1}.{file_format}']) 388 file_names[0].append(random.choice(file_list)) 389 else: 390 # file_names.append(random.sample(file_list, random.randint(1, len(file_list)))) 391 file_names.append(random.sample(file_list, random.randint(1, 10))) 392 operate = 'w' 393 if file_format == 'zip': 394 method = zipfile.ZipFile 395 elif file_format == 'rar' or file_format == '7z': 396 method = py7zr.SevenZipFile 397 # pass 398 elif file_format == 'tgz': 399 method = tarfile.open 400 operate += ':gz' 401 else: 402 raise TypeError('file format error!') 403 404 with method(os.path.join(PATH_COMPRESS, f'test_{_}.{file_format}'), operate) as active_com: 405 file_active(active_com, file_names[0], file_format) 406 if _ < 1: 407 self.logger.info(f"Success create {file_format} file. File number in doc: {len(file_names[0])}" 408 + "\t" + f"File in compress:{file_names[0]}") 409 # if passwd: 410 # active_com.setpassword(passwd) 411 412 def create_user_sender(self, num): 413 """ 414 create user for send and recipe 415 :param num: the number of user you need 416 :return: user dict 417 """ 418 419 def init_name(number, dict_name): 420 for num_user in range(1, int(number / 3)): 421 name = self.random_name() 422 full_email = name + '@' + email_domain[random.randint(0, len(email_domain) - 1)] 423 dict_name[name] = full_email 424 425 # create user_dict 426 init_name(num, recip_dict) 427 # create sender_dict, half past of user_dict 428 for index, (key, value) in enumerate(recip_dict.items()): 429 if index < len(recip_dict) / 2: 430 sender_dict[key] = value 431 else: 432 break 433 init_name(num / 2, sender_dict) 434 self.logger.info(f'number of sender dict: {len(sender_dict)} number of recipe dict: {len(recip_dict)}') 435 436 def post_data(self, sender_name, recip_name, cc_name, attachment, body_info): 437 """ 438 send json data to ES 439 :param attachment: attachment num 440 :param sender_name: sender list 441 :param recip_name: recip list 442 :param cc_name: cc list 443 :param body_info: html body 444 :return: 445 """ 446 447 import json 448 import hashlib 449 450 def encrypted_random(num=1): 451 string_enc = "".join(random.choices((string.ascii_letters + string.digits), k=random.randint(0, 10))) 452 if num == 1: 453 encrypted = hashlib.md5() 454 encrypted.update(string_enc.encode('utf8')) 455 elif num == 2: 456 encrypted = hashlib.sha1(string_enc.encode('utf8')) 457 elif num == 3: 458 encrypted = hashlib.sha256(string_enc.encode('utf8')) 459 else: 460 raise TypeError('Type error!') 461 return encrypted.hexdigest() 462 463 def random_num(num): 464 a = 999999999999999999 465 return random.randint(1, int(str(a)[:num])) 466 467 def str_random(num=22): 468 return "".join(random.choices((string.ascii_letters + string.digits), k=random.randint(0, num))) 469 470 def choice_list(tp): 471 if tp == 1: 472 info_list = ["中文"] 473 elif tp == 2: 474 info_list = ['rar', 'tgz', 'zip', '7z', "pdf_f", "doc_f", "xlsx_f"] 475 else: 476 raise 477 return random.choice(info_list) 478 479 def time_map(): 480 start_time = datetime.date(2017, 1, 1) 481 end_time = datetime.date(2023, 6, 1) 482 random_date = start_time + datetime.timedelta(days=random.randint(0, (end_time - start_time).days)) 483 start_min = datetime.time(0, 0, 0) 484 end_min = datetime.time(23, 59, 59) 485 random_min = datetime.time( 486 random.randint(start_min.hour, end_min.hour), 487 random.randint(start_min.minute, end_min.minute), 488 random.randint(start_min.second, end_min.second) 489 ) 490 random_datetime = datetime.datetime.combine(random_date, random_min) 491 timestamp = random_datetime.timestamp() 492 return int(timestamp) 493 494 random_id = random_num(16) 495 task_id = random_num(16) 496 attachment_id = random_num(16) 497 attachment_md5 = encrypted_random() 498 att_info = attachment_info_num(random.randint(1, 5)) 499 url_info = link_dict[random.randint(1, 4)] 500 end_with = random.choice(type_list) 501 eml_domain = email_domain[random.randint(0, 30)] 502 503 json_info = {} 504 505 json_data = json.dumps(json_info) 506 return json_data 507 508 def post_info(self, sender_name, recip_name, cc_name, attachment, body_info, save_xlsx=True, read_from_xlsx=True, 509 debug_flag=False): 510 import requests 511 512 def xlsx_file(num_c): 513 excel_work = openpyxl.Workbook() 514 wk_sheet = excel_work.active 515 tqdm_time = 1 516 for _ in range(int(num_c)): 517 wk_sheet[f'A{_ + 1}'] = str(json_data) 518 with tqdm.tqdm(total=num_c, desc='progress', unit='num', colour='blue') as pbar: 519 pbar.update(tqdm_time) 520 tqdm_time += 1 521 wk_sheet.title = 'json' 522 excel_work.save(os.path.join(r'PATH_SAVE', 'json.xlsx')) 523 524 def txt_info(num_w, info): 525 for _ in range(num_w): 526 f = open('E:\data\json.txt', 'w') 527 f.writelines(info) 528 f.close() 529 530 def post_info_active(data_info): 531 for _ in range(10): 532 res = requests.post('http:url', data=data_info, headers=headers, 533 timeout=50) 534 ela_time = res.elapsed.total_seconds() 535 print(str(res) + str(ela_time)) 536 if '200' not in str(res): 537 raise 538 539 headers = {'Content-Type': 'application/json'} 540 json_data = self.post_data(sender_name, recip_name, cc_name, attachment, body_info) 541 542 if not read_from_xlsx: 543 post_info_active(json_data) 544 if not save_xlsx: 545 open_time = datetime.datetime.now() 546 workbook = openpyxl.load_workbook(r'D:\pycharm\project\py\xlsx_file\json.xlsx') 547 sheet = workbook.active 548 end_time_read = datetime.datetime.now() 549 line = sheet.max_row 550 print(str(line) + ' ' + str(end_time_read - open_time)) 551 for info_json in range(line): 552 cell = sheet[f'A{info_json + 500000}'].value 553 print(cell) 554 post_info_active(cell) 555 else: 556 xlsx_file(1000000) 557 # txt_info(100, str(json_data)) 558 559 # processing logic 560 def generate_process(self, num_eml, debug_create_flag, post_request=False): 561 """ 562 main process 563 """ 564 logging.info(f'create email number : {num_eml}') 565 # create user/sender dict 566 create_start_time = datetime.datetime.now() 567 self.create_user_sender(500000) 568 print('create user dict SUCCESS!') 569 success_create_dict_time = datetime.datetime.now() 570 if not debug_create_flag: 571 self.logger.info(f'start create user time {create_start_time}, finish time {success_create_dict_time}, ' 572 f'spend {success_create_dict_time - create_start_time}') 573 574 def create_active(min_trunk_num, max_trunk_num, num_progress, debug_flag): 575 """ 576 email create active for threading 577 :return: None 578 """ 579 tqdm_time = 1 580 # for trunk_times in range(1, len(num_eml/num_process)+1): 581 while min_trunk_num <= max_trunk_num: 582 # current progress 583 if not debug_flag: 584 with tqdm.tqdm(total=num_progress, desc='progress', unit='num', colour='blue') as pbar: 585 pbar.update(tqdm_time) 586 tqdm_time += 1 587 self.logger.info('-----------------------------------------------') 588 self.logger.info(f'The current number of cycles : {min_trunk_num}') 589 # self.logger.info(f'add data in log, exegesis when running') 590 self.msg = MIMEMultipart() 591 # random sender 592 sender_info = sender_dict[random.choice(list(sender_dict.keys()))] 593 recip_info = [recip_dict[info] for info in 594 random.choices(list(recip_dict.keys()), k=random.randint(1, 20))] 595 # reset body if sender = user 596 if sender_info == recip_info: 597 min_trunk_num -= 1 598 continue 599 min_trunk_num += 1 600 # create email, random attachment 601 if not post_request: 602 post_flag = 'close' 603 else: 604 post_flag = 'open' 605 self.create_emails(recip_info, sender_info, min_trunk_num, attachment=random.randint(0, 0), 606 att_num=random.randint(14, 14), picture_flag=random.randint(0, 3), 607 link_flag=random.randint(0, 3), debug_flag=debug_flag, flag=post_flag) 608 return None 609 610 start_time = datetime.datetime.now() 611 612 create_active(1, num_eml, num_eml, debug_flag=debug_create_flag) 613 end_time = datetime.datetime.now() 614 if not debug_create_flag: 615 self.logger.info(f'process start time {start_time}, ' 616 f'process stop time {end_time}, spend {end_time - start_time}') 617 618 def mod_choose(self, debug_create_flag=False, is_post=False): 619 """ 620 mod choose (delete no effect, just change main objective) 621 :param debug_create_flag: open it that you can debug the demo 622 :param is_post: the way of running, post or save eml 623 """ 624 if debug_create_flag: 625 operate_for_user = '0' 626 else: 627 operate_for_user = input( 628 "choose the sys type(0--create email 1--create compress 2--change file size[coding...]):") 629 630 if operate_for_user == '0': 631 if debug_create_flag: 632 num_eml = 1 633 else: 634 num_eml = int(input("input the number that you want create: ")) 635 self.generate_process(num_eml, debug_create_flag=debug_create_flag, post_request=is_post) 636 637 elif operate_for_user == '1': 638 type_choose = input('choose type(0--all 1--rar 2--tgz 3--zip 4--7z):') 639 com_time = int(input("Warning: compress files must have at least one file!" + "\n" 640 + "enter the number of time you want to compress the file (int): ")) 641 if type_choose == '0': 642 type_active = type_list 643 else: 644 type_active = [type_list[int(type_choose) - 1]] 645 # create compress files after email create 646 compress_start_time = datetime.datetime.now() 647 self.compress_files(type_active, com_time=com_time) 648 649 compress_complete_time = datetime.datetime.now() 650 self.logger.info(f'compress time {compress_start_time}, complete time {compress_complete_time}, ' 651 f'spend {compress_complete_time - compress_start_time}') 652 653 elif operate_for_user == '2': 654 file_size = input('input size to change(MB):') 655 self.io_size(os.path.join(PATH_SAVE, random.choice([file for file in os.listdir(PATH_SAVE)])), 656 int(file_size) * 1024 * 1024) 657 658 659 Domain().mod_choose(debug_create_flag=False, is_post=False)
标签:info,name,python,eml,self,random,压缩文件,num,file From: https://www.cnblogs.com/TOvOT/p/17464077.html