Files
ewoooc/tests/test_email_send.py
ogt 1b4f3a7bbe
Some checks failed
CD Pipeline / deploy (push) Failing after 59s
feat: EwoooC 初始化 — 完整專案推版至 Gitea
- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml)
- 部署模式: rsync Python 檔案至 188 → docker restart (volume mount)
- Dockerfile/requirements 變動時自動重建 Docker image
- 部署通知: Telegram (開始/成功/失敗)
- 健康檢查: https://mo.wooo.work/health (最多 5 次重試)
- 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-19 01:21:13 +08:00

183 lines
5.6 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
測試郵件發送功能
直接測試 VendorEmailService 的郵件發送功能
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from database.vendor_manager import VendorDatabaseManager
from database.vendor_models import VendorList, VendorEmail, VendorStockout
from services.vendor_email_service import VendorEmailService
def test_grouped_email():
"""測試按廠商分組發送"""
print("=" * 60)
print("測試 1: 按廠商分組發送郵件")
print("=" * 60)
db = VendorDatabaseManager()
session = db.get_session()
email_service = VendorEmailService()
try:
# 查詢測試廠商 TEST_V001
vendor = session.query(VendorList).filter_by(vendor_code='TEST_V001').first()
if not vendor:
print("❌ 找不到測試廠商 TEST_V001")
return
# 查詢該廠商的郵件
emails = session.query(VendorEmail).filter_by(vendor_id=vendor.id).all()
vendor_emails = [e.email for e in emails if e.is_active]
if not vendor_emails:
print("❌ 廠商沒有郵件地址")
return
# 查詢該廠商的缺貨商品
stockouts = session.query(VendorStockout).filter_by(
vendor_code='TEST_V001',
status='pending'
).all()
if not stockouts:
print("❌ 沒有待發送的缺貨商品")
return
print(f"\n廠商: {vendor.vendor_name} ({vendor.vendor_code})")
print(f"郵件地址: {', '.join(vendor_emails)}")
print(f"缺貨商品數: {len(stockouts)}")
print(f"\n商品清單:")
for stockout in stockouts:
print(f" - {stockout.product_name} ({stockout.product_code})")
# 確認發送
print("\n" + "-" * 60)
response = input("確定要發送測試郵件嗎?(y/n): ")
if response.lower() != 'y':
print("已取消")
return
# 發送郵件
print("\n開始發送...")
result = email_service.send_vendor_grouped_email(
vendor_code=vendor.vendor_code,
vendor_name=vendor.vendor_name,
vendor_emails=vendor_emails,
stockout_items=stockouts,
batch_id='TEST_BATCH_001'
)
if result['success']:
print(f"\n✅ 郵件發送成功!")
print(f" 主旨: {result['subject']}")
print(f" 收件者: {', '.join(result['recipients'])}")
print(f" 商品數: {result['product_count']}")
if result.get('attachment_filename'):
print(f" 附件: {result['attachment_filename']}")
else:
print(f"\n❌ 郵件發送失敗: {result['error']}")
except Exception as e:
print(f"\n❌ 測試失敗: {e}")
import traceback
traceback.print_exc()
finally:
session.close()
def test_single_email():
"""測試按商品單筆發送"""
print("\n\n" + "=" * 60)
print("測試 2: 按商品單筆發送郵件")
print("=" * 60)
db = VendorDatabaseManager()
session = db.get_session()
email_service = VendorEmailService()
try:
# 查詢一個測試缺貨商品
stockout = session.query(VendorStockout).filter_by(
vendor_code='TEST_V002',
status='pending'
).first()
if not stockout:
print("❌ 找不到測試缺貨商品")
return
# 查詢廠商
vendor = session.query(VendorList).filter_by(vendor_code=stockout.vendor_code).first()
if not vendor:
print("❌ 找不到廠商")
return
# 查詢廠商郵件
emails = session.query(VendorEmail).filter_by(vendor_id=vendor.id).all()
vendor_emails = [e.email for e in emails if e.is_active]
if not vendor_emails:
print("❌ 廠商沒有郵件地址")
return
print(f"\n廠商: {vendor.vendor_name} ({vendor.vendor_code})")
print(f"郵件地址: {', '.join(vendor_emails)}")
print(f"商品: {stockout.product_name} ({stockout.product_code})")
# 確認發送
print("\n" + "-" * 60)
response = input("確定要發送測試郵件嗎?(y/n): ")
if response.lower() != 'y':
print("已取消")
return
# 發送郵件
print("\n開始發送...")
result = email_service.send_single_item_email(
vendor_code=vendor.vendor_code,
vendor_name=vendor.vendor_name,
vendor_emails=vendor_emails,
stockout_item=stockout,
batch_id='TEST_BATCH_002'
)
if result['success']:
print(f"\n✅ 郵件發送成功!")
print(f" 主旨: {result['subject']}")
print(f" 收件者: {', '.join(result['recipients'])}")
print(f" 商品: {result['product_name']}")
else:
print(f"\n❌ 郵件發送失敗: {result['error']}")
except Exception as e:
print(f"\n❌ 測試失敗: {e}")
import traceback
traceback.print_exc()
finally:
session.close()
if __name__ == '__main__':
print("\n" + "=" * 60)
print("廠商缺貨郵件發送功能測試")
print("=" * 60)
print("\n⚠️ 注意:此測試會實際發送郵件到 vincentn_chen@chohome.tw")
print(" 請確保 SMTP 設定正確\n")
# 測試 1: 分組發送
test_grouped_email()
# 測試 2: 單筆發送
test_single_email()
print("\n" + "=" * 60)
print("測試完成")
print("=" * 60)