Modules

Birthday Reminder System

Core Modules

配置管理模块

class src.core.config.SMTPConfig(host: str, port: int, username: str, password: str, use_tls: bool = True, default_receive_email: str | None = None, default_template_file: str = 'birthday.html', default_reminder_days: int = 0)[source]

Bases: object

SMTP服务器配置

host: str
port: int
username: str
password: str
use_tls: bool = True
default_receive_email: str | None = None
default_template_file: str = 'birthday.html'
default_reminder_days: int = 0
__init__(host: str, port: int, username: str, password: str, use_tls: bool = True, default_receive_email: str | None = None, default_template_file: str = 'birthday.html', default_reminder_days: int = 0) None
class src.core.config.ServerChanConfig(default_sckey: str | None = None, default_reminder_days: int = 0)[source]

Bases: object

default_sckey: str | None = None
default_reminder_days: int = 0
__init__(default_sckey: str | None = None, default_reminder_days: int = 0) None
class src.core.config.Recipient(name: str, email: str | None = None, solar_birthday: str | None = None, lunar_birthday: str | None = None, reminder_days: int | None = None, template_file: str | None = None)[source]

Bases: object

收件人信息

name: str
email: str | None = None
solar_birthday: str | None = None
lunar_birthday: str | None = None
reminder_days: int | None = None
template_file: str | None = None
__post_init__()[source]

验证至少有一个生日日期

__init__(name: str, email: str | None = None, solar_birthday: str | None = None, lunar_birthday: str | None = None, reminder_days: int | None = None, template_file: str | None = None) None
class src.core.config.Config(smtp_config: SMTPConfig | None, serverchan_config: ServerChanConfig | None, recipients: List[Recipient], notification_types: List[str])[source]

Bases: object

应用配置

smtp_config: SMTPConfig | None
serverchan_config: ServerChanConfig | None
recipients: List[Recipient]
notification_types: List[str]
classmethod from_yaml(config_path: str) Config[source]

从YAML文件加载配置

__init__(smtp_config: SMTPConfig | None, serverchan_config: ServerChanConfig | None, recipients: List[Recipient], notification_types: List[str]) None

配置管理器 - 简单实用的配置管理

class src.core.config_manager.ConfigManager(config_path: str | None = None)[source]

Bases: object

配置管理器 - 只做必要的配置管理

__init__(config_path: str | None = None)[source]
property config: Config

获取配置,如果未加载则自动加载

load_config() Config[source]

加载配置文件

get_templates_dir() str[source]

获取模板目录路径

validate_config() bool[source]

验证配置的有效性

生日检查模块

class src.core.checker.BirthdayChecker[source]

Bases: object

check_birthdays(recipients: List[Recipient]) List[Tuple[Recipient, bool, Dict]][source]

检查所有人的生日

Parameters:

recipients – 收件人列表

Returns:

返回收件人、是否生日和额外信息的元组列表

Return type:

List[Tuple[Recipient, bool, Dict]]

通知发送器工厂 - 简单实用的对象创建

class src.core.notification_factory.NotificationFactory(templates_dir: str)[source]

Bases: object

通知发送器工厂 - 只做必要的对象创建

__init__(templates_dir: str)[source]
create_senders(config: Config) List[NotificationBase][source]

根据配置创建通知发送器列表

Notification Modules

class src.notification.notification_base.NotificationBase[source]

Bases: ABC

abstract render_content(name: str, template_file: str, extra_info: Dict) str[source]
abstract async send(recipient: Recipient, content: str, days_until: int, age: int)[source]
src.notification.sender_email.retry_on_failure(max_retries=3, delay=1, backoff=2)[source]

重试装饰器 - 支持指数退避

class src.notification.sender_email.EmailSender(smtp_config: SMTPConfig, templates_dir: str)[source]

Bases: NotificationBase

__init__(smtp_config: SMTPConfig, templates_dir: str)[source]
render_content(name: str, template_file: str, extra_info: Dict) str[source]
async send(recipient: Recipient, content: str, days_until: int, age: int)[source]
static preview_email(template: str = 'templates/birthday.html', web_open: bool = True)[source]

只渲染birthday.html模板并直接预览,无自定义外壳

class src.notification.sender_serverchan.ServerChanSender(sckey: str)[source]

Bases: NotificationBase

__init__(sckey: str)[source]
render_content(name: str, template_file: str, extra_info: Dict) str[source]
async send(recipient: Recipient, content: str, days_until: int, age: int)[source]