You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/apps/cli/src/commands/smtp.ts

104 lines
3.0 KiB
TypeScript

import { CommandModule } from 'yargs';
import { config } from 'dotenv';
import inquirer from 'inquirer';
import nodemailer from 'nodemailer';
import { parseConnectionUrl } from 'nodemailer/lib/shared';
export const smtpCommand: CommandModule = {
command: 'smtp',
describe: 'SMTP Service',
builder: (yargs) =>
yargs
.command(
'verify',
'Verify smtp sender service',
(yargs) => {},
async (args) => {
config(); // 加载环境变量
console.log(
'This command will verify SMTP URI which use in tailchat, please put your URI which same like in tailchat env'
);
const { uri } = await inquirer.prompt([
{
type: 'input',
name: 'uri',
message: 'SMTP_URI',
default: process.env.SMTP_URI,
validate: isValidStr,
},
]);
const transporter = nodemailer.createTransport(
parseConnectionUrl(uri)
);
try {
const verify = await transporter.verify();
console.log('Verify Result:', verify);
} catch (err) {
console.log('Verify Failed:', String(err));
}
}
)
.command(
'test',
'Send test email with smtp service',
(yargs) => {},
async (args) => {
config(); // 加载环境变量
console.log(
'This command will send test email to your own email, please put your info which same like in tailchat env'
);
const { sender, uri, target } = await inquirer.prompt([
{
type: 'input',
name: 'sender',
message: 'SMTP_SENDER',
default: process.env.SMTP_SENDER,
validate: isValidStr,
},
{
type: 'input',
name: 'uri',
message: 'SMTP_URI',
default: process.env.SMTP_URI,
validate: isValidStr,
},
{
type: 'input',
name: 'target',
message: 'Email address which wanna send',
validate: isValidStr,
},
]);
const transporter = nodemailer.createTransport(
parseConnectionUrl(uri)
);
try {
const res = await transporter.sendMail({
from: sender,
to: target,
subject: `Test email send in ${new Date().toLocaleDateString()}`,
text: `This is a test email send by tailchat-cli at ${new Date().toLocaleString()}`,
});
console.log('Send Result:', res);
} catch (err) {
console.log('Send Failed:', String(err));
} finally {
transporter.close();
}
}
)
.demandCommand(),
handler() {},
};
function isValidStr(input: any): boolean {
return typeof input === 'string' && input.length > 0;
}