From: Tanguy LE CARROUR <tanguy@bioneland.org>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: 62969@debbugs.gnu.org, mirai@makinata.eu
Subject: [bug#62969] [PATCH v3] home: Add msmtp service.
Date: Wed, 03 May 2023 12:01:48 +0200 [thread overview]
Message-ID: <168310810854.1650.852938763274164245@localhost> (raw)
In-Reply-To: <87ilddnjml.fsf_-_@gnu.org>
Hi Ludo’,
Quoting Ludovic Courtès (2023-04-30 23:30:10)
> Tanguy Le Carrour <tanguy@bioneland.org> skribis:
>
> > * gnu/home/services/mail.scm: New file.
> > * gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
> > * doc/guix.texi (Mailing): New node.
>
> I get:
>
> --8<---------------cut here---------------start------------->8---
> [ 94%] GUILEC gnu/home/services/mail.go
> gnu/home/services/mail.scm:52:0: warning: possibly unbound variable `serialize-string'
> gnu/home/services/mail.scm:53:0: warning: possibly unbound variable `serialize-boolean'
> gnu/home/services/mail.scm:54:0: warning: possibly unbound variable `serialize-integer'
> --8<---------------cut here---------------end--------------->8---
>
> I guess these procedures should be provided as well?
I also get them when making `gnu/home/services/mail.go`. But aren't
those "just" warnings. Everything seems to work as expected and when I
`guix home container test.home.scm` I get the expected
`.config/msmtp/config` file.
> > +@node Mail Home Services
> > +@subsection Mail Home Services
> > +
> > +@cindex msmtp
> > +@uref{https://marlam.de/msmtp, MSMTP} is an SMTP client.
>
> Could you give a bit more context, including @acronym for SMTP? It
> would also be nice to provide one commented example that readers might
> copy/paste as a starting point.
>
> You can take inspiration form the “Mcron Home Services”, “Secure Shell”,
> or “Messaging Home Services” nodes, for example.
>
> [...]
>
> > + (default-value (home-msmtp-configuration))
> > + (description "Configures msmtp.")))
>
> Likewise, something like “Configure msmtp, a simple @acronym{SMTP, …}
> client that can relay email to SMTP servers.”
I tried to improve it based on your suggestions. No yet perfect, though.
Cheers,
Tanguy
* gnu/home/services/mail.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
* doc/guix.texi (Mailing): New node.
---
doc/guix.texi | 137 +++++++++++++++++++++++
gnu/home/services/mail.scm | 221 +++++++++++++++++++++++++++++++++++++
gnu/local.mk | 1 +
3 files changed, 359 insertions(+)
create mode 100644 gnu/home/services/mail.scm
diff --git a/doc/guix.texi b/doc/guix.texi
index 7af2a85499..2ae815475b 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -114,6 +114,7 @@
Copyright @copyright{} 2023 Giacomo Leidi@*
Copyright @copyright{} 2022 Antero Mejr@*
Copyright @copyright{} 2023 Karl Hallsby
+Copyright @copyright{} 2023 Tanguy Le Carrour
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -41887,6 +41888,7 @@ Home Services
* Guix: Guix Home Services. Services for Guix.
* Fonts: Fonts Home Services. Services for managing User's fonts.
* Sound: Sound Home Services. Dealing with audio.
+* Mail: Mail Home Services. Services for managing mail.
* Messaging: Messaging Home Services. Services for managing messaging.
* Media: Media Home Services. Services for managing media.
@end menu
@@ -43110,6 +43112,141 @@ Sound Home Services
This is the multicast address used by default by the two services above.
@end defvar
+@node Mail Home Services
+@subsection Mail Home Services
+
+The @code{(gnu home services mail)} modules provides services that help
+you set up the tools to work with emails in your home environment.
+
+@cindex msmtp
+@uref{https://marlam.de/msmtp, MSMTP} is a @acronym{SMTP, Simple Mail
+Transfer Protocol} client. It sends mails to a predefined SMTP server
+that takes care of proper delivery.
+
+The service reference is given below.
+
+@defvar home-msmtp-service-type
+This is the service type for @command{msmtp}. Its value must be a
+@code{home-msmtp-configuration}, as shown below. It provides the
+@code{~/.config/msmtp/config} file.
+
+As an example, here is how you would configure @code{msmtp} for a single
+account:
+
+@lisp
+(service home-msmtp-service-type
+ (home-msmtp-configuration
+ (accounts
+ (list
+ (msmtp-account
+ (name "alice")
+ (configuration
+ (msmtp-configuration
+ (host "mail.example.org")
+ (port 587)
+ (user "alice")
+ (passwordeval "pass Mail/alice"))))))))
+@end lisp
+@end defvar
+
+@c %start of fragment
+
+@deftp {Data Type} home-msmtp-configuration
+Available @code{home-msmtp-configuration} fields are:
+
+@table @asis
+@item @code{defaults} (type: msmtp-configuration)
+The configuration that will be set as default for all accounts.
+
+@item @code{accounts} (default: @code{()}) (type: list-of-msmtp-accounts)
+A list of @code{msmtp-account} records which contain information about
+all your accounts.
+
+@item @code{default-account} (type: maybe-string)
+Set the default account.
+
+@item @code{extra-content} (default: @code{""}) (type: string)
+Extra content appended as-is to the configuration file. Run
+@command{man msmtp} for more information about the configuration file
+format.
+
+@end table
+
+@end deftp
+
+@c %end of fragment
+
+@c %start of fragment
+
+@deftp {Data Type} msmtp-account
+Available @code{msmtp-account} fields are:
+
+@table @asis
+@item @code{name} (type: string)
+The unique name of the account.
+
+@item @code{configuration} (type: msmtp-configuration)
+The configuration for this given account.
+
+@end table
+
+@end deftp
+
+@c %end of fragment
+
+@c %start of fragment
+
+@deftp {Data Type} msmtp-configuration
+Available @code{msmtp-configuration} fields are:
+
+@table @asis
+@item @code{auth?} (type: maybe-boolean)
+Enable or disable authentication.
+
+@item @code{tls?} (type: maybe-boolean)
+Enable or disable TLS (also known as SSL) for secured connections.
+
+@item @code{tls-starttls?} (type: maybe-boolean)
+Choose the TLS variant: start TLS from within the session (‘on’,
+default), or tunnel the session through TLS (‘off’).
+
+@item @code{tls-trust-file} (type: maybe-string)
+Activate server certificate verification using a list of trusted
+Certification Authorities (CAs).
+
+@item @code{logfile} (type: maybe-string)
+Enable logging to the specified file. An empty argument disables
+logging. The file name ‘-’ directs the log information to standard
+output.
+
+@item @code{host} (type: maybe-string)
+The SMTP server to send the mail to.
+
+@item @code{port} (type: 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").
+
+@item @code{user} (type: maybe-string)
+Set the user name for authentication.
+
+@item @code{from} (type: maybe-string)
+Set the envelope-from address.
+
+@item @code{passwordeval} (type: maybe-string)
+Set the password for authentication to the output (stdout) of the
+command cmd.
+
+@item @code{extra-content} (default: @code{""}) (type: string)
+Extra content appended as-is to the configuration block. Run
+@command{man msmtp} for more information about the configuration file
+format.
+
+@end table
+
+@end deftp
+
+@c %end of fragment
+
@node Messaging Home Services
@subsection Messaging Home Services
diff --git a/gnu/home/services/mail.scm b/gnu/home/services/mail.scm
new file mode 100644
index 0000000000..ec5f869c87
--- /dev/null
+++ b/gnu/home/services/mail.scm
@@ -0,0 +1,221 @@
+;;; 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 packages)
+ #:use-module (gnu services)
+ #:use-module (gnu services configuration)
+ #:use-module (gnu home services)
+ #:use-module (gnu home services shepherd)
+ #: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-logfile
+ msmtp-configuration-host
+ msmtp-configuration-port
+ msmtp-configuration-user
+ msmtp-configuration-from
+ msmtp-configuration-passwordeval
+ msmtp-configuration-extra-content
+ msmtp-account
+ msmtp-account-name
+ msmtp-account-configuration))
+
+(define-maybe string)
+(define-maybe boolean)
+(define-maybe integer)
+
+;; 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-maybe-boolean field-name value)
+ #~(if #$(maybe-value-set? value)
+ (string-append #$(uglify-symbol field-name) " " (if #$value "on" "off") "\n")
+ ""))
+
+(define (msmtp-configuration-serialize-maybe-string field-name value)
+ #~(if #$(maybe-value-set? value)
+ (string-append #$(uglify-symbol field-name) " " #$value "\n")
+ ""))
+
+(define (msmtp-configuration-serialize-maybe-integer field-name value)
+ #~(if #$(maybe-value-set? 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).")
+
+ (logfile
+ maybe-string
+ "Enable logging to the specified file. An empty argument disables logging.
+The file name ‘-’ directs the log information to standard output.")
+
+ (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.")
+
+ (passwordeval
+ maybe-string
+ "Set the password for authentication to the output (stdout) of the command cmd.")
+
+ (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-service config)
+ (list
+ `(".config/msmtp/config"
+ ,(mixed-text-file "config"
+ (serialize-configuration config home-msmtp-configuration-fields)))))
+
+(define (home-msmtp-profile-service config)
+ (specifications->packages (list "msmtp")))
+
+(define home-msmtp-service-type
+ (service-type (name 'home-msmtp)
+ (extensions
+ (list
+ (service-extension
+ home-profile-service-type
+ home-msmtp-profile-service)
+ (service-extension
+ home-files-service-type
+ home-msmtp-files-service)))
+ (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 4305bee89c..94ea3a4e8d 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -93,6 +93,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 \
base-commit: 94e2e3553440a2a5ac4a312e80b8ea21ddebafeb
--
2.39.2
next prev parent reply other threads:[~2023-05-03 10:03 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-20 14:42 [bug#62969] [PATCH] home: Add msmtp service Tanguy Le Carrour
2023-04-20 16:36 ` Bruno Victal
2023-04-23 17:10 ` Tanguy LE CARROUR
2023-04-23 17:12 ` [bug#62969] [PATCH v2] " Tanguy Le Carrour
2023-04-30 21:30 ` [bug#62969] [PATCH] " Ludovic Courtès
2023-05-03 10:01 ` Tanguy LE CARROUR [this message]
2023-05-03 20:27 ` [bug#62969] [PATCH v3] " Ludovic Courtès
2023-05-17 8:52 ` Tanguy LE CARROUR
2023-05-17 8:51 ` [bug#62969] [PATCH v4] " Tanguy Le Carrour
2023-05-29 21:43 ` bug#62969: [PATCH] " Ludovic Courtès
2023-05-30 6:54 ` [bug#62969] " Tanguy LE CARROUR
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=168310810854.1650.852938763274164245@localhost \
--to=tanguy@bioneland.org \
--cc=62969@debbugs.gnu.org \
--cc=ludo@gnu.org \
--cc=mirai@makinata.eu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.