From dac88391c19bf21943a61da7e003d560160d16a2 Mon Sep 17 00:00:00 2001 From: Philipp Heckel Date: Tue, 28 Dec 2021 17:36:12 +0100 Subject: [PATCH] Docs docs docs --- README.md | 2 + cmd/serve.go | 12 ++-- docs/config.md | 54 ++++++++++++++++-- docs/publish.md | 24 +++++++- .../img/screenshot-email-publishing-dns.png | Bin 0 -> 17218 bytes .../img/screenshot-email-publishing-gmail.png | Bin 0 -> 29793 bytes server/server.yml | 10 +++- 7 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 docs/static/img/screenshot-email-publishing-dns.png create mode 100644 docs/static/img/screenshot-email-publishing-gmail.png diff --git a/README.md b/README.md index c99d2d4f..487d5dea 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ Third party libraries and resources: * [Mixkit sound](https://mixkit.co/free-sound-effects/notification/) (Mixkit Free License) used as notification sound * [Lato Font](https://www.latofonts.com/) (OFL) is used as a font in the Web UI * [GoReleaser](https://goreleaser.com/) (MIT) is used to create releases +* [go-smtp](https://github.com/emersion/go-smtp) (MIT) is used to receive e-mails +* [stretchr/testify](https://github.com/stretchr/testify) (MIT) is used for unit and integration tests * [github.com/mattn/go-sqlite3](https://github.com/mattn/go-sqlite3) (MIT) is used to provide the persistent message cache * [Firebase Admin SDK](https://github.com/firebase/firebase-admin-go) (Apache 2.0) is used to send FCM messages * [github/gemoji](https://github.com/github/gemoji) (MIT) is used for emoji support (specifically the [emoji.json](https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json) file) diff --git a/cmd/serve.go b/cmd/serve.go index 3da824fd..5545206f 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -22,10 +22,10 @@ var flagsServe = []cli.Flag{ altsrc.NewDurationFlag(&cli.DurationFlag{Name: "cache-duration", Aliases: []string{"b"}, EnvVars: []string{"NTFY_CACHE_DURATION"}, Value: server.DefaultCacheDuration, Usage: "buffer messages for this time to allow `since` requests"}), altsrc.NewDurationFlag(&cli.DurationFlag{Name: "keepalive-interval", Aliases: []string{"k"}, EnvVars: []string{"NTFY_KEEPALIVE_INTERVAL"}, Value: server.DefaultKeepaliveInterval, Usage: "interval of keepalive messages"}), altsrc.NewDurationFlag(&cli.DurationFlag{Name: "manager-interval", Aliases: []string{"m"}, EnvVars: []string{"NTFY_MANAGER_INTERVAL"}, Value: server.DefaultManagerInterval, Usage: "interval of for message pruning and stats printing"}), - altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-addr", Aliases: []string{"smtp-addr"}, EnvVars: []string{"NTFY_SMTP_SENDER_ADDR"}, Usage: "SMTP server address (host:port) for outgoing emails"}), - altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-user", Aliases: []string{"smtp-user"}, EnvVars: []string{"NTFY_SMTP_SENDER_USER"}, Usage: "SMTP user (if e-mail sending is enabled)"}), - altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-pass", Aliases: []string{"smtp-pass"}, EnvVars: []string{"NTFY_SMTP_SENDER_PASS"}, Usage: "SMTP password (if e-mail sending is enabled)"}), - altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-from", Aliases: []string{"smtp-from"}, EnvVars: []string{"NTFY_SMTP_SENDER_FROM"}, Usage: "SMTP sender address (if e-mail sending is enabled)"}), + altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-addr", EnvVars: []string{"NTFY_SMTP_SENDER_ADDR"}, Usage: "SMTP server address (host:port) for outgoing emails"}), + altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-user", EnvVars: []string{"NTFY_SMTP_SENDER_USER"}, Usage: "SMTP user (if e-mail sending is enabled)"}), + altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-pass", EnvVars: []string{"NTFY_SMTP_SENDER_PASS"}, Usage: "SMTP password (if e-mail sending is enabled)"}), + altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-sender-from", EnvVars: []string{"NTFY_SMTP_SENDER_FROM"}, Usage: "SMTP sender address (if e-mail sending is enabled)"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-server-listen", EnvVars: []string{"NTFY_SMTP_SERVER_LISTEN"}, Usage: "SMTP server address (ip:port) for incoming emails, e.g. :25"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-server-domain", EnvVars: []string{"NTFY_SMTP_SERVER_DOMAIN"}, Usage: "SMTP domain for incoming e-mail, e.g. ntfy.sh"}), altsrc.NewStringFlag(&cli.StringFlag{Name: "smtp-server-addr-prefix", EnvVars: []string{"NTFY_SMTP_SERVER_ADDR_PREFIX"}, Usage: "SMTP email address prefix for topics to prevent spam (e.g. 'ntfy-')"}), @@ -102,7 +102,9 @@ func execServe(c *cli.Context) error { } else if listenHTTPS != "" && (keyFile == "" || certFile == "") { return errors.New("if listen-https is set, both key-file and cert-file must be set") } else if smtpSenderAddr != "" && (baseURL == "" || smtpSenderUser == "" || smtpSenderPass == "" || smtpSenderFrom == "") { - return errors.New("if smtp-addr is set, base-url, smtp-user, smtp-pass and smtp-from must also be set") + return errors.New("if smtp-sender-addr is set, base-url, smtp-sender-user, smtp-sender-pass and smtp-sender-from must also be set") + } else if smtpServerListen != "" && smtpServerDomain == "" { + return errors.New("if smtp-server-listen is set, smtp-server-domain must also be set") } // Run server diff --git a/docs/config.md b/docs/config.md index e1d74e27..93d41025 100644 --- a/docs/config.md +++ b/docs/config.md @@ -36,7 +36,7 @@ Subscribers can retrieve cached messaging using the [`poll=1` parameter](subscri [`since=` parameter](subscribe/api.md#fetch-cached-messages). ## E-mail notifications -To allow forwarding messages via e-mail, you can configure an SMTP server for outgoing messages. Once configured, +To allow forwarding messages via e-mail, you can configure an **SMTP server for outgoing messages**. Once configured, you can set the `X-Email` header to [send messages via e-mail](publish.md#e-mail-notifications) (e.g. `curl -d "hi there" -H "X-Email: phil@example.com" ntfy.sh/mytopic`). @@ -44,13 +44,57 @@ As of today, only SMTP servers with PLAIN auth and STARTLS are supported. To ena following settings: * `base-url` is the root URL for the ntfy server; this is needed for e-mail footer -* `smtp-addr` is the hostname:port of the SMTP server -* `smtp-user` and `smtp-pass` are the username and password of the SMTP user -* `smtp-from` is the e-mail address of the sender +* `smtp-sender-addr` is the hostname:port of the SMTP server +* `smtp-sender-user` and `smtp-sender-pass` are the username and password of the SMTP user +* `smtp-sender-from` is the e-mail address of the sender + +Here's an example config using [Amazon SES](https://aws.amazon.com/ses/) for outgoing mail (this is how it is +configured for `ntfy.sh`): + +=== "/etc/ntfy/server.yml" + ``` yaml + base-url: "https://ntfy.sh" + smtp-sender-addr: "email-smtp.us-east-2.amazonaws.com:587" + smtp-sender-user: "AKIDEADBEEFAFFE12345" + smtp-sender-pass: "Abd13Kf+sfAk2DzifjafldkThisIsNotARealKeyOMG." + smtp-sender-from: "ntfy@ntfy.sh" + ``` Please also refer to the [rate limiting](#rate-limiting) settings below, specifically `visitor-email-limit-burst` and `visitor-email-limit-burst`. Setting these conservatively is necessary to avoid abuse. +## E-mail publishing +To allow publishing messages via e-mail, ntfy can run a lightweight **SMTP server for incoming messages**. Once configured, +users can [send emails to a topic e-mail address](publish.md#e-mail-publishing) (e.g. `mytopic@ntfy.sh` or +`myprefix-mytopic@ntfy.sh`) to publish messages to a topic. This is useful for e-mail based integrations such as for +statuspage.io (though these days most services also support webhooks and HTTP calls). + +To configure the SMTP server, you must at least set `smtp-server-listen` and `smtp-server-domain`: + +* `smtp-server-listen` defines the IP address and port the SMTP server will listen on, e.g. `:25` or `1.2.3.4:25` +* `smtp-server-domain` is the e-mail domain, e.g. `ntfy.sh` +* `smtp-server-addr-prefix` is an optional prefix for the e-mail addresses to prevent spam. If set to `ntfy-`, for instance, + only e-mails to `ntfy-$topic@ntfy.sh` will be accepted. If this is not set, all emails to `$topic@ntfy.sh` will be + accepted (which may obviously be a spam problem). + +Here's an example config (this is how it is configured for `ntfy.sh`): + +=== "/etc/ntfy/server.yml" + ``` yaml + smtp-server-listen: ":25" + smtp-server-domain: "ntfy.sh" + smtp-server-addr-prefix: "ntfy-" + ``` + +In addition to configuring the ntfy server, you have to create two DNS records (an [MX record](https://en.wikipedia.org/wiki/MX_record) +and a corresponding A record), so incoming mail will find its way to your server. Here's an example of how `ntfy.sh` is +configured (in [Amazon Route 53](https://aws.amazon.com/route53/)): + +
+ ![DNS records for incoming mail](static/img/screenshot-email-publishing-dns.png){ width=600 } +
DNS records for incoming mail
+
+ ## Behind a proxy (TLS, etc.) !!! warning If you are running ntfy behind a proxy, you must set the `behind-proxy` flag. Otherwise, all visitors are @@ -66,7 +110,7 @@ as opposed to the remote IP address. If the `behind-proxy` flag is not set, all be counted as one, because from the perspective of the ntfy server, they all share the proxy's IP address. === "/etc/ntfy/server.yml" - ``` + ``` yaml # Tell ntfy to use "X-Forwarded-For" to identify visitors behind-proxy: true ``` diff --git a/docs/publish.md b/docs/publish.md index 85cfaf86..c75ea941 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -691,6 +691,28 @@ Here's what that looks like in Google Mail:
E-mail notification
+## E-mail publishing +You can publish messages to a topic via e-mail, i.e. by sending an email to a specific address. For instance, you can +publish a message to the topic `sometopic` by sending an e-mail to `ntfy-sometopic@ntfy.sh`. This is useful for e-mail +based integrations such as for statuspage.io (though these days most services also support webhooks and HTTP calls). + +Depending on the [server configuration](config.md#e-mail-publishing), the e-mail address format can have a prefix to +prevent spam on topics. For ntfy.sh, the prefix is configured to `ntfy-`, meaning that the general e-mail address +format is: + +``` +ntfy-$topic@ntfy.sh +``` + +As of today, e-mail publishing only supports adding a [message title](#message-title) (the e-mail subject). Tags, priority, +delay and other features are not supported (yet). Here's an example that will publish a message with the +title `You've Got Mail` to topic `sometopic` (see [ntfy.sh/sometopic](https://ntfy.sh/sometopic)): + +
+ ![e-mail publishing](static/img/screenshot-email-publishing-gmail.png){ width=500 } +
Publishing a message via e-mail
+
+ ## Advanced features ### Message caching @@ -846,7 +868,7 @@ but just in case, let's list them all: |---|---| | **Message length** | Each message can be up to 512 bytes long. Longer messages are truncated. | | **Requests** | By default, the server is configured to allow 60 requests at once, and then refills the your allowed requests bucket at a rate of one request per 10 seconds. You can read more about this in the [rate limiting](config.md#rate-limiting) section. | -| **E-mails** | By default, the server is configured to allow 16 e-mails at once, and then refills the your allowed e-mail bucket at a rate of one per hour. You can read more about this in the [rate limiting](config.md#rate-limiting) section. | +| **E-mails** | By default, the server is configured to allow sending 16 e-mails at once, and then refills the your allowed e-mail bucket at a rate of one per hour. You can read more about this in the [rate limiting](config.md#rate-limiting) section. | | **Subscription limits** | By default, the server allows each visitor to keep 30 connections to the server open. | | **Total number of topics** | By default, the server is configured to allow 5,000 topics. The ntfy.sh server has higher limits though. | diff --git a/docs/static/img/screenshot-email-publishing-dns.png b/docs/static/img/screenshot-email-publishing-dns.png new file mode 100644 index 0000000000000000000000000000000000000000..d67b057a7e92f224147b20b15dbb9fdad566fa08 GIT binary patch literal 17218 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 N!PC{xWt~$(699C1rN2fd+w4L*%6;w7eJh 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 literal 0 HcmV?d00001 diff --git a/server/server.yml b/server/server.yml index bc1bd573..847b7d63 100644 --- a/server/server.yml +++ b/server/server.yml @@ -60,7 +60,15 @@ # smtp-sender-pass: # smtp-sender-from: -# XXXXXXXXXXXXXXXXXXXXxx +# If enabled, ntfy will launch a lightweight SMTP server for incoming messages. Once configured, users can send +# emails to a topic e-mail address to publish messages to a topic. +# +# - smtp-server-listen defines the IP address and port the SMTP server will listen on, e.g. :25 or 1.2.3.4:25 +# - smtp-server-domain is the e-mail domain, e.g. ntfy.sh +# - smtp-server-addr-prefix is an optional prefix for the e-mail addresses to prevent spam. If set to "ntfy-", +# for instance, only e-mails to ntfy-$topic@ntfy.sh will be accepted. If this is not set, all emails to +# $topic@ntfy.sh will be accepted (which may obviously be a spam problem). +# # smtp-server-listen: # smtp-server-domain: # smtp-server-addr-prefix: