send_reply
Reply to emails by composing and sending responses to specific messages, supporting text and HTML formats with optional quoting of original content.
Instructions
Reply to an email
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient email addresses | |
| subject | Yes | Reply subject (usually with Re:) | |
| body_text | No | Reply body text | |
| body_html | No | Reply body HTML | |
| reply_to_message_id | Yes | Original message ID to reply to | |
| quote_original | No | Quote original message (default: true) |
Implementation Reference
- Implementation of the send_reply tool logic, which handles replying to emails, including optional original message quotation and header management.
def send_reply( client, to: list[str], subject: str, body_text: str | None = None, body_html: str | None = None, original_message: Message | None = None, reply_to_message_id: str | None = None, references: list[str] | None = None, quote_original: bool = True, from_addr: str | None = None, ) -> SendResult: """ 回复邮件 Args: client: SMTP 客户端对象 to: 收件人列表 subject: 主题 (通常会自动添加 Re:) body_text: 回复正文 (纯文本) body_html: 回复正文 (HTML) original_message: 原邮件消息对象 reply_to_message_id: 原邮件的 Message-ID references: 引用链 quote_original: 是否引用原文 from_addr: 发件人地址 Returns: SendResult: 发送结果 """ # 验证参数 if not to: return SendResult(success=False, error="收件人列表不能为空") try: # 获取发件人地址 if not from_addr: if hasattr(client, "config") and hasattr(client.config, "user"): from_addr = client.config.user else: return SendResult(success=False, error="缺少发件人地址") # 构建回复邮件 if original_message: # 从原邮件提取信息构建回复 orig_subject = original_message.get("Subject", "") if not subject.startswith("Re:"): if orig_subject and not orig_subject.startswith("Re:"): subject = f"Re: {orig_subject}" elif orig_subject: subject = orig_subject # 构建回复正文 reply_text = body_text or "" if quote_original: orig_from = original_message.get("From", "") orig_date = original_message.get("Date", "") orig_body = "" if original_message.is_multipart(): for part in original_message.walk(): if part.get_content_type() == "text/plain": try: orig_body = part.get_payload(decode=True).decode( "utf-8", errors="replace" ) except Exception: pass break else: try: orig_body = original_message.get_payload(decode=True).decode( "utf-8", errors="replace" ) except Exception: pass if orig_body: reply_text += ( f"\n\n--- 原始邮件 ---\nFrom: {orig_from}\nDate: {orig_date}\n\n{orig_body}" ) message = build_email_message( sender=from_addr, to=to, subject=subject, body_text=reply_text, body_html=body_html, ) # 设置回复相关头 orig_msg_id = original_message.get("Message-ID", "") if orig_msg_id: message["In-Reply-To"] = orig_msg_id message["References"] = orig_msg_id else: # 没有原邮件,直接构建 if not subject.startswith("Re:"): subject = f"Re: {subject}" message = build_email_message( sender=from_addr, to=to, subject=subject, body_text=body_text, body_html=body_html, ) if reply_to_message_id: message["In-Reply-To"] = reply_to_message_id if references: message["References"] = " ".join(references) # 生成 Message-ID message_id = make_msgid() message["Message-ID"] = message_id # 发送邮件 smtp = _get_smtp_client(client) smtp.send_message(message, from_addr=from_addr, to_addrs=to) return SendResult( success=True, message_id=message_id, ) except smtplib.SMTPException as e: return SendResult(success=False, error=f"SMTP 错误: {str(e)}") except Exception as e: return SendResult(success=False, error=f"回复失败: {str(e)}") - src/mail_mcp/tools/__init__.py:378-412 (registration)Tool definition for 'send_reply' in the MCP tool registry.
name="send_reply", description="Reply to an email", inputSchema={ "type": "object", "properties": { "to": { "type": "array", "items": {"type": "string"}, "description": "Recipient email addresses", }, "subject": { "type": "string", "description": "Reply subject (usually with Re:)", }, "body_text": { "type": "string", "description": "Reply body text", }, "body_html": { "type": "string", "description": "Reply body HTML", }, "reply_to_message_id": { "type": "string", "description": "Original message ID to reply to", }, "quote_original": { "type": "boolean", "description": "Quote original message (default: true)", "default": True, }, }, "required": ["to", "subject", "reply_to_message_id"], }, ), - src/mail_mcp/tools/__init__.py:587-597 (handler)MCP tool handler integration for 'send_reply'.
elif name == "send_reply": result = send_reply( client=smtp_client, to=arguments["to"], subject=arguments["subject"], body_text=arguments.get("body_text"), body_html=arguments.get("body_html"), reply_to_message_id=arguments.get("reply_to_message_id"), quote_original=arguments.get("quote_original", True), ) return [TextContent(type="text", text=str(result))]