/// import { EventEmitter } from "node:events"; import { Transport, TransportOptions } from "../.."; import * as shared from "../shared"; import Mail = require("../mailer"); import MailMessage = require("../mailer/mail-message"); import MimeNode = require("../mime-node"); declare namespace SESTransport { /** * Minimal structural shape of SESv2 SendEmail input. * This is intentionally structural so @types/nodemailer does not require * installing @aws-sdk/client-sesv2. * * If you want the full, exact type, install @aws-sdk/client-sesv2 in your * app and use its types directly in your own code. */ interface SendEmailRequestLike { FromEmailAddress?: string; Destination?: { ToAddresses?: string[]; CcAddresses?: string[]; BccAddresses?: string[]; }; ReplyToAddresses?: string[]; Content?: unknown; EmailTags?: Array<{ Name?: string; Value?: string }>; ConfigurationSetName?: string; ListManagementOptions?: unknown; FeedbackForwardingEmailAddress?: string; // Allow extra fields without forcing the SDK type package [key: string]: unknown; } /** Structural type matching SESv2Client from @aws-sdk/client-sesv2 */ interface SESv2ClientLike { send(command: unknown, options?: unknown): Promise<{ MessageId?: string }>; config?: { region?: string | (() => Promise); }; } /** * Constructor type for SendEmailCommand from @aws-sdk/client-sesv2. * The real type is: new(input: SendEmailCommandInput) => SendEmailCommand * Contravariance prevents typing this more strictly without pulling in aws-sdk as a dependency. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any type SendEmailCommandConstructorLike = new(input: any) => unknown; interface MailOptions extends Mail.Options { /** Options passed to AWS SESv2 SendEmailCommand */ ses?: MailSesOptions | undefined; } // Keep it as an interface for backward-compatibility // eslint-disable-next-line @typescript-eslint/no-empty-interface interface MailSesOptions extends Partial {} interface Options extends MailOptions, TransportOptions { /** An object containing an instantiated SESv2Client and the SendEmailCommand class */ SES: { sesClient: SESv2ClientLike; SendEmailCommand: SendEmailCommandConstructorLike; }; } interface SentMessageInfo { /** an envelope object {from:'address', to:['address']} */ envelope: MimeNode.Envelope; /** the Message-ID header value. This value is derived from the response of SES API, so it differs from the Message-ID values used in logging. */ messageId: string; response: string; accepted: Array; rejected: Array; pending: Array; raw: Buffer; } } declare class SESTransport extends EventEmitter implements Transport { options: SESTransport.Options; logger: shared.Logger; mailer: Mail; name: string; version: string; ses: SESTransport.Options["SES"]; constructor(options: SESTransport.Options); /** Undocumented */ getRegion( callback: (err: Error | null, region: string | undefined) => void, ): void; /** Schedules a sending of a message */ send( mail: MailMessage, callback: (err: Error | null, info: SESTransport.SentMessageInfo) => void, ): void; /** Verifies SES configuration */ verify(callback: (err: Error | null, success: true) => void): void; verify(): Promise; } export = SESTransport;