Using AI at work

Check an AI-drafted work email before sending

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.

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.

ItemConfirmed source fact
RecipientMina Park
CompanyExample Parts
Sample quantity24 units
Unit price$18.50
Calculated total$444.00
Requested delivery dateOctober 7, 2026
Internal review dateOctober 9, 2026
Commitment statusOctober 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, We would like to request 24 sample units 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. 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

  1. Facts: Compare names, companies, product descriptions, project names, and other factual statements with the original source.
  2. Numbers: Recalculate quantities, prices, totals, percentages, dimensions, or other important values independently.
  3. Dates: Check the date itself and what that date represents. A requested date is not the same as a confirmed date.
  4. Recipients: Confirm the person's name, organization, actual email address, and whether each CC or BCC recipient is necessary.
  5. Tone: Remove language that is unnecessarily demanding, vague, overly familiar, or more certain than the facts justify.
  6. 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

  1. Keep the original notes or records open beside the draft.
  2. Check every name, company, product, quantity, amount, and date.
  3. Recalculate important arithmetic independently.
  4. Confirm what each date means, not only whether the date itself is present.
  5. Read specifically for promises, approvals, guarantees, and commitments.
  6. Check the actual To, CC, BCC, and attachment fields.
  7. 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.

Execution and verification record

2026-09-21 · hand-checked example · Python 3.12

  • Checked by hand that 24 × $18.50 = $444.00.
  • Checked that October 7, 2026 is the requested delivery date and October 9, 2026 is the internal review date.
  • Checked that the example draft asks whether October 7 is feasible rather than claiming that it is confirmed.
  • Checked that the script reads draft_email.txt without modifying it.
  • Checked that the only generated file is outputs/email_check_report.txt.
  • Checked that the script stops if the outputs folder already exists.
  • Checked that the script uses only Python 3.12 standard-library modules.
Verification limits
  • The code was reviewed and the small example was worked out by hand; the code was not executed by me.
  • Simple string matching cannot prove that a statement is factually correct.
  • The risky-phrase list cannot detect every possible promise, guarantee, approval, or commitment.
  • The script cannot verify real To, CC, or BCC addresses, attachments, organizational authority, or the surrounding email thread.
  • For legal, contractual, financial, safety-related, confidential, or regulated communication, use the organization's required review process.

Site-wide writing and verification principles

References

The explanations and examples were written for this site. See the official sources below for the related behavior and concepts.