Add connection_url input parameter (#128)

Specify connection via URL (replaces server_address, server_port,
secure, username and password)

Format:

 * smtp://user:password@server:port
 * smtp+starttls://user:password@server:port

Closes: #127
Signed-off-by: Alon Bar-Lev <alon.barlev@gmail.com>

Signed-off-by: Alon Bar-Lev <alon.barlev@gmail.com>
This commit is contained in:
Alon Bar-Lev 2022-09-02 00:14:42 +03:00 committed by GitHub
parent 6d23605227
commit 602f9d1725
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 17 deletions

View File

@ -16,10 +16,20 @@ Some features:
- name: Send mail - name: Send mail
uses: dawidd6/action-send-mail@v3 uses: dawidd6/action-send-mail@v3
with: with:
# Required mail server address: # Specify connection via URL (replaces server_address, server_port, secure,
# username and password)
#
# Format:
#
# * smtp://user:password@server:port
# * smtp+starttls://user:password@server:port
connection_url: ${{secrets.MAIL_CONNECTION}}
# Required mail server address if not connection_url:
server_address: smtp.gmail.com server_address: smtp.gmail.com
# Required mail server port: # Server port, default 25:
server_port: 465 server_port: 465
# Optional whether this connection use TLS (default is true if server_port is 465)
secure: true
# Optional (recommended): mail server username: # Optional (recommended): mail server username:
username: ${{secrets.MAIL_USERNAME}} username: ${{secrets.MAIL_USERNAME}}
# Optional (recommended) mail server password: # Optional (recommended) mail server password:
@ -30,8 +40,6 @@ Some features:
to: obiwan@example.com,yoda@example.com to: obiwan@example.com,yoda@example.com
# Required sender full name (address can be skipped): # Required sender full name (address can be skipped):
from: Luke Skywalker # <user@example.com> from: Luke Skywalker # <user@example.com>
# Optional whether this connection use TLS (default is true if server_port is 465)
secure: true
# Optional plain body: # Optional plain body:
body: Build job of ${{github.repository}} completed successfully! body: Build job of ${{github.repository}} completed successfully!
# Optional HTML body read from file: # Optional HTML body read from file:

View File

@ -5,18 +5,19 @@ branding:
icon: mail icon: mail
color: blue color: blue
inputs: inputs:
connection_url:
description: Connection URL protocol://user:password@server:port, protocol can be smtp or smtp+starttls, replaces server_address, server_port, secure, username and password
server_address: server_address:
description: SMTP server address description: SMTP server address
required: true
server_port: server_port:
description: SMTP server port description: SMTP server port
required: true default: "25"
secure:
description: Whether this connection use TLS (default is true if server_port is 465)
username: username:
description: Authenticate as this user to SMTP server description: Authenticate as this user to SMTP server
required: false
password: password:
description: Authenticate with this password to SMTP server description: Authenticate with this password to SMTP server
required: false
subject: subject:
description: Subject of mail message description: Subject of mail message
required: true required: true
@ -26,9 +27,6 @@ inputs:
from: from:
description: Full name of mail sender (might be with an email address specified in <>) description: Full name of mail sender (might be with an email address specified in <>)
required: true required: true
secure:
description: Whether this connection use TLS (default is true if server_port is 465)
required: false
body: body:
description: Body of mail message (might be a filename prefixed with file:// to read from) description: Body of mail message (might be a filename prefixed with file:// to read from)
required: false required: false

50
main.js
View File

@ -39,14 +39,48 @@ async function getAttachments(attachments) {
async function main() { async function main() {
try { try {
const serverAddress = core.getInput("server_address", { required: true }) let serverAddress = core.getInput("server_address")
const serverPort = core.getInput("server_port", { required: true }) let serverPort = core.getInput("server_port")
const username = core.getInput("username") let secure = core.getInput("secure")
const password = core.getInput("password") let username = core.getInput("username")
let password = core.getInput("password")
if (!secure) {
secure = serverPort === "465"
}
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)
}
}
const subject = core.getInput("subject", { required: true }) const subject = core.getInput("subject", { required: true })
const from = core.getInput("from", { required: true }) const from = core.getInput("from", { required: true })
const to = core.getInput("to", { required: true }) const to = core.getInput("to", { required: true })
const secure = core.getInput("secure", { required: false })
const body = core.getInput("body", { required: false }) const body = core.getInput("body", { required: false })
const htmlBody = core.getInput("html_body", { required: false }) const htmlBody = core.getInput("html_body", { required: false })
const cc = core.getInput("cc", { required: false }) const cc = core.getInput("cc", { required: false })
@ -58,6 +92,10 @@ async function main() {
const ignoreCert = core.getInput("ignore_cert", { required: false }) const ignoreCert = core.getInput("ignore_cert", { required: false })
const priority = core.getInput("priority", { required: false }) const priority = core.getInput("priority", { required: false })
if (!serverAddress) {
throw new Error("Server address must be specified");
}
if (!username || !password) { if (!username || !password) {
core.warning("Username and password not specified. You should only do this if you are using a self-hosted runner to access an on-premise mail server.") core.warning("Username and password not specified. You should only do this if you are using a self-hosted runner to access an on-premise mail server.")
} }
@ -69,7 +107,7 @@ async function main() {
pass: password pass: password
} : undefined, } : undefined,
port: serverPort, port: serverPort,
secure: secure == "true" ? true : serverPort == "465", secure: secure == "true",
tls: ignoreCert == "true" ? { tls: ignoreCert == "true" ? {
rejectUnauthorized: false rejectUnauthorized: false
} : undefined, } : undefined,