| name | outlook-mail |
|---|---|
| description | Корпоративная почта Outlook/Exchange (mail.tokyo-city.ru): читать входящие, искать и читать письма, отправлять письма, смотреть календарь и создавать встречи. Use this skill when the user mentions почта / почту / письма / входящие / outlook / exchange / «проверь почту» / «отправь письмо» / календарь / встреча / совещание, or otherwise wants to read or send corporate mail or work with their Exchange calendar. |
Корпоративная почта (Outlook / Exchange)
Доступ к ящику пользователя через внутренний JSON-API OWA. Вся механика —
в owa.js рядом с этим файлом. Не дёргай сервер curl-ом вручную — все
операции делаются через CLI ниже. Путь к скрипту (стандартная установка):
~/.claude/skills/outlook-mail/owa.js — обозначаю как OWA далее.
Node есть всегда (на нём работает сам Claude Code), так что node OWA … запустится.
##Шаг 0. Проверка настройки (делать перед первой операцией в сессии)
Запусти node OWA test.
- Вернулось «OK — вход выполнен …» → всё готово, работай.
- «creds not found …» → пользователь ещё не настроен, см. «Настройка».
- «401 — неверный логин или пароль» → пароль устарел, повтори настройку.
- Иное (блокировка/сеть) → покажи текст ошибки пользователю дословно.
##Настройка (один раз на пользователя)
Логин/пароль хранятся в ~/.config/owa-mail/creds (chmod 600), вне папки скилла.
Предпочтительный способ (пароль НЕ попадает в чат) — попроси пользователя
выполнить в строке ввода:
! node ~/.claude/skills/outlook-mail/owa.js setup
Скрипт спросит e-mail и пароль (ввод пароля скрыт), запишет файл и проверит вход.
Если пользователь сам диктует креды в чат — можно вызвать без интерактива:
node OWA setup --login <email> --password "<пароль>". После настройки
напомни: пароль лежит в файле открытым текстом (права 600); при смене пароля —
повторить setup.
##Чтение (безопасно, выполняй сразу)
- Входящие:
node OWA inbox --count <N>(папки:--folder inbox|sentitems|drafts) - Поиск:
node OWA search --query "<строка>" - Прочитать письмо целиком:
node OWA read --id "<ItemId>"(ItemId берётся из вывода inbox/search) - Календарь:
node OWA calendar --days <N>
У каждой read-команды есть --json для машинного вывода, если нужно разобрать.
##Запись — ТОЛЬКО ПОСЛЕ ЯВНОГО ПОДТВЕРЖДЕНИЯ
Перед отправкой письма и созданием встречи обязательно покажи пользователю
сводку (кому / тема / текст; либо тема / время / участники) и дождись явного
«да, отправляй / создавай». Никогда не выполняй write-операцию без подтверждения.
Текст письма с переносами строк удобнее передавать через файл: --body-file <path>.
- Отправить письмо:
node OWA send --to "a@x.ru,b@y.ru" [--cc "..."] --subject "..." --body "..." - Создать встречу (время в ISO; UTC, если не указан сдвиг):
node OWA create-event --subject "..." --start "2026-06-10T11:00:00Z" --end "2026-06-10T12:00:00Z" [--attendees "a@x.ru,b@y.ru"] [--location "..."] [--body "..."]Участникам уйдёт приглашение.--locationподставляется в тело события (отдельным полем место задать нельзя — ограничение API).
##Контракт (для справки и диагностики)
- База:
https://mail.tokyo-city.ru— on-prem Exchange 2019 за TMG-шлюзом. - Auth: HTTP Basic + сессионные куки + заголовок
X-OWA-CANARY. - Канал:
POST /owa/service.svc?action=<Action>&app=Mail|Calendar(JSON). - Важно: User-Agent должен быть НЕ браузерным (иначе TMG редиректит на форму).
- Действия:
FindItem(список/поиск),GetItem(чтение),CreateItem(отправка письма:MessageDisposition=SendAndSaveCopy; встреча —CalendarItem). - EWS/ActiveSync на шлюзе закрыты — рабочий канал только
service.svc. - Тонкости форм: получатели — bare-объекты
{EmailAddress, RoutingType:"SMTP"}без__type; коллекцияItems— плоский массив;CalendarItem.Locationстрокой не принимается.
##Частые ошибки
creds not found→ запусти настройку.401на чтении → пароль сменился, повтори setup.OWA … HTTP 5xx OwaSerializationException→ неверная форма запроса; не выдумывай JSON, пользуйся только командамиowa.js.