# NousResearch/hermes-agent · Adding missing Date header to outbound emails

## Open now

- Nothing open on GitHub.

Multiple fixes and a bug report addressing the absence of a required Date header in outbound emails, which caused messages to be bounced by mail filters. Several parallel or iterative PRs target different code paths where the header was missing.

## TL;DR

- 5 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 2 merged PR(s), 2 PR(s) closed without merging.
- A fix was merged to main in PR #16568. Verify it addresses your case.
- **Recommended:** read PR #16568 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `resolved` · deciding PR(s): `pr-16568`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.40`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #15160: \[Bug\]: Outbound Hermes emails missing Date header — bounced by mail filter

## Prior & competing PRs

- **#16568: fix(email): add required Date header to outbound mail (salvage #15164)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `gateway/platforms/email.py`, `scripts/release.py`, `tests/gateway/test_email.py`, `tools/send_message_tool.py`
  - fix hunks:
  - `gateway/platforms/email.py`

    ```diff
    @@ -28,6 +28,7 @@
     from email.mime.multipart import MIMEMultipart
     from email.mime.text import MIMEText
     from email.mime.base import MIMEBase
    +from email.utils import formatdate
     from email import encoders
     from pathlib import Path
     from typing import Any, Dict, List, Optional
    ```

    ```diff
    @@ -504,6 +505,7 @@ def _send_email(
                 msg["In-Reply-To"] = original_msg_id
                 msg["References"] = original_msg_id
     
    +        msg["Date"] = formatdate(localtime=True)
             msg_id = f"<hermes-{uuid.uuid4().hex[:12]}@{self._address.split('@')[1]}>"
             msg["Message-ID"] = msg_id
     
    ```

    ```diff
    @@ -586,6 +588,7 @@ def _send_email_with_attachment(
                 msg["In-Reply-To"] = original_msg_id
                 msg["References"] = original_msg_id
     
    +        msg["Date"] = formatdate(localtime=True)
             msg_id = f"<hermes-{uuid.uuid4().hex[:12]}@{self._address.split('@')[1]}>"
             msg["Message-ID"] = msg_id
     
    ```
  - `scripts/release.py`

    ```diff
    @@ -53,6 +53,7 @@
         "[redacted:email]": "say8hi",
         "[redacted:email]": "web3blind",
         "[redacted:email]": "alexg0bot",
    +    "[redacted:email]": "scheidti",
         "[redacted:email]": "benjaminsehl",
         "[redacted:email]": "Nerijusas",
         "[redacted:email]": "Ito-69",
    ```
  - `tests/gateway/test_email.py`

    ```diff
    @@ -488,6 +488,7 @@ def test_reply_uses_re_prefix(self):
                 self.assertEqual(send_call["Subject"], "Re: Project question")
                 self.assertEqual(send_call["In-Reply-To"], "<[redacted:email]>")
                 self.assertEqual(send_call["References"], "<[redacted:email]>")
    +            self.assertIn("Date", send_call)
     
         def test_reply_does_not_double_re(self):
             """If subject already has Re:, don't add another."""
    ```

    ```diff
    @@ -519,6 +520,7 @@ def test_no_thread_context_uses_default_subject(self):
     
                 send_call = mock_server.send_message.call_args[0][0]
                 self.assertEqual(send_call["Subject"], "Re: Hermes Agent")
    +            self.assertIn("Date", send_call)
     
     
     class TestSendMethods(unittest.TestCase):
    ```

    ```diff
    @@ -889,6 +891,11 @@ def test_send_email_tool_success(self):
                 self.assertEqual(result["platform"], "email")
                 _, kwargs = mock_server.starttls.call_args
                 self.assertIsInstance(kwargs["context"], ssl.SSLContext)
    +            send_call = mock_server.send_message.call_args[0][0]
    +            self.assertEqual(send_call["Subject"], "Hermes Agent")
    +            self.assertIn("Date", send_call)
    +            self.assertEqual(send_call["To"], "[redacted:email]")
    +            self.assertEqual(send_call["From"], "[redacted:email]")
     
         @patch.dict(os.environ, {
             "EMAIL_ADDRESS": "[redacted:email]",
    ```
  - `tools/send_message_tool.py`

    ```diff
    @@ -1075,6 +1075,7 @@ async def _send_email(extra, chat_id, message):
         """Send via SMTP (one-shot, no persistent connection needed)."""
         import smtplib
         from email.mime.text import MIMEText
    +    from email.utils import formatdate
     
         address = extra.get("address") or os.getenv("EMAIL_ADDRESS", "")
         password = [redacted:secret-assignment]"EMAIL_PASSWORD", "")
    ```

    ```diff
    @@ -1092,6 +1093,7 @@ async def _send_email(extra, chat_id, message):
             msg["From"] = address
             msg["To"] = chat_id
             msg["Subject"] = "Hermes Agent"
    +        msg["Date"] = formatdate(localtime=True)
     
             server = smtplib.SMTP(smtp_host, smtp_port)
             server.starttls(context=ssl.create_default_context())
    ```
- **#19646: fix(cli,email): quoted-relative file-drop paths + Date header on tool email path**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `cli.py`, `tools/send_message_tool.py`
  - fix hunks:
  - `cli.py`

    ```diff
    @@ -1505,6 +1505,10 @@ def _detect_file_drop(user_input: str) -> "dict | None":
             or stripped.startswith('"~')
             or stripped.startswith("'/")
             or stripped.startswith("'~")
    +        or stripped.startswith('"./')
    +        or stripped.startswith('"../')
    +        or stripped.startswith("'./")
    +        or stripped.startswith("'../")
             or (len(stripped) >= 4 and stripped[0] in ("'", '"') and stripped[2] == ":" and stripped[3] in ("\\", "/") and stripped[1].isalpha())
         )
         if not starts_like_path:
    ```
  - `tools/send_message_tool.py`

    ```diff
    @@ -10,9 +10,10 @@
     import logging
     import os
     import re
    -from typing import Dict, Optional
     import ssl
     import time
    +from email.utils import formatdate
    +from typing import Dict, Optional
     
     from agent.redact import redact_sensitive_text
     
    ```
- **#15164: fix(email): add required Date header to outbound mail**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `#16568`, `#15160`
- **#15230: fix(email): add Date header to send_message_tool._send_email (closes #15160)**. closed without merge
  - maintainer direction: category `superseded_by_pr`; implication `superseded`; refs `#16568`, `#15160`, `#15164`

## Fix status

- Merged to main in PR #16568 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-05-04`.
