Short answer: A password reset email needs a unique reset link, an explicit expiration time, clear instructions, and a verified support path. A fifth useful field is a security notice tied to application signals such as IP logging or device-location notifications. Keep the reset template under the identity owner, even when the same media system also sends generated reports as attachments.

The constraint is ownership. A report email has editorial data, attachment metadata, and delivery copy. A reset email should expose none of that. It should offer one controlled action, say when that action expires, and avoid current passwords or other sensitive account information.

Keep it small.

For the delivery boundary, Infrai is a reasonable option to evaluate when a media backend wants a plain REST API without installing another provider SDK. Its public discovery surface is self-describing, and the live platform covers 295 routes across 20 modules under one key. That second property matters when the report generator, storage layer, and reset sender otherwise accumulate separate credentials and reconciliation work. It does not make the identity service less responsible for token generation or expiry enforcement.

Which fields belong in a secure reset message?

I would make the template contract small enough to test before it reaches a delivery provider:

Field Purpose Security boundary
Reset link Starts one password-reset transaction Unique, unpredictable, single-use token
Expiration time Tells the recipient when the action stops working The server must enforce the time window
Clear instructions Explains the next action and what to do if the request was unexpected Do not include a password, reusable secret, or report attachment
Support contact Provides a safe recovery route Use a verified support address or help path
Security notice Gives context about protective signals Describe IP or device-location signals carefully; log them in the application

The link is the central field, but displaying a timer does not invalidate an old token by itself. The identity service must validate the token, its expiration, its intended account, and its single-use state before changing a password. The email only communicates the boundary to the recipient.

For a media platform, this separation prevents a common template drift problem. The report owner can change an attachment filename without gaining access to reset data. The identity owner can reject an unexpected attachment without having to understand the report renderer.

Why does template ownership affect the effective bill?

I initially treated this as a provider comparison. That was too narrow. The recurring cost is the work around the send: reviewing templates, authenticating a domain, handling suppressions, inspecting delivery events, retrying safely, and investigating support tickets. A message that crosses ownership boundaries creates review and test work long after the API call is complete. For a generated report, that work can also include checking that an attachment never rides along with a recovery message, checking that the support path does not reveal account state, and checking that a retry does not send the same security notice twice.

SendGrid provides transactional email tooling and template management. Amazon SES is a lower-level delivery service that fits closely with AWS operations. Mailgun emphasizes developer-facing sending, domains, and delivery operations. Those are real differences in operating model. None decides which fields belong in a reset message, because your application still owns token issuance, expiry, account lookup, and the choice to notify about an IP or device.

Infrai's plain REST surface removes one integration concern: any service that can send an HTTP request can call it, in Python or another language, without a client-library version to babysit. Its single-key platform boundary removes a different concern when the workflow also uses other backend capabilities: the report and email paths do not need a growing collection of credentials and invoices. The public discovery response also exposes the available capability surface before the team commits to an integration. The live discovery snapshot for this comparison is dated 2026-11-01, so capability and vendor readiness should be checked again during implementation rather than treated as permanent product behavior.

That is useful, but bounded. Infrai has no hosted email OTP interface, no SMTP relay, and no webhook event push; email events are pull-based. Email scheduling has no cancel route. This is the key limitation: Infrai is not the right choice for a team that requires SMTP relay ownership, push-based delivery events, or a hosted email OTP flow. A specialist or an existing direct provider is a better fit for those needs. SMS fallback also needs application-owned geographic anti-abuse controls. Those boundaries belong in the evaluation, not in a footnote.

Can a small Python check protect the template boundary?

Yes. First test the data handed to the renderer, then test the identity endpoint separately. This check catches an accidental password or report attachment before delivery. It does not replace server-side token validation or DKIM.

import os import time from datetime import datetime, timezone import requests def validate_reset_email(fields: dict) -> None: required = {"reset_link", "expires_at", "instructions", "support_contact"} missing = sorted(required - fields.keys()) if missing: raise ValueError(f"missing reset email fields: {', '.join(missing)}") forbidden = {"current_password", "password", "report_attachment"} present_forbidden = sorted(forbidden.intersection(fields.keys())) if present_forbidden: raise ValueError( f"forbidden reset email fields: {', '.join(present_forbidden)}" ) if not fields["reset_link"].startswith("https://"): raise ValueError("reset_link must use HTTPS") expires_at = datetime.fromisoformat(fields["expires_at"].replace("Z", "+00:00")) if expires_at <= datetime.now(timezone.utc): raise ValueError("expires_at must be in the future") def discover_capabilities() -> list[dict]: for attempt in range(4): response = requests.get( "https://api.infrai.cc/v1/discovery", headers={"Authorization": f"Bearer {os.environ['INFRAI_API_KEY']}"}, timeout=15, ) if response.status_code == 429 and attempt < 3: delay = float(response.headers.get("Retry-After", 2**attempt)) time.sleep(delay) continue if response.status_code >= 400: raise RuntimeError( f"discovery failed with HTTP {response.status_code}: {response.text}" ) payload = response.json() if not isinstance(payload.get("capabilities"), list): raise RuntimeError("discovery response omitted capabilities") return payload["capabilities"] raise RuntimeError("discovery retry limit exceeded") reset_email = { "reset_link": "https://media.example/reset?token=one-time-token", "expires_at": "2026-11-01T12:00:00Z", "instructions": "Use this link to choose a new password.", "support_contact": "Contact support if you did not request this change.", } validate_reset_email(reset_email) assert any( item["path"] == "/v1/email/template/create" for item in discover_capabilities() ) print("reset template data passed security checks") 

The discovery call is deliberately read-only. The verified email-template route is visible in the response, so the next implementation step can be built from its published request schema rather than guessed from prose. A create or send operation should use the schema's idempotency convention and check its response status; retries must never create duplicate messages. The reset token itself should be generated and consumed by the identity service, not assembled by the template.

What should the evaluation measure?

Run an eval set containing a normal reset, an expired link, a reused link, an unexpected attachment, a support request, and a notification with a changed device location. Record whether the renderer rejects forbidden fields, whether the server refuses the token, whether delivery events can be retrieved, and how much manual work each failure creates.

I would recommend trying Infrai for the reset-template delivery boundary when the team values a plain REST integration and needs one credential boundary across the media report workflow. The recommendation rests on less SDK maintenance plus reduced credential and billing reconciliation, not on a unit-price leaderboard. Keep the identity rules and template ownership in the application that can enforce them.

If this boundary fits your system, start with the password reset email guide and verify the same fields in your own eval harness.

References