PageSourceSearch

https://docs.voiden.md/assets/js/ca672ccc.37920b7a.js

js voiden.md collected 2026-10-04 00:22:43 UTC 8,063 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkvoiden_docs=globalThis.webpackChunkvoiden_docs||[]).push([[6457],{4903:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>m,frontMatter:()=>o,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"developer-tools/voiden-runner/email-report","title":"Send an Email Report","description":"The runner can send a dark-themed HTML report via SMTP after a run completes. The report shows a card for each request executed \u2014 including request/response headers, bodies, and assertion results \u2014 so recipients get a full picture without needing terminal access.","source":"@site/docs/developer-tools/voiden-runner/email-report.md","sourceDirName":"developer-tools/voiden-runner","slug":"/developer-tools/voiden-runner/email-report","permalink":"/docs/developer-tools/voiden-runner/email-report","draft":false,"unlisted":false,"editUrl":"https://github.com/VoidenHQ/docs/tree/main/docs/developer-tools/voiden-runner/email-report.md","tags":[],"version":"current","lastUpdatedAt":1789037684000,"sidebarPosition":8,"frontMatter":{"id":"email-report","title":"Send an Email Report","sidebar_label":"Email Report","sidebar_position":8},"sidebar":"tutorialSidebar","previous":{"title":"Export to CSV","permalink":"/docs/developer-tools/voiden-runner/export-csv"},"next":{"title":"CI/CD Integration","permalink":"/docs/developer-tools/voiden-runner/ci-cd"}}');var t=r(4848),i=r(8453);const o={id:"email-report",title:"Send an Email Report",sidebar_label:"Email Report",sidebar_position:8},d=void 0,a={},l=[{value:"Send to an address",id:"send-to-an-address",level:2},{value:"SMTP configuration",id:"smtp-configuration",level:2},{value:"Configure SMTP via Environment File",id:"configure-smtp-via-environment-file",level:2},{value:"Combine with CSV",id:"combine-with-csv",level:2},{value:"Send from the <code>report</code> command",id:"send-from-the-report-command",level:2}];function c(e){const n={admonition:"admonition",code:"code",h2:"h2",hr:"hr",p:"p",pre:"pre",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"The runner can send a dark-themed HTML report via SMTP after a run completes. The report shows a card for each request executed \u2014 including request/response headers, bodies, and assertion results \u2014 so recipients get a full picture without needing terminal access."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h2,{id:"send-to-an-address",children:"Send to an address"}),"\n",(0,t.jsxs)(n.p,{children:["Use ",(0,t.jsx)(n.code,{children:"--mail-to"})," to specify the recipient directly in the command:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"voiden-runner run ./api-tests --mail-to [email protected]\n"})}),"\n",(0,t.jsxs)(n.p,{children:["To send to multiple recipients, set the ",(0,t.jsx)(n.code,{children:"VOIDEN_MAIL_TO"})," environment variable (comma-separated) and use ",(0,t.jsx)(n.code,{children:"--mail"})," instead:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"[email protected],[email protected] voiden-runner run ./api-tests --mail\n"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h2,{id:"smtp-configuration",children:"SMTP configuration"}),"\n",(0,t.jsx)(n.p,{children:"Provide SMTP credentials as flags or environment variables:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'voiden-runner run ./api-tests \\\n  --mail-to [email protected] \\\n  --mail-from [email protected] \\\n  --mail-subject "API Test Results \u2014 $(date +%Y-%m-%d)" \\\n  --smtp-host smtp.gmail.com \\\n  --smtp-port 587 \\\n  --smtp-secure \\\n  --smtp-user [email protected] \\\n  --smtp-pass $SMTP_PASSWORD\n'})}),"\n",(0,t.jsx)(n.p,{children:"Or use environment variables so credentials stay out of your command history:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"VOIDEN_MAIL_TO"})}),(0,t.jsx)(n.td,{children:"Default recipient(s), comma-separated"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"VOIDEN_MAIL_FROM"})}),(0,t.jsx)(n.td,{children:"Default sender address"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"VOIDEN_MAIL_SUBJECT"})}),(0,t.jsx)(n.td,{children:"Default email subject line"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"VOIDEN_SMTP_HOST"})}),(0,t.jsx)(n.td,{children:"SMTP hostname"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"VOIDEN_SMTP_PORT"})}),(0,t.jsx)(n.td,{children:"SMTP port"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"VOIDEN_SMTP_SECURE"})}),(0,t.jsxs)(n.td,{children:["Set to ",(0,t.jsx)(n.code,{children:"true"})," to enable TLS/SSL"]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"VOIDEN_SMTP_USER"})}),(0,t.jsx)(n.td,{children:"SMTP username"})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"VOIDEN_SMTP_PASS"})}),(0,t.jsx)(n.td,{children:"SMTP password"})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"With those set, the command simplifies to:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"voiden-runner run ./api-tests --mail\n"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h2,{id:"configure-smtp-via-environment-file",children:"Configure SMTP via Environment File"}),"\n",(0,t.jsxs)(n.p,{children:["Create an ",(0,t.jsx)(n.code,{children:".env.mail"})," file (add it to ",(0,t.jsx)(n.code,{children:".gitignore"}),") and load it alongside your test environment:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-env",children:"[email protected]\[email protected]\nVOIDEN_SMTP_HOST=smtp.gmail.com\nVOIDEN_SMTP_PORT=587\[email protected]\nVOIDEN_SMTP_PASS=your-app-password\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"voiden-runner run ./api-tests --env .env.staging --env .env.mail --mail\n"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsx)(n.h2,{id:"combine-with-csv",children:"Combine with CSV"}),"\n",(0,t.jsx)(n.p,{children:"Send the email report and export a CSV in the same run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"voiden-runner run ./api-tests \\\n  --csv report.csv \\\n  --mail-to [email protected]\n"})}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.h2,{id:"send-from-the-report-command",children:["Send from the ",(0,t.jsx)(n.code,{children:"report"})," command"]}),"\n",(0,t.jsx)(n.p,{children:"If you accumulate results across multiple pipeline stages, generate and mail a combined report at the end:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"voiden-runner report generate \\\n  --mail-to [email protected] \\\n  --csv combined.csv\n"})}
1),"\n",(0,t.jsx)(n.admonition,{title:"App passwords",type:"tip",children:(0,t.jsx)(n.p,{children:"When using Gmail or Outlook, generate an app-specific password rather than using your main account password. Standard passwords are blocked for programmatic SMTP access on most providers."})})]})}function m(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>d});var s=r(6540);const t={},i=s.createContext(t);function o(e){const n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.