Перейти к документации
SDK

Журнал изменений

Каждый выпуск пакета, новые сверху.

0.1.0

Второй выпуск. Контакты можно записывать и группировать в аудитории, домен может нести собственные имена для трекинга и файлов, а ключ может себя ротировать. Одно изменение ломает существующий код, и оно перечислено ниже.

  • openemail.audiences — новинка: именованные списки контактов с list, get, create, update, delete, listContacts, addContact и removeContact. У каждого рабочего пространства есть одна аудитория по умолчанию — та, у которой builtin равен default, — она держит все контакты и не может быть удалена.
  • openemail.contacts умеет писать. create, update и delete присоединяются к list и get, и каждый принимает адрес электронной почты как идентификатор.
  • openemail.domains.update() задаёт или снимает собственные имена домена для трекинга и для файлов, а DomainResource.tracking и DomainResource.storage сообщают, как обстоят дела с каждым.
  • openemail.me.rotate() заменяет секрет вызывающего ключа и разрешается новым ключом целиком. Окна перекрытия нет, так что старый секрет перестаёт работать в момент возврата из вызова.
  • KeyResource.domainAllowlist сужает ключ до целых доменов — рядом с отдельными адресами в addressAllowlist. Домен покрывает все адреса на нём, включая созданные после ключа.
  • Вложения можно отправлять по ссылке. { fileId } стоит рядом со встроенной формой, а attachmentDelivery выбирает между переносом файлов внутри сообщения, заменой их ссылками на скачивание и решением по размеру.
  • Ещё десять событий вебхуков, двадцать всего: ответы, доставки, задержки, подавления, скачивания и три доменных события.
  • email.downloaded срабатывает, когда человек забирает файл, ушедший ссылкой на скачивание. Одна ссылка обслуживает всех, кому ушло сообщение, поэтому событие не называет получателя.
  • Четыре новые области доступа: contacts:write, audiences:read, audiences:write и keys:write.
  • Девять полей, которые были свободными строками, получили именованные типы, среди них RecipientKind, ContactSource, RuleMatchMode и WebhookDeliveryStatus. Они принимают и возвращают те же строки, что и раньше.
audiences.ts
const audience = await openemail.audiences.create({ name: 'Product updates' }) await openemail.contacts.create({ email: '[email protected]', name: 'Grace Hopper' })await openemail.audiences.addContact(audience.id, { email: '[email protected]' })

Что ломается в 0.1.0

  • contacts.list возвращает Page<ContactResource> вместо массива. Читайте строки из page.items и следуйте за page.nextCursor, пока page.hasMore истинно. Адресная книга не ограничена по размеру, а старый массив молча обрывался на 200 строках.
  • API_SCOPES, ERROR_TYPES, MESSAGE_ENCRYPTION_FORMATS, RULE_ACTIONS, RULE_FIELDS, RULE_OPERATORS и WEBHOOK_EVENTS теперь объекты с ключами, а не массивы, так что у каждого члена есть имя, которым его можно назвать. Значения не изменились.
  • contacts.list теперь ставит контакты, которым никогда не писали, в конец, а не в начало, так что только что созданный контакт больше не прыгает наверх книги.
migrate.ts
import { API_SCOPES, WEBHOOK_EVENTS } from '@openemail/sdk' const scopes = Object.values(API_SCOPES)const subscribable = new Set<string>(Object.values(WEBHOOK_EVENTS)) const page = await openemail.contacts.list()for (const contact of page.items) send(contact.email)

Код, использовавший только производные типы, продолжает работать без правок. ApiScope, WebhookEvent и прочие — те же типы, что и были.

0.0.1

Первый выпуск: по одному типизированному методу на каждый эндпоинт и никаких зависимостей времени выполнения.

  • Отправка: одно сообщение, пакеты, отложенные отправки, окно отмены и перевод на язык, на котором читает получатель.
  • Шаблоны: создание, версионирование, публикация, предпросмотр и отправка.
  • Трекинг: открытия, клики и сводка по каждому сообщению.
  • Почтовый ящик: цепочки, черновики, метки, контакты и правила.
  • Рабочее пространство: домены, адреса, участники, роли и настройки.
  • Вебхуки с проверкой подписи, которая работает везде, где есть WebCrypto.
  • События календаря, включая файл ICS.
  • Одноразовые ящики — единственная часть, которая работает и в браузере.
  • Курсорная постраничность в каждом списке — через listAll и iterate.
  • Два класса ошибок и повторы, которые не могут продублировать отправку.
  • ESM и CommonJS, на Node 20+, Bun, Deno и Cloudflare Workers.