This commit is contained in:
2026-06-12 17:19:26 +08:00
parent a3ebb28ce0
commit 8d2e18c5a4
20 changed files with 3011 additions and 411 deletions
+168
View File
@@ -0,0 +1,168 @@
#!/usr/bin/env python3
"""
Email sender for user credentials
Sends username and password to all users in user_data.csv
"""
import csv
import smtplib
import time
import os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from datetime import datetime
# ============ CONFIGURATION ============
# TODO: Fill in your NetEase email credentials before running
SENDER_EMAIL = "sofomoupc@163.com" # Your NetEase email address
SMTP_PASSWORD = "FERFPaJFJ89ckKw5" # SMTP authorization code (NOT login password)
SMTP_SERVER = "smtp.163.com" # Use smtp.126.com for @126.com, smtp.yeah.net for @yeah.net
SMTP_PORT = 465 # SSL port
# Email settings
EMAIL_SUBJECT = "“海察”软件下载网址用户名、密码"
# Use absolute path to CSV file
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
CSV_FILE = os.path.join(SCRIPT_DIR, "user_data.csv")
# Delay between emails (seconds) to avoid being flagged as spam
DELAY_BETWEEN_EMAILS = 2
# =======================================
def create_email_body(username, password):
"""Create email body with user credentials"""
return f"""用户名:{username}
密码:{password}"""
def send_email(sender, password, recipient, subject, body):
"""Send email via NetEase SMTP server"""
try:
# Create message
msg = MIMEMultipart()
msg['From'] = Header(sender)
msg['To'] = Header(recipient)
msg['Subject'] = Header(subject, 'utf-8')
# Attach body
msg.attach(MIMEText(body, 'plain', 'utf-8'))
# Connect to SMTP server with SSL
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(sender, password)
# Send email
server.sendmail(sender, recipient, msg.as_string())
server.quit()
return True, None
except Exception as e:
return False, str(e)
def read_users_from_csv(filename):
"""Read user data from CSV file"""
users = []
try:
with open(filename, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
users.append({
'username': row['username'],
'passwd': row['passwd'],
'email': row['email']
})
return users
except Exception as e:
print(f"Error reading CSV file: {e}")
return None
def main():
"""Main function to send emails to all users"""
print("=" * 60)
print("User Credentials Email Sender")
print("=" * 60)
# Validate configuration
if SENDER_EMAIL == "your_email@163.com" or SMTP_PASSWORD == "your_smtp_auth_code":
print("\n❌ ERROR: Please configure your email credentials first!")
print("Edit the CONFIGURATION section at the top of this script:")
print(" - SENDER_EMAIL: Your NetEase email address")
print(" - SMTP_PASSWORD: Your SMTP authorization code")
print(" - SMTP_SERVER: smtp.163.com (or smtp.126.com, smtp.yeah.net)")
return
# Read users from CSV
print(f"\n📂 Reading users from {CSV_FILE}...")
users = read_users_from_csv(CSV_FILE)
if not users:
print("❌ Failed to read users from CSV file")
return
print(f"✓ Found {len(users)} users")
# Confirm before sending
print(f"\n📧 Ready to send {len(users)} emails")
print(f" From: {SENDER_EMAIL}")
print(f" Subject: {EMAIL_SUBJECT}")
response = input("\nProceed? (yes/no): ")
if response.lower() not in ['yes', 'y']:
print("Cancelled.")
return
# Send emails
print(f"\n🚀 Sending emails...\n")
success_count = 0
failed_users = []
for i, user in enumerate(users, 1):
username = user['username']
passwd = user['passwd']
email = user['email']
print(f"[{i}/{len(users)}] Sending to {username} ({email})...", end=" ")
# Create email body
body = create_email_body(username, passwd)
# Send email
success, error = send_email(SENDER_EMAIL, SMTP_PASSWORD, email, EMAIL_SUBJECT, body)
if success:
print("")
success_count += 1
else:
print(f"✗ Failed: {error}")
failed_users.append({'user': username, 'email': email, 'error': error})
# Delay between emails
if i < len(users):
time.sleep(DELAY_BETWEEN_EMAILS)
# Summary
print("\n" + "=" * 60)
print(f"✓ Successfully sent: {success_count}/{len(users)}")
if failed_users:
print(f"✗ Failed: {len(failed_users)}")
print("\nFailed users:")
for failed in failed_users:
print(f" - {failed['user']} ({failed['email']}): {failed['error']}")
# Save failed users to log
log_file = f"failed_emails_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log"
with open(log_file, 'w', encoding='utf-8') as f:
for failed in failed_users:
f.write(f"{failed['user']},{failed['email']},{failed['error']}\n")
print(f"\n📝 Failed users saved to: {log_file}")
print("=" * 60)
if __name__ == "__main__":
main()