Some checks failed
CD Pipeline / deploy (push) Failing after 59s
- 建立 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>
183 lines
5.6 KiB
Python
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)
|