send-mail/main.js

141 lines
4.9 KiB
JavaScript
Raw Normal View History

2020-03-01 05:01:03 +07:00
const nodemailer = require("nodemailer")
const core = require("@actions/core")
2021-06-23 00:18:21 +07:00
const glob = require("@actions/glob")
2020-03-01 05:01:03 +07:00
const fs = require("fs")
2021-04-25 21:14:13 +07:00
const showdown = require("showdown")
2022-03-25 01:30:26 +07:00
const path = require("path")
2020-03-01 05:01:03 +07:00
function getText(textOrFile, convertMarkdown) {
let text = textOrFile
// Read text from file
if (textOrFile.startsWith("file://")) {
const file = textOrFile.replace("file://", "")
text = fs.readFileSync(file, "utf8")
}
// Convert Markdown to HTML
if (convertMarkdown) {
const converter = new showdown.Converter()
text = converter.makeHtml(text)
2020-03-01 05:01:03 +07:00
}
return text
2020-03-01 05:01:03 +07:00
}
2020-09-24 15:24:29 +07:00
function getFrom(from, username) {
2021-04-25 21:14:13 +07:00
if (from.match(/.+ <.+@.+>/)) {
2020-03-25 22:18:35 +07:00
return from
}
return `"${from}" <${username}>`
}
2021-06-23 00:18:21 +07:00
async function getAttachments(attachments) {
const globber = await glob.create(attachments.split(',').join('\n'))
const files = await globber.glob()
2022-03-25 01:30:26 +07:00
return files.map(f => ({ filename: path.basename(f), path: f, cid: f.replace(/^.*[\\\/]/, '')}))
2021-06-23 00:18:21 +07:00
}
2020-03-01 05:01:03 +07:00
async function main() {
2020-03-01 05:13:30 +07:00
try {
let serverAddress = core.getInput("server_address")
let serverPort = core.getInput("server_port")
let secure = core.getInput("secure")
let username = core.getInput("username")
let password = core.getInput("password")
if (!secure) {
secure = serverPort === "465" ? "true" : "false"
}
const connectionUrl = core.getInput("connection_url")
if (connectionUrl) {
const url = new URL(connectionUrl)
switch (url.protocol) {
default:
throw new Error(`Unsupported connection protocol '${url.protocol}'`)
case "smtp:":
serverPort = "25"
secure = "false"
break
case "smtp+starttls:":
serverPort = "465"
secure = "true"
break
}
if (url.hostname) {
serverAddress = url.hostname
}
if (url.port) {
serverPort = url.port
}
if (url.username) {
username = unescape(url.username)
}
if (url.password) {
password = unescape(url.password)
}
}
2020-03-01 18:37:11 +07:00
const subject = core.getInput("subject", { required: true })
const from = core.getInput("from", { required: true })
const to = core.getInput("to", { required: false })
const body = core.getInput("body", { required: false })
const htmlBody = core.getInput("html_body", { required: false })
2020-12-16 23:16:24 +07:00
const cc = core.getInput("cc", { required: false })
const bcc = core.getInput("bcc", { required: false })
const replyTo = core.getInput("reply_to", { required: false })
const inReplyTo = core.getInput("in_reply_to", { required: false })
const attachments = core.getInput("attachments", { required: false })
const convertMarkdown = core.getInput("convert_markdown", { required: false })
2021-03-26 14:42:12 +07:00
const ignoreCert = core.getInput("ignore_cert", { required: false })
const priority = core.getInput("priority", { required: false })
const nodemailerlog = core.getInput("nodemailerlog", { required: false })
const nodemailerdebug = core.getInput("nodemailerdebug", { required: false })
2020-03-01 05:01:03 +07:00
// if neither to, cc or bcc is provided, throw error
if (!to && !cc && !bcc) {
throw new Error("At least one of 'to', 'cc' or 'bcc' must be specified")
}
if (!serverAddress) {
throw new Error("Server address must be specified")
}
2020-03-24 20:03:35 +07:00
const transport = nodemailer.createTransport({
host: serverAddress,
auth: username && password ? {
2020-03-24 20:03:35 +07:00
user: username,
pass: password
} : undefined,
port: serverPort,
secure: secure === "true",
tls: ignoreCert == "true" ? {
2021-03-26 14:42:12 +07:00
rejectUnauthorized: false
} : undefined,
logger: nodemailerdebug == "true" ? true : nodemailerlog,
debug: nodemailerdebug,
2020-03-24 20:03:35 +07:00
})
2021-04-25 21:14:13 +07:00
2020-03-01 18:37:11 +07:00
const info = await transport.sendMail({
2020-09-24 15:24:29 +07:00
from: getFrom(from, username),
2020-03-01 05:13:30 +07:00
to: to,
subject: getText(subject, false),
2020-12-16 23:16:24 +07:00
cc: cc ? cc : undefined,
bcc: bcc ? bcc : undefined,
replyTo: replyTo ? replyTo : undefined,
inReplyTo: inReplyTo ? inReplyTo : undefined,
references: inReplyTo ? inReplyTo : undefined,
text: body ? getText(body, false) : undefined,
html: htmlBody ? getText(htmlBody, convertMarkdown) : undefined,
priority: priority ? priority : undefined,
2021-07-13 23:30:04 +07:00
attachments: attachments ? (await getAttachments(attachments)) : undefined,
2020-03-01 05:13:30 +07:00
})
} catch (error) {
core.setFailed(error.message)
}
2020-03-01 05:01:03 +07:00
}
2020-03-25 22:06:11 +07:00
main()