@@ -1,164 +1,740 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Email Alerts
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ============
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Email Alerts And Notifications
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Beginning with version 2.7, Fossil supports the ability to send
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- email messages to subscribers alerting them to changes in the repository.
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Subscribers can request an email notification of the following kinds
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of changes:
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * New check-ins
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * Changes to any ticket
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * Changes to any wiki page
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- * New forum posts
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Email Alerts
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Overview
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Beginning with version 2.7, Fossil can send email messages to
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ subscribers to alert them to changes in the repository:
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * New [checkins](/help?cmd=ci)
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * [Ticket](./tickets.wiki) changes
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * [Wiki](./wikitheory.wiki) page changes
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * New and edited [forum](./forum.wiki) posts
15 12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
* Announcements
16 13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Subscribers can either elect to receive emails as soon as these events happen,
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Subscribers can elect to receive emails as soon as these events happen,
18 15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
or they can receive a daily digest of the events instead.
19 16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Email alerts are sent by a [Fossil server](./server.wiki). You must
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- have a server [set up to make use of email alerts](#setup). Email
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- alerts do not currently work if you are only using Fossil from the
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Email alerts are sent by a [Fossil server](./server.wiki), which must be
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [set up](#quick) by the Fossil administrator to send email.
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Email alerts do not currently work if you are only using Fossil from the
23 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
command line.
24 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Users and Subscribers
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil makes a distinction between "users" and "subscribers". A
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- user is someone with a username and password — someone who can
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- log in. A subscriber is someone who receives email alerts. Users
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- can also be subscribers and subscribers can be users, but that does
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- not have to be the case. It is possible to be a user without being
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a subscriber and to be a subscriber without being a user.
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- In the repository database file, users are tracked with the USER table
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- and subscribers are tracked via the SUBSCRIBER table.
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <a id="setup"></a>
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Activating Email Alerts
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Email alerts are turned off by default. To activate them, log into
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the Fossil server as an administrator and visit the
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [Admin/Notification](/setup_notification)
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setup page. ([`/setup_notification`](/setup_notification))
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Important: Email alerts are configured using Admin/Notification, not
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Admin/Email-Server. The Email-Server setup screen is used to configure
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a different subsystem within Fossil.
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The Admin/Notification setup screen lets you configure how Fossil should
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- send email for alerts. There are some required fields at the top of the
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- screen for elements such as the "From:" address for outgoing emails,
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the URL for the Fossil server, and a nickname for the repository that
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- will appear in the "Subject:" line of outgoing emails. But the key
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- setup parameter is the "Email Send Method".
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil supports multiple methods for sending email alerts:
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 1. Pipe the email message text into a command, such as `sendmail`.
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 2. Store email messages as individual files in a directory and let
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- some other process set up by the administrator take care of
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- reading and forwarding those files.
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 3. Store email messages as entries in an SQLite database where
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- some external process and read and forward the emails.
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 4. Send emails to an SMTP Relay.
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- 5. Send emails directly to the recipients via SMTP.
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil 2.7 does not support method (5). Work on supporting that method
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- is still in progress.
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The self-hosting Fossil repository at <https://www.fossil-scm.org/> currently
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- uses method (3). Outgoing email messages are added to an SQLite database
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- file. A separate daemon process continously monitors that database file,
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- extracts email messages as they are added, and hands them off to
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "procmail" to be sent on to the final recipient. The self-hosting
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil repository uses this technique rather than method (1) because
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- it is running inside of a restrictive chroot jail which is unable to
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- hand off messages to "procmail" directly. The daemon that monitors the
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- email database is a [short TCL script](/file/tools/email-sender.tcl).
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- That daemon is started automatically by adding this line:
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /usr/bin/tclsh /home/www/fossil/email-sender.tcl &
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- To the `/etc/rc.local` file of the Ubuntu server that hosts the
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- repository.
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- After making necessary changes to the Admin/Notification page, test
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- those changes by clicking the "[Send Announcement](/announce)" link
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- at the top of the page. Fill in your email address in the "To:"
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- line and a test message below, and press "Send Message" to verify that
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- outgoing email is working.
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- <a id="cap7"></a>
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Once email notification is working, one must also adjust user permissions
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- to allow users to subscribe to email notification. On the
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Setup/User page, under the permissions for each user, is a new capability
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- called "Email Alerts". The corresponding capability letter is "7".
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- That new "7" capability must be enabled in order for
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- users to be able to become subscribers. To allow anonymous passers-by
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- on the internet to subscribe, simply enable "Email Alerts" for the
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "nobody" user category. To require that the user solve a simple CAPTCHA
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- first, add it to the "anonymous" user category instead.
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Signing Up For Email Notification
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Users and/or anonymous passers-by can visit the
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [`/subscribe`](/subscribe) page to sign
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- up for email notification.
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If your users are getting the following complaint from Fossil:
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ A bit of terminology: Fossil uses the terms "email alerts" and
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "notifications" interchangeably. We stick to the former term in this
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ document except when referring to parts of the Fossil UI still using the
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ latter term.
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Setup Prerequisites
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Much of this document describes how to set up Fossil's email alert
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ system. To follow this guide, you will need a Fossil UI browser window
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ open to the [Admin → Notification](/setup_notification) Fossil UI screen
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ on the the Fossil server that will be sending these email alerts, logged
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ in as a user with Admin capability. It is not possible to work on a
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ clone of the server's repository and push the configuration changes up
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to that repo as an Admin user, [on purpose](#backup).
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **Important:** Do not confuse that screen with Admin → Email-Server,
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ which sets up a different subsystem within Fossil. That feature is
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ related to this document's topic, but it is currently incomplete, so we
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do not cover it at this time.
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="cd"></a>
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ You will also need a CLI window open with its working directory changed
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to a checkout directory of the Fossil repository you are setting up to
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ send email. If you don't `cd` to such a checkout directory first,
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ you'll need to add `-R /path/to/repo.fossil` to each `fossil` command
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ below to tell Fossil which repository you mean it to apply the command
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to.
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ There are other prerequisites for email service, but since they vary
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ depending on the configuration you choose, we'll cover these inline
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ below.
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="quick"></a>
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Quick Email Service Setup
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you've already got a working Postfix, Exim, or Sendmail server on the
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ machine running your Fossil instance(s), and you aren't using Fossil's
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `chroot` feature to wall Fossil off from the rest of the machine, it's
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fairly simple to set up email alerts.
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (Otherwise, skip [ahead](#advanced) to the sections on advanced email
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ service setup.)
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This is our "quick setup" option even though setting up an SMTP mail
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ server is not trival, because there are many other reasons to have such
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a server set up already: internal project email service, `cron`
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ notifications, server status monitoring notifications...
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ With that out of the way, the Fossil-specific steps are easy:
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1. Go to [Admin → Notification](/setup_notification) and fill out all
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ of the **Required** fields:
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * **Canonical server URL** — Use the suggested URL
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * **"From" email address** — `[email protected] ` is
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ traditional, but suit yourself
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * **Repository nickname** — See the suggested examples on the web page.
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 2. Set "Email Send Method" to "Pipe to a command"
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 3. Set the "Administrator email address" to a suitable valid email
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ address on that machine. It could be the same value you used for
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the "From" address above, or it could be a different value like
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `[email protected] `.
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Save your changes.
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ At the command line, say
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil set email-send-command
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If that gives a blank value instead of `sendmail -ti`, say
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil set email-send-command "sendmail -ti"
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to force the setting. That works around a [known
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bug](https://fossil-scm.org/forum/forumpost/840b676410) which may be
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ squished by the time you read this.
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you're running Postfix or Exim, you might think that command is
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wrong, since you aren't running Sendmail. These mail servers provide a
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `sendmail` command for compatibility with software like Fossil that has
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ no good reason to care exactly which SMTP server implementation is
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ running at a given site. There may be other SMTP servers that also
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ provide a compatible `sendmail` command, in which case they may work
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with Fossil using the same steps as above.
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="status"></a>
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you reload the Admin → Notification page, the Status section at the
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ top should show:
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Outgoing Email: Piped to command "sendmail -ti"
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Pending Alerts: 0 normal, 0 digest
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Subscribers: 0 active, 0 total
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Before you move on to the next section, you might like to read up on
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [some subtleties](#pipe) with the "pipe to a command" method that we did
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ not cover above.
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="usage"></a>
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Usage and Testing
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Now that email service from Fossil is set up, you can test it and begin
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ using it.
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="sub" name="subscribe"></a>
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Subscribing to Alerts
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ In the Status output above, we saw that there are no subscribers, so the
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ next step is to add the first one.
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Go to the `/subscribe` page on your Fossil instance to sign up for email
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ alerts. At the very least, you will need to sign up for "Forum Posts"
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and "Announcements" to complete the testing steps below.
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you're logged in with a Fossil repository user account and put the
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ same user name and email address into this forum as you used for your
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ user information under Admin → Users, Fossil will simply tie your alert
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ preferences to your login record, and the email address in your user's
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Contact Info field will be considered already-verified. Otherwise,
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil will create an alert-only record, and you will have to verify the
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ email address before Fossil will send alerts to it.
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This shows a key aspect of the way Fossil's email alerts system works,
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ by the way: a user can be signed up for email alerts without having a
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ full-fledged Fossil user account. Only when both user names are the same
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ are the two records tied together under the hood. For more on this, see
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [Users vs Subscribers below](#uvs).
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you are seeing the following complaint from Fossil:
110 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
<blockquote>
112 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Use a different login with greater privilege than FOO to access
113 162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/subscribe
114 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
</blockquote>
115 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ...then you forgot to [give capability 7](#cap7) to that user or to a
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- user category that the user is a member of.
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ...then the repository's administrator forgot to [give the Alerts capability](#cap7)
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to that user or to a user category that the user is a member of.
118 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- After signing up, a single verification email
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- is sent. The new subscriber must click a link on that email in order to
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- activate the subscription.
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ After a subscriber signs up for alerts for the first time, a single
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verification email is sent to that subscriber's given email address.
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The new subscriber must click a link in that email in order to activate
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the subscription.
122 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
123 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Subscription verification emails are only sent once. This is a defense
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- against malicious robots that try to harass innocent internet users
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- by having subscription pages send multiple verification emails.
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- If the initial subscription verification does not go through correctly,
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- an administrator must intervene to reset the subscription.
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Every subscriber has a long random hexadecimal security code that serves
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- as their password. All email notifications contain a link back to the
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil server, incorporating this security code, which allows the
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- subscriber to adjust their subscription options.
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Administrator Activities
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The repository administrator has unlimited control over individual
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- subscriptions. The "[List Subscribers](/subscribers)" button at the top
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of the Setup/Notification screen gives a list of subscribers. Clicking on
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- any subscriber link allows the administrator to adjust the subscription.
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- To unsubscribe, first select the "unsubscribe" checkbox, then press the
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "Unsubscribe" button.
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The "verified" checkbox determines whether or not an email address has
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- been verified. This can be enabled or disabled manually by the
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- administrator.
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Cloning, Syncing, and Backups
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The Setup/Notification settings are not replicated using clone or sync.
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- In a network of peer repositories, you only want one repository sending
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- email notifications. If you were to replicate the email notification
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- settings to a separate repository, then subscribers would get multiple
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- notifications for each event, which would be bad.
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ against malicious robots that try to harass innocent Internet users by
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ having subscription pages send multiple verification emails. If the
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ initial subscription verification does not go through correctly, an
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ administrator must [intervene](#admin) to reset the subscription.
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Every subscriber-only email address has a [long random hexadecimal
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ security code](#scode) that serves in place of a password. All email
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ alerts contain a link in their footer back to the Fossil server,
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incorporating this security code, which allows the subscriber to adjust
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ their subscription options. If a user doesn't have any of those emails,
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ they can request a link via email by visiting the `/alerts` or
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `/unsubscribe` page on the repository.
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Those with Fossil repository logins can adjust their email alert
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ settings by visiting the `/alerts` page on the repository. With the
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default skin, you can get there by clicking the "Logout" link in the
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upper right corner of any Fossil UI page then clicking the "Email
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Alerts" link. That link is also available via the Sitemap (`/sitemap`)
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and via the default skin's hamburger menu (☰).
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="unsub" name="unsubscribe"></a>
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Unsubscribing
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ To unsubscribe from alerts, visit the `/alerts` page on the repository,
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ click the "Unsubscribe" button, then check the "Unsbuscribe" checkbox to
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verify your action and press the "Unsubscribe" button a second time.
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This interlock is intended to prevent accidental unsubscription.
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="test"></a>
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Test Email Service
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The easiest way to test email sending from Fossil is via the "[Send
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Announcement](/announce)" link at the top of the "Email Notification
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Setup" page. Put your email address in the "To:" line and a test
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ message below, then press "Send Message" to verify that outgoing email
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is working.
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Another method is from the command line:
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil alerts test-message [email protected] --body README.md --subject Test
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ That should send you an email with "Test" in the subject line and the
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contents of your project's `README.md` file in the body.
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ That command assumes that your project contains a "readme" file, but of
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ course it does, because you have followed the [Programming Style Guide
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Checklist][cl], right? Right.
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [cl]: https://sendgrid.com/blog/programming-style-guide-checklist/
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="cap7"></a>
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### User Capabilities
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Once email alerts are working, one must also adjust user permissions to
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ allow users to subscribe to email alerts. In the capability list for
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ each user on the Admin → Users page is a new capability called "Email
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Alerts". The corresponding capability letter is "7", which you must
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ give to any user that needs to use the subscription setup pages,
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `/subscribe` and `/alerts`.
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ To allow any passer-by on the Internet to subscribe, give the "Email
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Alerts" capability to the "nobody" user category. To require that a
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ person solve a simple CAPTCHA first, give that capability to the
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "anonymous" user category instead.
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="first" name="frist"></a>
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### First Post
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ I suggest taking the time to compose a suitable introductory message
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ especially for your project's forum, one which a new user would find
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ helpful.
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Wait a few seconds, and you should receive an email alert with the
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ post's subject and body text in the email.
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="trouble"></a>
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Troubleshooting
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If email alerts aren't working, there are several useful commands you
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ can give to figure out why.
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (Be sure to [`cd` into a repo checkout directory](#cd) first!)
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil alerts status
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This should give much the same information as you saw [above](#status).
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ One difference is that, since you've created a forum post, the
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `pending-alerts` value should only be zero if you did in fact get the
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ requested email alert. If it's zero, check your mailer's spam folder. If
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ it's nonzero, continue with these troubleshooting steps.
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil backoffice
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ That forces Fossil to run its ["back office" process](./backoffice.md).
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Its only purpose at the time of this writing is to push out alert
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ emails, but it might do other things later. Sometimes it can get stuck
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and needs to be kicked. For that reason, you might want to set up a
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ crontab entry to make sure it runs occasionally.
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil alerts send
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This should also kick off the backoffice processing, if there are any
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pending alerts to send out.
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil alert pending
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Show any pending alerts. The number of lines output here should equal
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the [status output above](#status).
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil test-add-alerts f5900
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil alert send
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Manually create an email alert and push it out immediately.
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The `f` in the first command's final parameter means you're scheduling a
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "forum" alert. The integer is the ID of a forum post, which you can find
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ by visiting `/timeline?showid` on your Fossil instance.
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The second command above is necessary because the `test-add-alerts`
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ command doesn't kick off a backoffice run.
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ $ fossil ale send
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This only does the same thing as the final command above, rather than
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ send you an ale, as you might be hoping. Sorry.
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="advanced"></a>
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Advanced Email Setups
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil offers several methods of sending email:
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1. Pipe the email message text into a command.
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 2. Store email messages as entries in a SQLite database.
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 3. Store email messages as individual files in a directory.
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 4. Send emails to an SMTP relay.
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 5. Send emails directly to the recipients via SMTP.
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This wide range of options allows Fossil to talk to pretty much any
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SMTP setup.
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The first four options let Fossil delegate email handling to an existing
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [MTA][mta] so that Fossil does not need to implement the [roughly two
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dozen][mprotos] separate [RFCs][rfcs] required in order to properly
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ support SMTP email in this complex world we've built. As well, this
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ design choice means you do not need to do duplicate configuration, such
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ as to point Fossil at your server's TLS certificate in order to support
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ users behind mail servers that require STARTTLS encryption.
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [mprotos]: http://sqlite.1065341.n5.nabble.com/Many-ML-emails-going-to-GMail-s-SPAM-tp98685p98722.html
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [rfcs]: https://en.wikipedia.org/wiki/Request_for_Comments
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="pipe"></a>
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Method 1: Pipe to a Command
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This is our ["quick setup" option](#quick) above, but there are some
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ details we ignored which we'll cover now.
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil pipes the email message in [RFC 822 format][rfc822] to the
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ standard input of the command you gave as the "Email Send Method",
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ defaulting to `sendmail -ti`. This constitutes a protocol between Fossil
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and the SMTP [message transfer agent (MTA)][mta]. Any other MTA which
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ speaks the same protocol can be used in place of the most common
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ options: Sendmail, Exim, and Postfix.
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The `-t` option tells the command to expect the list of email recipients
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ in a `To` header in the RFC 822 message presented on its standard input.
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Without this option, the `sendmail` command expects to receive the
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ recipient list on the command line, but that's not possible with the
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ current design of this email sending method. Therefore, if you're
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ attempting to use a less common MTA which cannot parse the recipient
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ list from the `To` header in the email message, you might need to look
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for a different MTA.
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The `-i` option is only needed for MTAs that take a dot/period at the
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ beginning of a line of standard input text as "end of message." Fossil
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ doesn't attempt to escape such dots, so if the line wrapping happens to
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ occur such that a dot or period in an alert message is at the beginning
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ of a line, you'll get a truncated email message without this option.
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Statistically, this will happen about once every 70 or so messages, so
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ it is important to give this option if your MTA treats leading dots on a
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ line this way.
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="msmtp"></a>
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ We believe the [`msmtp`][msmtp] SMTP client is compatible with this
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ protocol if you give it the `-t` option. To our knowledge, this remains
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ untested, but if it works, this would be a useful option on a server
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ hosting a Fossil repository which doesn't otherwise require a separate
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SMTP server for other purposes.
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ It is probably also possible to configure [`procmail`][pmdoc] to work
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with this protocol. If you know how to do it, a patch to this document
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ or a how-to on [the Fossil forum][ff] would be appreciated.
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [ff]: https://fossil-scm.org/forum/
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [msmtp]: https://marlam.de/msmtp/
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [mta]: https://en.wikipedia.org/wiki/Message_transfer_agent
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [pmdoc]: http://pm-doc.sourceforge.net/doc/
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [rfc822]: https://www.w3.org/Protocols/rfc822/
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="db"></a>
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Method 2: Store in a Database
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The self-hosting Fossil repository at <https://www.fossil-scm.org/>
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ currently uses this method rather than [the pipe method](#pipe) because
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ it is running inside of a restrictive [chroot jail][cj] which is unable
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to hand off messages to the local MTA directly.
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ When you configure a Fossil server this way, it adds outgoing email
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ messages to a SQLite database file. A separate daemon process can then
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ extract those messages for further disposition.
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil includes a copy of [the daemon](/file/tools/email-sender.tcl)
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ used on `fossil-scm.org`: it is just a short Tcl script that
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ continuously monitors this database for new messages and hands any that
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ it finds off to a local MTA using the same [pipe to MTA protocol](#pipe)
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ as above.
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ In this way, outbound email alerts escape the chroot jail without
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ requiring that we insert a separate MTA configuration inside that jail.
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ We only need to arrange that the same SQLite DB file be visible both
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inside and outside the chroot jail, which we do by naming the database
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file in the "Store Emails In This Database" setting under Admin →
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Notification. The Tcl script has this path hard-coded as
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `/home/www/fossil/emailqueue.db`, but you will probably need to adjust
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that for your local purposes.
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This method may work with other similar technologies besides `chroot`:
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Docker containers, LXC containers, BSD jails, Solaris zones, etc.
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ With suitable file share mappings, this method may even work with
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ virtual machine or distributed computing setups where the MTA and Fossil
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ servers are not on the same machine, though beware the [risk of DB
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ corruption][rdbc] if used with a file sharing technology that doesn't
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ use proper file locking.
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ You can start this Tcl script as a daemon automatically on most Unix and
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Unix-like systems by adding the following line to the `/etc/rc.local`
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file of the server that hosts the repository sending email alerts:
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /usr/bin/tclsh /home/www/fossil/email-sender.tcl &
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [cj]: https://en.wikipedia.org/wiki/Chroot
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [rdbc]: https://www.sqlite.org/howtocorrupt.html#_filesystems_with_broken_or_missing_lock_implementations
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="dir"></a>
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Method 3: Store in a Directory
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This method is functionally very similar to [the DB method](#db),
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ differing only in that messages are written to a directory in the
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ filesystem. You should therefore read that section and make the minor
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ adjustments required by the storage method.
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This method may work over a file sharing mechanism that doesn't do file
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ locking properly, as long as the reading process is somehow restricted
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from reading a message file as it's being written.
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ It might be useful in testing and debugging to temporarily switch to
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this method, since you can easily read the generated email messages
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ without needing to involve [an MTA][mta].
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="relay"></a>
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Method 4: SMTP Relay
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ In this configuration, the Fossil server contacts an open SMTP relay and
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sends the messages to it. This method is only appropriate when:
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1. You have a local MTA that doesn't accept [the pipe
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ protocol](#pipe).
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 2. The MTA is willing to accept anonymous submissions, since Fossil
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ currently has no way to authenticate itself to the MTA. This is [an
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unsafe configuration][omr] in most cases, but some SMTP servers make
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ an exception for connections coming from a `localhost` or LAN
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ address, choosing to accept such submissions as inherently safe.
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you have a local MTA meeting criterion #1 but not #2, we'd suggest
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ using a more powerful SMTP client such as [msmtp](#msmtp) along with one
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ of the other methods above.
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [omr]: https://en.wikipedia.org/wiki/Open_mail_relay
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="direct"></a>
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Method 5: Direct SMTP Send
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ As of Fossil 2.7, the code to support this method is incomplete, so you
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cannot currently select it as an option in Admin → Notification.
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="uvs"></a>
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Users vs Subscribers
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil makes a distinction between "users" and "subscribers". A user is
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ someone with a username and password: that is, someone who can log into
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the Fossi repository. A subscriber is someone who receives email
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ alerts. Users can also be subscribers and subscribers can be users, but
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that does not have to be the case. It is possible to be a user without
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ being a subscriber and to be a subscriber without being a user.
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ In the repository database file, users are tracked with the `user` table
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and subscribers are tracked via the `subscriber` table.
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="admin"></a>
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Administrator Activities
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The "[List Subscribers](/subscribers)" button at the top of the Admin →
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Notification screen gives a list of subscribers, which gives a Fossil
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ server administrator a lot of power over those subscriptions.
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Clicking an email address in this subscriber list opens the same
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `/alerts` page that the user can see for their own subscription, but
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with more information and functionality than normal users get:
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * Subscription creation and modification timestamps.
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The IP address the user had when they last made a change via either
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `/subscribe` or `/alert`.
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The user's login name, if they are not [a mere subscriber](#uvs). A
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil Admin user is allowed to modify this, either to tie a
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ subscription-only record to an existing Fossil user account or to
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break that tie.
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The "Do not call" checkbox allows a Fossil Admin user to mark a given
510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ email address so that Fossil never sends email to that address. This
511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is distinct from unsubscribing that email address because it prevents
512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil from accepting a new subscription for that address.
513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The Verified checkbox is initially unchecked for subscriber-only
515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ email addresses until the user clicks the link in the verification
516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ email. This checkbox lets the Fossil Admin user manually verify the
517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ user, such as in the case where the verification email message got
518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lost. Unchecking this box does not cause another verification email
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to be sent.
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This screen also allows a Fossil Admin user to perform other activities
522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ on behalf of a subscriber which they could do themselves, such as to
523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [unsubscribe](#unsub) them.
524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="backup"></a>
527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Cloning, Syncing, and Backups
528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The Admin → Notification settings are not replicated using clone or
530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sync, and it is not possible to push such settings from one repository
531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to another. In a network of peer repositories, you only want one
532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ repository sending email alerts. If you were to replicate the email
533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ alert settings to a separate repository, then subscribers would get
534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ multiple alerts for each event, which would be bad.
155 535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
156 536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
However, the subscriber list can be synced for backup purposes. Use the
157 537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
[`fossil config pull subscriber`](/help?cmd=configuration) command to
158 538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pull the latest subscriber list from a server into a backup repository.
539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The `push`, `export`, and `import` commands all work similarly.
541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="pages" name="commands"></a>
544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Controlling the Email Alert System
545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This section collects the list of Fossil UI pages and CLI commands that
547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ control the email alert system, some of which have not been mentioned so
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ far:
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Commands:
551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The [`alerts`](/help?cmd=alerts) command
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The [`test-alert`](/help?cmd=test-alert) command
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The [`test-add-alerts`](/help?cmd=test-add-alerts) command
555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Web pages available to users and subscribers:
557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The [`/subscribe`](/help?cmd=/subscribe) page
559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The [`/alerts`](/help?cmd=/alerts) page
560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The [`/unsubscribe`](/help?cmd=/unsubscribe) page
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The [`/contact_admin`](/help?cmd=/contact_admin) page
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Administrator-only web pages:
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The [`/setup_notification`](/help?cmd=/setup_notification) page
566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The [`/subscribers`](/help?cmd=/subscribers) page
567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="design"></a>
570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Design of Email Alerts
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This section describes the low-level design of the email alert system in
573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil. This expands on the high-level administion focused material
574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ above with minimal repetition.
575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This section assumes expert-level systems knowledge. If the material
577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ above sufficed for your purposes, feel free to skip this section, which
578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ runs to the end of this document.
579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="datades"></a>
582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Data Design
583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ There are three new tables in the repository database, starting with
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil 2.7. These tables are not created in new repositories by
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default. The tables only come into existence as needed when email
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ alerts are configured and used.
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * <b>SUBSCRIBER</b> →
591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The subscriber table records the email address for people who
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ want to receive email notifications. Each subscriber has a
593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `subscriberCode` which is a random 32-byte blob that uniquely
594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ identifies the subscriber. There are also fields to indicate
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ what kinds of notifications the subscriber wishes to receive,
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ whether or not the email address of the subscriber has been
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ verified, etc.
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * <b>PENDING\_ALERT</b> →
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The PENDING\_ALERT table contains records that define events
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ about which alert emails might need to be sent.
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ A pending\_alert always refers to an entry in the
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ EVENT table. The EVENT table is part of the standard schema
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and records timeline entries. In other words, there is one
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row in the EVENT table for each possible timeline entry. The
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PENDING\_ALERT table refers to EVENT table entries for which
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ we might need to send alert emails.
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * <b>EMAIL\_BOUNCE</b> →
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This table is intended to record email bounce history so that
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ subscribers with excessive bounces can be turned off. That
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ logic has not yet been implemented so the EMAIL\_BOUNCE table
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is currently unused.
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ As pointed out above, ["subscribers" are distinct from "users"](#uvs).
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The SUBSCRIBER.SUNAME field is the optional linkage between users and
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ subscribers.
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="stdout"></a>
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### The "stdout" Method
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The [list of mail sending methods](#advanced) above left out an
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ internal-only method called "stdout" which simply writes the text of the
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ email message on standard output. The "stdout" method is used for
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ testing and debugging. If you need something similar and can't modify
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ your local Fossil instance to use this method, you might temporarily
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch to [the "dir" method](#dir) instead.
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="msgfmt"></a>
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Message Format
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The email messages generated by Fossil have a [well-formed
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ header][rfc822]. The downstream processing is expected to extract the
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "To:", "From:", "Subject:" and whatever other attributes it needs from
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the email header text.
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ These emails use the `text/plain` MIME type with the UTF-8 character
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set. We currently use a transfer encoding of `quoted-printable`, but
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ there is commented-out code in Fossil to switch to `base64` encoding,
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ which Fossil used in the early days leading up to the 2.7 release.
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you switch Fossil back to `base64` mode, you may want to build a
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ utility program that ships in the Fossil source tree named
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ["tools/decode-email.c"](/file/tools/decode-email.c) which can decode
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ these messages into a human-readable format.
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="inbound" name="bounces"></a>
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Dealing with Inbound Email
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Inbound email messages — for example, bounces from failed alert emails —
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ should be relayed to the `fossil email inbound` command. That command
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is currently a no-op place-holder. At some point, we will need to
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ design and write a bounce-message processing system for Fossil.
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="password" name="scode" name="verification"></a>
660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Passwords vs Subscriber Codes
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ When anonymous passers-by on the Internet sign up for email alerts,
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ their email address must first be verified. An email message is sent to
664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the address supplied inviting the user to click on a link. The link
665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ includes a pseudorandom 128-bit blob encoded as 32 hexadecimal digits,
666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ which serves in place of a password for that email address. (This is
667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stored in the database as `subscriber.subscriberCode`.) If anyone visits
668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the link, the email address is verified.
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Knowledge of the `subscriberCode` is sufficient to control a
671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ subscription.
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Because this code is included in plain text in email alert messages, it
674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is not as secure as a separate password, but it has several virtues:
675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * It is easier for the average subscriber to deal with in that they
677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ don't have to come up with yet another password and store it safely.
678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * If the `subscriberCode` is stolen, the worst that can happen is that
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the thief can change that email address's subscription settings.
681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Contrast a password which may be shared with other services, which
682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ then compromises those other services.
683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * No PII other than the subscriber's email address is available to an
685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ attacker with the `subscriberCode`. Nor can knowledge of the
686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `subscriberCode` lead to a email flood or other annoyance attack, as
687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ far as I can see.
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If the `subscriberCodes` for a Fossil repository are ever compromised,
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ new ones can be generated as follows:
691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UPDATE subscriber SET subscriberCode=randomblob(32);
693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Since this then affects all new email alerts going out from Fossil, your
695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ end users may never even realize that they're getting new codes, as long
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ as they don't click on the URLs in the footer of old alert messages.
697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ With that in mind, a Fossil server administrator could choose to
699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ randomize the `subscriberCodes` periodically, such as just before the
700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ daily digest emails are sent out each day.
701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **Important:** All of the above is distinct from the passwords for users
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with a Fossil repository login. Such users also have subscriber codes,
704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ but those codes can only be used to modify the user's email alert
705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ settings. That code cannot allow a user to log into the user's Fossil
706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ repository account.
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="processing"></a>
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ### Internal Processing Flow
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Almost all of the email alert code is found in the
713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [`src/alerts.c`](/file/src/alerts.c) source file.
714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ When email alerts are enabled, a trigger is created in the schema
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (`email_trigger1`) that adds a new entry to the `PENDING_ALERT` table
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ every time a row is added to the `EVENT` table. During a `fossil
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rebuild`, the `EVENT` table is rebuilt from scratch; since we do not
719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ want users to get alerts for every historical check-in, the trigger is
720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ disabled during `rebuild`.
721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Email alerts are sent out by the `alert_send_alerts()` function, which
723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is normally called automatically due to the `email-autoexec` setting,
724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ which defaults to enabled. If that setting is disabled or if the user
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ simply wants to force email alerts to be sent immediately, they can give
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a `fossil alert send` command, such as via a `cron` script. Each time
727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this function is called, the alert messages are moved further down the
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ chain, so you cannot cause duplicate alerts by calling it too often.
729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Digests are handled by recording the time of the last digest in the
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ `email-last-digest` setting, and only sending a new digest if the
732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ current time is one day or later after the last digest.
733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Individual emails are sent to each subscriber. I (drh) ran tests and
735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ found that I could send about 1200 emails/second, which is fast enough
736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that I do not need to resort to trying to notify multiple subscribers
737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with a single email. Because each subscriber gets a separate email, the
738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ system can include information in the email that is unique to the
739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ subscriber, such as a link to the page to edit their subscription. That
740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ link includes the `subscriberCode`.
159 741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
160 742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D ELETED www/emaildesign.md