- Inline keyboard: view original / back to summary toggle per message - SMTP config per account for sending replies - Reply button: click, type message, auto-send via SMTP - AI Reply button: generates 3 suggestions via DeepSeek - Simple replies (OK, Got it) send immediately on tap - Substantive replies require confirm before send - Hides AI Reply button when AI determines reply unnecessary - Telegram long polling integrated into main loop for real-time interaction
33 lines
978 B
Python
33 lines
978 B
Python
import smtplib
|
|
from email.mime.text import MIMEText
|
|
from email.mime.multipart import MIMEMultipart
|
|
from src.config import EmailAccount
|
|
from src.retry import retry
|
|
|
|
|
|
@retry()
|
|
def send_reply(account: EmailAccount, to_addr: str, subject: str, body: str):
|
|
if not account.smtp:
|
|
raise RuntimeError(f"账号 {account.username} 未配置 SMTP")
|
|
|
|
s = account.smtp
|
|
if s.use_ssl:
|
|
conn = smtplib.SMTP_SSL(s.server, s.port, timeout=15)
|
|
else:
|
|
conn = smtplib.SMTP(s.server, s.port, timeout=15)
|
|
if s.use_starttls:
|
|
conn.starttls()
|
|
|
|
conn.login(account.username, account.password)
|
|
|
|
reply_subject = subject if subject.lower().startswith("re:") else f"Re: {subject}"
|
|
|
|
msg = MIMEMultipart("alternative")
|
|
msg["From"] = account.username
|
|
msg["To"] = to_addr
|
|
msg["Subject"] = reply_subject
|
|
msg.attach(MIMEText(body, "plain", "utf-8"))
|
|
|
|
conn.sendmail(account.username, [to_addr], msg.as_string())
|
|
conn.quit()
|