diff --git a/README.md b/README.md index 1faa8581..71795b6d 100644 --- a/README.md +++ b/README.md @@ -16,10 +16,20 @@ Some features: - name: Send mail uses: dawidd6/action-send-mail@v3 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 - # Required mail server port: + # Server port, default 25: server_port: 465 + # Optional whether this connection use TLS (default is true if server_port is 465) + secure: true # Optional (recommended): mail server username: username: ${{secrets.MAIL_USERNAME}} # Optional (recommended) mail server password: @@ -30,8 +40,6 @@ Some features: to: obiwan@example.com,yoda@example.com # Required sender full name (address can be skipped): from: Luke Skywalker # - # Optional whether this connection use TLS (default is true if server_port is 465) - secure: true # Optional plain body: body: Build job of ${{github.repository}} completed successfully! # Optional HTML body read from file: diff --git a/action.yml b/action.yml index 33593b32..c1ed6faf 100644 --- a/action.yml +++ b/action.yml @@ -5,18 +5,19 @@ branding: icon: mail color: blue 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: description: SMTP server address - required: true 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: description: Authenticate as this user to SMTP server - required: false password: description: Authenticate with this password to SMTP server - required: false subject: description: Subject of mail message required: true @@ -26,9 +27,6 @@ inputs: from: description: Full name of mail sender (might be with an email address specified in <>) required: true - secure: - description: Whether this connection use TLS (default is true if server_port is 465) - required: false body: description: Body of mail message (might be a filename prefixed with file:// to read from) required: false diff --git a/main.js b/main.js index 3d2e1ace..d6485470 100644 --- a/main.js +++ b/main.js @@ -39,14 +39,48 @@ async function getAttachments(attachments) { async function main() { try { - const serverAddress = core.getInput("server_address", { required: true }) - const serverPort = core.getInput("server_port", { required: true }) - const username = core.getInput("username") - const password = core.getInput("password") + 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" + } + + 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 from = core.getInput("from", { required: true }) const to = core.getInput("to", { required: true }) - const secure = core.getInput("secure", { required: false }) const body = core.getInput("body", { required: false }) const htmlBody = core.getInput("html_body", { 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 priority = core.getInput("priority", { required: false }) + if (!serverAddress) { + throw new Error("Server address must be specified"); + } + 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.") } @@ -69,7 +107,7 @@ async function main() { pass: password } : undefined, port: serverPort, - secure: secure == "true" ? true : serverPort == "465", + secure: secure == "true", tls: ignoreCert == "true" ? { rejectUnauthorized: false } : undefined,