Playing around with the filter API I want an easier way to send mail
with authentication instead of doing the transaction manually via
openssl or via bloated mailclients. Turns out we already have all the
plumbing in place and just need to hook it up.
OK?
martijn@
Index: smtpc.c
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/smtpc.c,v
retrieving revision 1.11
diff -u -p -r1.11 smtpc.c
--- smtpc.c 14 Sep 2020 18:32:11 -0000 1.11
+++ smtpc.c 20 Dec 2020 18:57:13 -0000
@@ -56,9 +56,8 @@ usage(void)
{
extern char *__progname;
- fprintf(stderr,
- "usage: %s [-Chnv] [-F from] [-H helo] [-s server] [-S name] rcpt
...\n",
- __progname);
+ fprintf(stderr, "usage: %s [-Chnv] [-F from] [-H helo] [-a authfile] "
+ "[-s server] [-S name] rcpt ...\n", __progname);
exit(1);
}
@@ -66,8 +65,12 @@ int
main(int argc, char **argv)
{
char hostname[256];
+ FILE *authfile;
int ch, i;
char *server = "localhost";
+ char *authstr = NULL;
+ size_t alloc = 0;
+ ssize_t len;
struct passwd *pw;
log_init(1, 0);
@@ -91,7 +94,7 @@ main(int argc, char **argv)
memset(&mail, 0, sizeof(mail));
mail.from = pw->pw_name;
- while ((ch = getopt(argc, argv, "CF:H:S:hns:v")) != -1) {
+ while ((ch = getopt(argc, argv, "CF:H:S:a:hns:v")) != -1) {
switch (ch) {
case 'C':
params.tls_verify = 0;
@@ -107,6 +110,23 @@ main(int argc, char **argv)
break;
case 'h':
usage();
+ break;
+ case 'a':
+ if ((authfile = fopen(optarg, "r")) == NULL)
+ fatal("%s: open", optarg);
+ if ((len = getline(&authstr, &alloc, authfile)) == -1)
+ fatal("%s: Failed to read username", optarg);
+ if (authstr[len - 1] == '\n')
+ authstr[len - 1] = '\0';
+ params.auth_user = authstr;
+ authstr = NULL;
+ len = 0;
+ if ((len = getline(&authstr, &alloc, authfile)) == -1)
+ fatal("%s: Failed to read password", optarg);
+ if (authstr[len - 1] == '\n')
+ authstr[len - 1] = '\0';
+ params.auth_pass = authstr;
+ fclose(authfile);
break;
case 'n':
noaction = 1;
Index: smtp.1
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/smtp.1,v
retrieving revision 1.7
diff -u -p -r1.7 smtp.1
--- smtp.1 4 Jul 2018 08:23:43 -0000 1.7
+++ smtp.1 20 Dec 2020 18:57:13 -0000
@@ -25,6 +25,7 @@
.Op Fl Chnv
.Op Fl F Ar from
.Op Fl H Ar helo
+.Op Fl a Ar authfile
.Op Fl s Ar server
.Op Ar recipient ...
.Sh DESCRIPTION
@@ -49,6 +50,13 @@ Set the return-path (MAIL FROM) for the
Default to the current username.
.It Fl H Ar helo
Define the hostname to advertise (HELO) when establishing the SMTP session.
+.It Fl a Ar authfile
+Perform a login before sending the message.
+The username and password are read from
+.Ar authfile
+and need to be on the first and second line respectively.
+This option requires a TLS or STARTTLS
+.Ar server .
.It Fl h
Display version and usage.
.It Fl n