Docs / Integrations
E-mail and chat
ivralo can send what it produced by e-mail, or post a short message to Telegram or Slack. Both are off until you configure them, and every send is approved by you.
Two tools, one rule
| Tool | Sends | Grant |
|---|---|---|
send_email | an e-mail with workspace files attached | mail.send |
send_message | a short message to the Telegram or Slack chat you configured | message.send |
Sending is the one capability that turns an assistant that reads your workspace into a way out of it. So both tools follow the same rule: every call pauses for your approval, and nothing lifts that pause.
The Courier is the specialist for sending, the courier preset, with the mail and notify skills. It is on the team only when a mail backend or a chat is configured. The main agent holds the team's grants, so it can call the same two tools, under the same approval.
Every send asks
The dialog shows what would leave; for mail that is the recipients, the subject, the attachments and the body. It is marked high risk: y sends, and Enter does nothing. The broader answers (a for the turn, s for the session, p for a rule) are not offered on a send.
In a run nobody is watching, such as ivralo ask, a pipe or a job, both tools are refused, because nobody is there to approve. The one exception is a schedule created for it:
ivralo schedule add morning-report --every "weekdays 08:30" "Build the daily error report as a PDF" --mail-to ops@example.com --notify
--mail-to names the addresses that schedule may mail, and is checked against IVRALO_MAIL_ALLOWED when the schedule is created. --notify lets it post to your chat. Nothing else sends unattended. See Schedules.
An instance opened to answer a question never gets either tool.
Set a backend and a sender, and the Courier joins the team.
| Variable | Default | Sets |
|---|---|---|
IVRALO_MAIL | unset | smtp or resend; unset means no mail |
IVRALO_MAIL_FROM | unset | the sender address |
IVRALO_SMTP_HOST | unset | the SMTP server |
IVRALO_SMTP_PORT | 587 | its port |
IVRALO_SMTP_USER, IVRALO_SMTP_PASSWORD | unset | the login |
IVRALO_SMTP_SECURITY | starttls | starttls, ssl or none (a relay on the local network) |
IVRALO_RESEND_API_KEY | unset | Resend's HTTP API instead of SMTP |
IVRALO_MAIL_ALLOWED | unset | addresses or @domains mail may go to; unset allows any address |
IVRALO_MAIL_MAX_MB | 10 | the cap on attachments per mail |
SMTP works with any provider: a company relay, Amazon SES over SMTP, Outlook, or a Gmail app password.
IVRALO_MAIL=smtp
IVRALO_MAIL_FROM=ivralo@example.com
IVRALO_SMTP_HOST=smtp.example.com
IVRALO_SMTP_USER=ivralo@example.com
IVRALO_SMTP_PASSWORD=change-me
IVRALO_MAIL_ALLOWED=@example.com
A request reads the way you would say it:
send the incident report to oncall@example.com with a one-line note
The report is produced first, then sent with the exact file name and the address. Attachments are workspace files only, under the size cap. The Courier never invents a recipient: with no address it asks you. A refusal, such as an address outside the allow list or a missing file, is reported as the tool said it, not worked around.
Telegram and Slack
| Variable | Sets |
|---|---|
IVRALO_TELEGRAM_BOT_TOKEN, IVRALO_TELEGRAM_CHAT_ID | a bot from @BotFather and the chat it posts to; files go along as documents |
IVRALO_SLACK_WEBHOOK_URL | a Slack incoming webhook; text only, since a webhook cannot carry a file |
The chat is fixed by the configuration, so the model never picks who receives a message. With one channel configured, that one is used; with both, the call names one.
tell me on Telegram when the report is ready
Checking the setup
ivralo doctor has a mail section and a notify section. Each says off, misconfigured (naming what is missing) or ready. Neither opens a connection, because the only real test of a send would be a send.
These settings belong in your home's .env. Keep the password and the tokens out of any repository; ivralo keeps every variable whose name ends in _KEY, _TOKEN or _SECRET, or contains PASSWORD or WEBHOOK, away from the Python worker.