outlook-mail

al.lavrinenko
METADATA
nameoutlook-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.
SKILL.MD

Корпоративная почта (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.