diff --git a/邮件批量发送脚本.py b/邮件批量发送脚本.py index 3507e1a..4b01ec9 100644 --- a/邮件批量发送脚本.py +++ b/邮件批量发送脚本.py @@ -13,19 +13,22 @@ from datetime import timedelta parser = argparse.ArgumentParser(description="邮件批量发送脚本") parser.add_argument('datasheet') -parser.add_argument('--column', type=str, nargs='?', default='邮箱') +parser.add_argument('--column-address', type=str, nargs='?', default='邮箱') +parser.add_argument('--column-code', type=str, nargs='?', default='客户编号') parser.add_argument('--address', type=str, required=True) parser.add_argument('--password', type=str, required=True) parser.add_argument('--encoding', type=str, nargs='?', default='utf-8') parser.add_argument('--timeout', type=int, nargs='?', default=60) parser.add_argument('--interval', type=int, nargs='?', default=5) parser.add_argument('--rate-limit', type=int, nargs='?', default=8.33) +parser.add_argument('--max-occurrence', type=int, nargs='?', default=0) args = parser.parse_args() date = datetime.now() sent = 0 errors = 0 +warnings = 0 def main(): # 读取收件人列表 @@ -33,8 +36,11 @@ def main(): try: with open(args.datasheet, 'r', encoding=args.encoding) as file: rows = csv.DictReader(file) - recipients = [row[args.column] for row in rows] - print(f'[信息] 已读取联系人信息共 {len(recipients)} 条') + data = list(rows) + + rate = 60 / (args.interval + 3) + limit = len(data) + print(f'[信息] 已读取联系人信息共 {limit} 条') except Exception as e: print(f'[!!!!] 读取数据表失败:{e}') return 1 @@ -93,11 +99,8 @@ def main(): print(f'[!!!!] 读取邮件时发生了错误:{e}') return 5 - rate = 60 / (args.interval + 3) - limit = len(recipients) - print(f'[信息] 当前发送速率 {round(rate, 2)} 封/分钟') - print(f'[信息] 预计使用时间 {timedelta(seconds=rate * limit)}') + print(f'[信息] 预计使用时间 {timedelta(minutes=limit / rate)}') if rate > args.rate_limit: print(f'[警告] 已设置速率限制 {round(args.rate_limit, 2)}') @@ -114,7 +117,25 @@ def main(): global date date = datetime.now() - for recipient in recipients: + current = None + occurrence = 0 + + for row in data: + recipient = row.get(args.column_address) + code = row.get(args.column_code) + + if code == current: + occurrence += 1 + else: + current = code + occurrence = 1 + + if args.max_occurrence > 0 and occurrence > args.max_occurrence: + print(f'[警告] 收件人 {recipient} 所属组织已重复出现 {occurrence} 次') + global warnings + warnings += 1 + continue + try: print(f'[信息] 正在发送:{recipient}') @@ -137,13 +158,12 @@ def main(): global sent sent += 1 - time.sleep(args.interval) except Exception as e: print(f'[!!!!] 发生错误:{e}') return 6 # 等待邮件发送 - locate(driver, EC.invisibility_of_element_located, (By.CSS_SELECTOR, "div.mail-send-progress.bottom-message")) + time.sleep(args.interval) # 检测页面警告 try: alert = driver.find_element(By.CSS_SELECTOR, "div.io-ox-alert.io-ox-alert-error") @@ -155,6 +175,9 @@ def main(): global errors errors += 1 + # 发送失败不计入重复项 + if occurrence > 1: occurrence -= 1 + # 关闭警告 button = locate(alert, EC.element_to_be_clickable, (By.CSS_SELECTOR, "button[data-action='close']")) button.click() @@ -189,6 +212,6 @@ except KeyboardInterrupt: print('[信息] 程序中断') status = 145 -print(f'[信息] 已发送 {sent} 封;发送失败 {errors} 封') +print(f'[信息] 已发送 {sent} 封;发送失败 {errors} 封;跳过重复项 {warnings} 个') print(f'[信息] 总耗时 {str(datetime.now() - date)}') exit(status) diff --git a/邮件编辑器.html b/邮件编辑器.html new file mode 100644 index 0000000..acd3736 --- /dev/null +++ b/邮件编辑器.html @@ -0,0 +1,161 @@ + + + + + + 编辑邮件 + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + \ No newline at end of file