summary refs log tree commit diff
path: root/gnu
diff options
context:
space:
mode:
authorTanguy Le Carrour <tanguy@bioneland.org>2023-05-17 10:51:44 +0200
committerLudovic Courtès <ludo@gnu.org>2023-05-30 00:15:30 +0200
commit110462bb2f1678fb0147a5845b2b48d0566ce0b4 (patch)
tree8f17b98ac4d00309f1a508a5d40850ae708e22ac /gnu
parent4ebefac412147b8dcf076d57f624e72b8f583bc5 (diff)
downloadguix-110462bb2f1678fb0147a5845b2b48d0566ce0b4.tar.gz
home: services: Add msmtp service.
* gnu/home/services/mail.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
* doc/guix.texi (Mail Home Services): New node.

Co-authored-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'gnu')
-rw-r--r--gnu/home/services/mail.scm222
-rw-r--r--gnu/local.mk3
2 files changed, 224 insertions, 1 deletions
diff --git a/gnu/home/services/mail.scm b/gnu/home/services/mail.scm
new file mode 100644
index 0000000000..5445c82c67
--- /dev/null
+++ b/gnu/home/services/mail.scm
@@ -0,0 +1,222 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2023 Tanguy Le Carrour <tanguy@bioneland.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu home services mail)
+  #:use-module (guix gexp)
+  #:use-module (gnu services)
+  #:use-module (gnu services configuration)
+  #:use-module (gnu home services)
+  #:use-module (gnu home services shepherd)
+  #:use-module (gnu packages mail)
+  #:use-module (ice-9 string-fun)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
+  #:export (home-msmtp-configuration
+            home-msmtp-configuration?
+            home-msmtp-configuration-defaults
+            home-msmtp-configuration-accounts
+            home-msmtp-configuration-default-account
+            home-msmtp-configuration-extra-content
+            home-msmtp-service-type
+            msmtp-configuration
+            msmtp-configuration-auth?
+            msmtp-configuration-tls?
+            msmtp-configuration-tls-starttls?
+            msmtp-configuration-tls-trust-file
+            msmtp-configuration-log-file
+            msmtp-configuration-host
+            msmtp-configuration-port
+            msmtp-configuration-user
+            msmtp-configuration-from
+            msmtp-configuration-password-eval
+            msmtp-configuration-extra-content
+            msmtp-account
+            msmtp-account-name
+            msmtp-account-configuration))
+
+(define-maybe string (prefix msmtp-configuration-))
+(define-maybe boolean (prefix msmtp-configuration-))
+(define-maybe integer (prefix msmtp-configuration-))
+
+;; Serialization of 'msmtp'.
+(define (uglify-symbol field-name)
+  (let* ((name (symbol->string field-name))
+         (ugly-name (string-replace-substring name "-" "_")))
+    (if (string-suffix? "?" ugly-name)
+      (string-drop-right ugly-name 1)
+      ugly-name)))
+
+(define (msmtp-configuration-serialize-boolean field-name value)
+  #~(string-append #$(uglify-symbol field-name) " "
+                   (if #$value "on" "off") "\n"))
+
+(define (msmtp-configuration-serialize-string field-name value)
+  #~(string-append #$(uglify-symbol field-name) " " #$value "\n"))
+
+(define (msmtp-configuration-serialize-maybe-string-no-underscore field-name value)
+  #~(if #$(maybe-value-set? value)
+      (string-append
+        #$(string-replace-substring (uglify-symbol field-name) "_" "") " " #$value "\n")
+      ""))
+
+(define (msmtp-configuration-serialize-integer field-name value)
+  #~(string-append #$(uglify-symbol field-name) " "
+                   (number->string #$value) "\n"))
+
+(define (msmtp-configuration-serialize-extra-content field-name value)
+  #~(if (string=? #$value "") "" (string-append #$value "\n")))
+
+(define (msmtp-account-serialize-name field-name value)
+  #~(string-append "\naccount " #$value "\n"))
+
+(define (msmtp-account-serialize-msmtp-configuration field-name value)
+  #~(string-append #$(serialize-configuration value msmtp-configuration-fields)))
+
+(define (home-msmtp-configuration-serialize-list-of-msmtp-accounts field-name value)
+  #~(string-append #$@(map (cut serialize-configuration <> msmtp-account-fields)
+                           value)))
+
+(define (home-msmtp-configuration-serialize-msmtp-configuration field-name value)
+  #~(string-append "defaults\n"
+                   #$(serialize-configuration value msmtp-configuration-fields)))
+
+(define (home-msmtp-configuration-serialize-default-account field-name value)
+  #~(if #$(maybe-value-set? value)
+      (string-append "\naccount default : " #$value "\n")
+      ""))
+
+(define (home-msmtp-configuration-serialize-extra-content field-name value)
+  #~(if (string=? #$value "") "" (string-append #$value "\n")))
+
+;; Configuration of 'msmtp'.
+;; Source <https://marlam.de/msmtp/msmtp.html#Configuration-files>.
+(define-configuration msmtp-configuration
+  (auth?
+   maybe-boolean
+   "Enable or disable authentication.")
+
+  (tls?
+   maybe-boolean
+   "Enable or disable TLS (also known as SSL) for secured connections.")
+
+  (tls-starttls?
+   maybe-boolean
+   "Choose the TLS variant: start TLS from within the session (‘on’, default),
+or tunnel the session through TLS (‘off’).")
+
+  (tls-trust-file
+   maybe-string
+   "Activate server certificate verification using a list of
+trusted Certification Authorities (CAs).")
+
+  (log-file
+   maybe-string
+   "Enable logging to the specified file. An empty argument disables logging.
+The file name ‘-’ directs the log information to standard output."
+   (serializer msmtp-configuration-serialize-maybe-string-no-underscore))
+
+  (host
+    maybe-string
+    "The SMTP server to send the mail to.")
+
+  (port
+    maybe-integer
+    "The port that the SMTP server listens on. The default is 25 (\"smtp\"),
+unless TLS without STARTTLS is used, in which case it is 465 (\"smtps\").")
+
+  (user
+    maybe-string
+    "Set the user name for authentication.")
+
+  (from
+    maybe-string
+    "Set the envelope-from address.")
+
+  (password-eval
+    maybe-string
+    "Set the password for authentication to the output (stdout) of the command cmd."
+    (serializer msmtp-configuration-serialize-maybe-string-no-underscore))
+
+  (extra-content
+   (string "")
+   "Extra content appended as-is to the configuration block.  Run
+@command{man msmtp} for more information about the configuration file
+format."
+   (serializer msmtp-configuration-serialize-extra-content))
+
+  (prefix msmtp-configuration-))
+
+(define-configuration msmtp-account
+  (name
+   (string)
+   "The unique name of the account."
+   (serializer msmtp-account-serialize-name))
+
+  (configuration
+   (msmtp-configuration)
+   "The configuration for this given account.")
+
+  (prefix msmtp-account-))
+
+(define (list-of-msmtp-accounts? lst)
+  (every msmtp-account? lst))
+
+(define-configuration home-msmtp-configuration
+  (defaults
+   (msmtp-configuration (msmtp-configuration))
+   "The configuration that will be set as default for all accounts.")
+
+  (accounts
+   (list-of-msmtp-accounts '())
+   "A list of @code{msmtp-account} records which contain
+information about all your accounts.")
+
+  (default-account
+   maybe-string
+   "Set the default account."
+   (serializer home-msmtp-configuration-serialize-default-account))
+
+  (extra-content
+   (string "")
+   "Extra content appended as-is to the configuration file.  Run
+@command{man msmtp} for more information about the configuration file
+format."
+   (serializer home-msmtp-configuration-serialize-extra-content))
+
+  (prefix home-msmtp-configuration-))
+
+(define (home-msmtp-files config)
+  (list
+   `(".config/msmtp/config"
+     ,(mixed-text-file "msmtp-config"
+                       (serialize-configuration config home-msmtp-configuration-fields)))))
+
+(define (home-msmtp-profile-entries config)
+  (list msmtp))
+
+(define home-msmtp-service-type
+  (service-type (name 'home-msmtp)
+                (extensions
+                 (list (service-extension home-profile-service-type
+                                          home-msmtp-profile-entries)
+                       (service-extension home-files-service-type
+                                          home-msmtp-files)))
+                (default-value (home-msmtp-configuration))
+                (description "Configure msmtp, a simple
+@acronym{SMTP, Simple Mail Transfer Protocol} client that can relay email
+to SMTP servers.")))
diff --git a/gnu/local.mk b/gnu/local.mk
index 73370dcc78..ba1b42fc05 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -35,7 +35,7 @@
 # Copyright © 2020 Ryan Prior <rprior@protonmail.com>
 # Copyright © 2020 Jan Wielkiewicz <tona_kosmicznego_smiecia@interia.pl>
 # Copyright © 2020, 2021 Brice Waegeneire <brice@waegenei.re>
-# Copyright © 2020 Tanguy Le Carrour <tanguy@bioneland.org>
+# Copyright © 2020, 2023 Tanguy Le Carrour <tanguy@bioneland.org>
 # Copyright © 2020 Martin Becze <mjbecze@riseup.net>
 # Copyright © 2020 Malte Frank Gerdes <mate.f.gerdes@gmail.com>
 # Copyright © 2020, 2023 Vinicius Monego <monego@posteo.net>
@@ -94,6 +94,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/home/services/fontutils.scm		\
   %D%/home/services/gnupg.scm			\
   %D%/home/services/guix.scm			\
+  %D%/home/services/mail.scm			\
   %D%/home/services/media.scm			\
   %D%/home/services/messaging.scm		\
   %D%/home/services/pm.scm			\