import { Command } from '@cliffy/command' import { Contact } from '../src/contact.ts' import { send } from '../src/send.ts' import type { Mail } from '../types.ts' import { templates, templateType } from './_templates_loader.ts' import { promptProps } from './_prompt_template.ts' //TODO completions for "--from" //TODO require sudo for "--from !== !me" export const cmd = new Command() .name('send') .description('Send a mail.') .type('template', templateType) .option( '-f, --from ', 'From mail account or short name from config.', { default: '!me' }, ) .option('-r, --recipient ', 'Recipient (to) of the mail.', { required: true, collect: true, }) .option('--cc ', 'Copy carbon.', { collect: true }) .option('--cci ', 'Copy carbon invisible.', { collect: true, }) .option('-a, --attachments ', 'Attachments.', { collect: true }) .option('-t, --template ', 'HTML template from config', { default: 'message', }) .arguments('') .action( async ({ from, recipient, cc, cci, attachments, template }, subject) => { const fromContact: Contact = await (async () => { if (from === '!me') { const whoami = new Deno.Command('whoami', { stderr: 'inherit', }) const { stdout } = await whoami.output() const rawName = new TextDecoder().decode(stdout).trim() const name = encodeURIComponent(rawName) return new Contact({ name: `${name} de Cohabit`, address: `_${name}_@cohabit.fr`, }) } if (from.startsWith('!')) { return Contact.expand(from.slice(1)) } return Contact.fromString(from) })() const selectedTemplate = templates.get(template)! const props = await promptProps(selectedTemplate) const mail: Mail = { from: fromContact, to: recipient.map((to) => Contact.fromString(to)), subject, body: selectedTemplate.builder(props)!, options: { cc: cc?.map(Contact.fromString) ?? [], cci: cci?.map(Contact.fromString) ?? [], attachments: attachments ?? [], }, } await send(mail) }, )