Alerts via SMTP relay try to send e-mail address in EHLO
(1) By aitap on 2020-08-13 13:33:46 [source]
Hi everyone,
Either I seriously misunderstand the /setup_notification
page, or there is a bug:
$ $fossil version # freshly built from tag version-2.11.1
This is fossil version 2.11.1 [307d94c549] 2020-06-08 19:48:29 UTC
$ echo foo > bar
$ $fossil alert test-message me@redacted.tld --body bar --smtp-trace --subject Hello -R repo.fossil
S: 220 mx.redacted.tld Microsoft ESMTP MAIL Service ready at Thu, 13 Aug 2020 16:07:17 +0300
C: EHLO me@redacted.tld # <-- delay of a few seconds after this line
S: 501 5.5.4 Invalid domain name
C: QUIT
S: 221 2.0.0 Service closing transmission channel
Sending email
S:
S:
I think that alerts.c passes the wrong arguments to smtp_session_new()
. In alert_sender_new()
, p->zFrom
is the sender's e-mail address, while smtp_session_new()
expects its zFrom
argument to be a domain name.
While preparing a patch addressing this (which is far from ideal, but may be fair given the information available to alerts.c
: just assume the domain name of the sender, like we assume we are allowed to send e-mails from sender's address), I realised that I am not dealing with an open relay, so I'll have to use a different configuration.
Nevertheless, here is a diff:
Index: src/alerts.c
==================================================================
--- src/alerts.c
+++ src/alerts.c
@@ -524,11 +524,11 @@
const char *zRelay = 0;
emailerGetSetting(p, &zRelay, "email-send-relayhost");
if( zRelay ){
u32 smtpFlags = SMTP_DIRECT;
if( mFlags & ALERT_TRACE ) smtpFlags |= SMTP_TRACE_STDOUT;
- p->pSmtp = smtp_session_new(p->zFrom, zRelay, smtpFlags);
+ p->pSmtp = smtp_session_new(smtp_domain_of_addr(p->zFrom), zRelay, smtpFlags);
smtp_client_startup(p->pSmtp);
}
}
return p;
}
Index: src/smtp.c
==================================================================
--- src/smtp.c
+++ src/smtp.c
@@ -580,11 +580,11 @@
/*
** The input is a base email address of the form "local@domain".
** Return a pointer to just the "domain" part.
*/
-static const char *domainOfAddr(const char *z){
+const char *smtp_domain_of_addr(const char *z){
while( z[0] && z[0]!='@' ) z++;
if( z[0]==0 ) return 0;
return z+1;
}
@@ -625,16 +625,16 @@
if( g.argc<5 ) usage("EMAIL FROM TO ...");
blob_read_from_file(&body, g.argv[2], ExtFILE);
zFrom = g.argv[3];
nTo = g.argc-4;
azTo = (const char**)g.argv+4;
- zFromDomain = domainOfAddr(zFrom);
+ zFromDomain = smtp_domain_of_addr(zFrom);
if( zRelay!=0 && zRelay[0]!= 0) {
smtpFlags |= SMTP_DIRECT;
zToDomain = zRelay;
}else{
- zToDomain = domainOfAddr(azTo[0]);
+ zToDomain = smtp_domain_of_addr(azTo[0]);
}
p = smtp_session_new(zFromDomain, zToDomain, smtpFlags, smtpPort);
if( p->zErr ){
fossil_fatal("%s", p->zErr);
}
Hope this helps!
(2) By absc (abiscuola) on 2021-07-05 21:48:29 in reply to 1 [link] [source]
Hi.
I just installed fossil 2.16 and I have the same problem.
My fossil server is running on OpenBSD under an httpd(8) chroot and I have my MTA that accept local e-mails on 127.0.0.1.
The fossil smtp client, tries to use the configured e-mail address as an EHLO command, getting the the error already mentioned by aitap.
Would it be possible to have a separate property to set an EHLO, acceptable by a modern MTA?
Regards
(3) By Richard Hipp (drh) on 2021-07-05 23:06:15 in reply to 2 [link] [source]
Does your patch clear the problem?
(4) By Pietro Cerutti (gahr) on 2023-03-02 07:16:40 in reply to 3 [link] [source]
Not the OP, but I confirm that the patch is correct: EHLO must be a host name, not an email address.
I have just upgraded the FreeBSD port of fossil to 2.21 and I have incorporated this patch.
It would be nice to have this upstreamed. Thanks!
(5) By Stephan Beal (stephan) on 2023-03-02 10:28:00 in reply to 4 [link] [source]
I have just upgraded the FreeBSD port of fossil to 2.21 and I have incorporated this patch.
Can you please confirm for us whether the smtp-ehlo branch resolves the problem for you?
(6) By Pietro Cerutti (gahr) on 2023-03-03 14:17:19 in reply to 5 [link] [source]
It does, thanks!