mirror of
https://github.com/mjl-/mox.git
synced 2024-12-27 08:53:48 +03:00
in quickstart, check outgoing smtp connectivity by dialing gmail.com mx host
if connection cannot be made, warn about it and point to configuring a smarthost and the config options. suggested by arnt & friend
This commit is contained in:
parent
d4958732c8
commit
0262f4621e
4 changed files with 48 additions and 6 deletions
6
doc.go
6
doc.go
|
@ -20,7 +20,7 @@ any parameters. Followed by the help and usage information for each command.
|
||||||
|
|
||||||
mox [-config config/mox.conf] [-pedantic] ...
|
mox [-config config/mox.conf] [-pedantic] ...
|
||||||
mox serve
|
mox serve
|
||||||
mox quickstart [-existing-webserver] [-hostname host] user@domain [user | uid]
|
mox quickstart [-skipdial] [-existing-webserver] [-hostname host] user@domain [user | uid]
|
||||||
mox stop
|
mox stop
|
||||||
mox setaccountpassword account
|
mox setaccountpassword account
|
||||||
mox setadminpassword
|
mox setadminpassword
|
||||||
|
@ -146,11 +146,13 @@ traffic to your existing backend applications. Look for "WebHandlers:" in the
|
||||||
output of "mox config describe-domains" and see the output of "mox example
|
output of "mox config describe-domains" and see the output of "mox example
|
||||||
webhandlers".
|
webhandlers".
|
||||||
|
|
||||||
usage: mox quickstart [-existing-webserver] [-hostname host] user@domain [user | uid]
|
usage: mox quickstart [-skipdial] [-existing-webserver] [-hostname host] user@domain [user | uid]
|
||||||
-existing-webserver
|
-existing-webserver
|
||||||
use if a webserver is already running, so mox won't listen on port 80 and 443; you'll have to provide tls certificates/keys, and configure the existing webserver as reverse proxy, forwarding requests to mox.
|
use if a webserver is already running, so mox won't listen on port 80 and 443; you'll have to provide tls certificates/keys, and configure the existing webserver as reverse proxy, forwarding requests to mox.
|
||||||
-hostname string
|
-hostname string
|
||||||
hostname mox will run on, by default the hostname of the machine quickstart runs on; if specified, the IPs for the hostname are configured for the public listener
|
hostname mox will run on, by default the hostname of the machine quickstart runs on; if specified, the IPs for the hostname are configured for the public listener
|
||||||
|
-skipdial
|
||||||
|
skip check for outgoing smtp (port 25) connectivity
|
||||||
|
|
||||||
# mox stop
|
# mox stop
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ func pwgen() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func cmdQuickstart(c *cmd) {
|
func cmdQuickstart(c *cmd) {
|
||||||
c.params = "[-existing-webserver] [-hostname host] user@domain [user | uid]"
|
c.params = "[-skipdial] [-existing-webserver] [-hostname host] user@domain [user | uid]"
|
||||||
c.help = `Quickstart generates configuration files and prints instructions to quickly set up a mox instance.
|
c.help = `Quickstart generates configuration files and prints instructions to quickly set up a mox instance.
|
||||||
|
|
||||||
Quickstart writes configuration files, prints initial admin and account
|
Quickstart writes configuration files, prints initial admin and account
|
||||||
|
@ -95,8 +95,10 @@ webhandlers".
|
||||||
`
|
`
|
||||||
var existingWebserver bool
|
var existingWebserver bool
|
||||||
var hostname string
|
var hostname string
|
||||||
|
var skipDial bool
|
||||||
c.flag.BoolVar(&existingWebserver, "existing-webserver", false, "use if a webserver is already running, so mox won't listen on port 80 and 443; you'll have to provide tls certificates/keys, and configure the existing webserver as reverse proxy, forwarding requests to mox.")
|
c.flag.BoolVar(&existingWebserver, "existing-webserver", false, "use if a webserver is already running, so mox won't listen on port 80 and 443; you'll have to provide tls certificates/keys, and configure the existing webserver as reverse proxy, forwarding requests to mox.")
|
||||||
c.flag.StringVar(&hostname, "hostname", "", "hostname mox will run on, by default the hostname of the machine quickstart runs on; if specified, the IPs for the hostname are configured for the public listener")
|
c.flag.StringVar(&hostname, "hostname", "", "hostname mox will run on, by default the hostname of the machine quickstart runs on; if specified, the IPs for the hostname are configured for the public listener")
|
||||||
|
c.flag.BoolVar(&skipDial, "skipdial", false, "skip check for outgoing smtp (port 25) connectivity")
|
||||||
args := c.Parse()
|
args := c.Parse()
|
||||||
if len(args) != 1 && len(args) != 2 {
|
if len(args) != 1 && len(args) != 2 {
|
||||||
c.Usage()
|
c.Usage()
|
||||||
|
@ -529,6 +531,44 @@ messages over SMTP.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check outgoing SMTP connectivity.
|
||||||
|
if !skipDial {
|
||||||
|
fmt.Printf("Checking if outgoing smtp connections can be made by connecting to gmail.com mx on port 25...")
|
||||||
|
mxctx, mxcancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
|
mx, _, err := resolver.LookupMX(mxctx, "gmail.com.")
|
||||||
|
mxcancel()
|
||||||
|
if err == nil && len(mx) == 0 {
|
||||||
|
err = errors.New("no mx records")
|
||||||
|
}
|
||||||
|
var ok bool
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("\n\nERROR: looking up gmail.com mx record: %s\n", err)
|
||||||
|
} else {
|
||||||
|
dialctx, dialcancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
d := net.Dialer{}
|
||||||
|
addr := net.JoinHostPort(mx[0].Host, "25")
|
||||||
|
conn, err := d.DialContext(dialctx, "tcp", addr)
|
||||||
|
dialcancel()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("\n\nERROR: connecting to %s: %s\n", addr, err)
|
||||||
|
} else {
|
||||||
|
conn.Close()
|
||||||
|
fmt.Printf(" OK\n")
|
||||||
|
ok = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
fmt.Printf(`
|
||||||
|
WARNING: Could not verify outgoing smtp connections can be made, outgoing
|
||||||
|
delivery may not be working. Many providers block outgoing smtp connections by
|
||||||
|
default, requiring an explicit request or a cooldown period before allowing
|
||||||
|
outgoing smtp connections. To send through a smarthost, configure a "Transport"
|
||||||
|
in mox.conf and use it in "Routes" in domains.conf. See "mox example transport".
|
||||||
|
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
zones := []dns.Domain{
|
zones := []dns.Domain{
|
||||||
{ASCII: "sbl.spamhaus.org"},
|
{ASCII: "sbl.spamhaus.org"},
|
||||||
{ASCII: "bl.spamcop.net"},
|
{ASCII: "bl.spamcop.net"},
|
||||||
|
@ -538,7 +578,7 @@ messages over SMTP.
|
||||||
var listed bool
|
var listed bool
|
||||||
for _, zone := range zones {
|
for _, zone := range zones {
|
||||||
for _, ip := range hostIPs {
|
for _, ip := range hostIPs {
|
||||||
dnsblctx, dnsblcancel := context.WithTimeout(resolveCtx, 5*time.Second)
|
dnsblctx, dnsblcancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||||
status, expl, err := dnsbl.Lookup(dnsblctx, c.log.Logger, resolver, zone, net.ParseIP(ip))
|
status, expl, err := dnsbl.Lookup(dnsblctx, c.log.Logger, resolver, zone, net.ParseIP(ip))
|
||||||
dnsblcancel()
|
dnsblcancel()
|
||||||
if status == dnsbl.StatusPass {
|
if status == dnsbl.StatusPass {
|
||||||
|
|
2
testdata/integration/moxacmepebble.sh
vendored
2
testdata/integration/moxacmepebble.sh
vendored
|
@ -7,7 +7,7 @@ apk add unbound curl
|
||||||
(rm -r /tmp/mox 2>/dev/null || exit 0) # clean slate
|
(rm -r /tmp/mox 2>/dev/null || exit 0) # clean slate
|
||||||
mkdir /tmp/mox
|
mkdir /tmp/mox
|
||||||
cd /tmp/mox
|
cd /tmp/mox
|
||||||
mox quickstart moxtest1@mox1.example "$MOX_UID" > output.txt
|
mox quickstart -skipdial moxtest1@mox1.example "$MOX_UID" > output.txt
|
||||||
|
|
||||||
cp config/mox.conf config/mox.conf.orig
|
cp config/mox.conf config/mox.conf.orig
|
||||||
sed -i -e 's/letsencrypt:/pebble:/g' -e 's/: letsencrypt/: pebble/g' -e 's,DirectoryURL: https://acme-v02.api.letsencrypt.org/directory,DirectoryURL: https://acmepebble.example:14000/dir,' -e 's/SMTP:$/SMTP:\n\t\t\tFirstTimeSenderDelay: 1s/' config/mox.conf
|
sed -i -e 's/letsencrypt:/pebble:/g' -e 's/: letsencrypt/: pebble/g' -e 's,DirectoryURL: https://acme-v02.api.letsencrypt.org/directory,DirectoryURL: https://acmepebble.example:14000/dir,' -e 's/SMTP:$/SMTP:\n\t\t\tFirstTimeSenderDelay: 1s/' config/mox.conf
|
||||||
|
|
2
testdata/integration/moxmail2.sh
vendored
2
testdata/integration/moxmail2.sh
vendored
|
@ -7,7 +7,7 @@ apk add unbound
|
||||||
(rm -r /tmp/mox 2>/dev/null || exit 0) # clean slate
|
(rm -r /tmp/mox 2>/dev/null || exit 0) # clean slate
|
||||||
mkdir /tmp/mox
|
mkdir /tmp/mox
|
||||||
cd /tmp/mox
|
cd /tmp/mox
|
||||||
mox quickstart moxtest2@mox2.example "$MOX_UID" > output.txt
|
mox quickstart -skipdial moxtest2@mox2.example "$MOX_UID" > output.txt
|
||||||
|
|
||||||
cp config/mox.conf config/mox.conf.orig
|
cp config/mox.conf config/mox.conf.orig
|
||||||
sed -i -e 's,ACME: .*$,KeyCerts:\n\t\t\t\t-\n\t\t\t\t\tCertFile: /integration/tls/moxmail2.pem\n\t\t\t\t\tKeyFile: /integration/tls/moxmail2-key.pem\n\t\t\t\t-\n\t\t\t\t\tCertFile: /integration/tls/mox2-autoconfig.pem\n\t\t\t\t\tKeyFile: /integration/tls/mox2-autoconfig-key.pem\n\t\t\t\t-\n\t\t\t\t\tCertFile: /integration/tls/mox2-mtasts.pem\n\t\t\t\t\tKeyFile: /integration/tls/mox2-mtasts-key.pem\n,' -e 's/SMTP:$/SMTP:\n\t\t\tFirstTimeSenderDelay: 1s/' config/mox.conf
|
sed -i -e 's,ACME: .*$,KeyCerts:\n\t\t\t\t-\n\t\t\t\t\tCertFile: /integration/tls/moxmail2.pem\n\t\t\t\t\tKeyFile: /integration/tls/moxmail2-key.pem\n\t\t\t\t-\n\t\t\t\t\tCertFile: /integration/tls/mox2-autoconfig.pem\n\t\t\t\t\tKeyFile: /integration/tls/mox2-autoconfig-key.pem\n\t\t\t\t-\n\t\t\t\t\tCertFile: /integration/tls/mox2-mtasts.pem\n\t\t\t\t\tKeyFile: /integration/tls/mox2-mtasts-key.pem\n,' -e 's/SMTP:$/SMTP:\n\t\t\tFirstTimeSenderDelay: 1s/' config/mox.conf
|
||||||
|
|
Loading…
Reference in a new issue