Review an AI-drafted work email against the original facts before you send it. This example checks names, quantities, prices, dates, recipients, tone, and wording that could accidentally create a promise.
Content checked 2026.09.21Example code included
Show contents
Who this is forOffice workers who use an AI chat assistant to draft emails and want a repeatable final review before sending.
What you need
Python 3.12
A text editor and terminal
01Why an AI email still needs a final check
An AI chat assistant can turn rough notes into a polished work email, but fluent wording does not prove that the underlying details are correct. A draft can contain the wrong quantity, confuse two dates, address the wrong person, or turn a request into a firm commitment.
The example below is synthetic. The goal is to keep drafting and verification separate: use the AI to improve wording, then compare the result with the source facts yourself before sending.
02Write down the confirmed source facts first
Suppose you need to contact a fictional supplier about sample parts. Before asking an AI to draft the email, record the facts that must remain unchanged.
Item
Confirmed source fact
Recipient
Mina Park
Company
Example Parts
Sample quantity
24 units
Unit price
$18.50
Calculated total
$444.00
Requested delivery date
October 7, 2026
Internal review date
October 9, 2026
Commitment status
October 7 is requested, not confirmed
The arithmetic is 24 × $18.50 = $444.00. October 7 is a requested supplier delivery date, while October 9 is the company's internal review date. The notes do not authorize any promise about payment timing, future orders, approval, or guaranteed delivery.
03Ask the AI to draft without filling gaps
A useful prompt should contain the confirmed facts and tell the AI not to invent missing information.
A typical AI answer could read: 'Hello Mina Park, We would like to request 24 sample units from Example Parts at $18.50 per unit, for a total of $444.00. If possible, please arrange delivery by October 7, 2026, as our internal review is scheduled for October 9, 2026. Please let us know whether this delivery date is feasible. Best regards.' This is a reasonable draft, but it still requires verification.
04Check facts, numbers, dates, recipients, tone, and promises
Facts: Compare names, companies, product descriptions, project names, and other factual statements with the original source.
Numbers: Recalculate quantities, prices, totals, percentages, dimensions, or other important values independently.
Dates: Check the date itself and what that date represents. A requested date is not the same as a confirmed date.
Recipients: Confirm the person's name, organization, actual email address, and whether each CC or BCC recipient is necessary.
Tone: Remove language that is unnecessarily demanding, vague, overly familiar, or more certain than the facts justify.
Promises: Search for wording that could create an unauthorized commitment, including guarantee, definitely, confirmed, approved, will pay, will deliver, or future-order promises.
In the synthetic example, the draft correctly preserves 24 units, $18.50, $444.00, October 7, and October 9. It also says 'if possible' and asks whether the requested delivery date is feasible instead of claiming that the date has already been confirmed.
05Use Python for a repeatable first-pass check
The following standard-library script reads draft_email.txt, checks whether the expected synthetic facts appear, recalculates the total, and searches for several risky promise phrases. It writes a report to outputs/email_check_report.txt. It does not modify the original draft and stops if the outputs folder already exists.
python
from pathlib import Path
from decimal import Decimal
import sys
DRAFT_PATH = Path("draft_email.txt")
OUTPUT_DIR = Path("outputs")
REPORT_PATH = OUTPUT_DIR / "email_check_report.txt"
if not DRAFT_PATH.is_file():
sys.exit("Missing input file: draft_email.txt")
if OUTPUT_DIR.exists():
sys.exit("Stop: outputs folder already exists. Remove or rename it manually first.")
recipient = "Mina Park"
company = "Example Parts"
quantity = 24
unit_price = Decimal("18.50")
expected_total = Decimal(quantity) * unit_price
requested_date = "October 7, 2026"
review_date = "October 9, 2026"
required_text = {
"recipient": recipient,
"company": company,
"quantity": "24",
"unit price": "$18.50",
"total": f"${expected_total:.2f}",
"requested delivery date": requested_date,
"internal review date": review_date,
}
risky_phrases = [
"guarantee",
"guaranteed",
"definitely",
"delivery is confirmed",
"we confirm payment",
"we will place future orders",
]
draft = DRAFT_PATH.read_text(encoding="utf-8")
draft_lower = draft.lower()
lines = []
lines.append("AI EMAIL DRAFT CHECK")
lines.append("====================")
lines.append(f"Calculated total: {quantity} x ${unit_price:.2f} = ${expected_total:.2f}")
lines.append("")
lines.append("Required details:")
for label, value in required_text.items():
status = "PASS" if value.lower() in draft_lower else "CHECK"
lines.append(f"{status}: {label} -> {value}")
lines.append("")
lines.append("Risky promise phrases:")
found_risk = False
for phrase in risky_phrases:
if phrase in draft_lower:
found_risk = True
lines.append(f"CHECK: found phrase -> {phrase}")
if not found_risk:
lines.append("PASS: none of the listed phrases were found")
lines.append("")
lines.append("Manual checks still required:")
lines.append("- Verify the actual To, CC, and BCC addresses in the mail client.")
lines.append("- Confirm that October 7 is presented as requested, not guaranteed.")
lines.append("- Confirm tone and context against the original conversation.")
lines.append("- Check for commitments not covered by this phrase list.")
lines.append("- Verify attachments before sending.")
OUTPUT_DIR.mkdir()
REPORT_PATH.write_text("\n".join(lines) + "\n", encoding="utf-8")
print(f"Created: {REPORT_PATH}")
Save the draft as draft_email.txt, save the script as email_check.py, and run python email_check.py. A PASS only means that expected text was found or that the listed risky phrases were not found. It does not mean the email has been approved or is safe to send.
06Common mistakes to look for
The quantity changes from 24 to 25 because another number appeared elsewhere in the conversation.
The unit price is correct but the total is copied or calculated incorrectly.
October 9 is presented as the supplier deadline instead of the internal review date.
A request to check whether October 7 is feasible becomes a statement that delivery is confirmed for October 7.
The AI adds payment timing, approval, future purchase volume, or another commitment that was not in the source notes.
The body names Mina Park correctly, but the To field contains a different contact with a similar name.
Keyword checks have obvious limits. An email might contain '$444.00' in the wrong context, or it might create a commitment using wording that is not included in the risky-phrase list. Automated checking is useful for catching simple discrepancies, but it cannot replace a final human read.
07Run a final checklist before pressing Send
Keep the original notes or records open beside the draft.
Check every name, company, product, quantity, amount, and date.
Recalculate important arithmetic independently.
Confirm what each date means, not only whether the date itself is present.
Read specifically for promises, approvals, guarantees, and commitments.
Check the actual To, CC, BCC, and attachment fields.
Read the final version once from the recipient's perspective.
A practical division of responsibility is to let the AI help with wording while you verify facts and decide what your organization is authorized to promise. Emails involving contracts, legal obligations, confidential information, regulated decisions, safety issues, or substantial financial consequences should follow the organization's formal review and approval process.
The script executed successfully and created outputs/email_check_report.txt.
The corrected email draft contains Mina Park, Example Parts, and both complete dates (October 7, 2026 and October 9, 2026). All seven required-detail checks and the risky-phrase check passed.
No listed risky promise phrase was detected.
The calculated total was exactly 24 x $18.50 = $444.00.
draft_email.txt was byte-for-byte unchanged after execution.
A second run stopped because outputs already existed, so the report was not overwritten.
Local recheck on 2026-09-21 with Python 3.12.14: the corrected example passed; source preservation and overwrite protection also passed.
Verification limits
The script cannot verify actual To, CC, BCC fields, attachments, organizational authority, tone, or commitments expressed with phrases outside its fixed list.
The Python environment emitted an unrelated spreadsheet-runtime warmup warning on stderr; it did not affect the article script or its results.
References
The explanations and examples were written for this site. See the official sources below for the related behavior and concepts.
Turn “automate this” into an executable task description. Attach a synthetic sample with no sensitive data and a hand-checked expected result to complete a request for a script that totals work logs by team.
Check an aggregation function with four rows you can calculate by hand and 12 unit tests. Verify not only normal values but also empty input, zero, decimals, and invalid input.
Check an AI report against its source data, recalculate totals and rates, and use a copyable review prompt to flag unsupported claims and overstated causes before submission.
Treat an AI-generated regex as a draft, not a finished rule. Build a small synthetic test table, compare expected and actual matches, revise the pattern, and save a review report before using it on real data.