123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- ;;; 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.")))
|