improve: max occurrence limit

This commit is contained in:
2025-04-23 16:00:31 +02:00
parent 13128063c3
commit 22857040a8
2 changed files with 195 additions and 11 deletions

View File

@@ -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)