Skip to content

Simple API, parsing an email address into autoconfig XML files for Thunderbird, Outlook and iOS Mail

License

Notifications You must be signed in to change notification settings

DyrisIT/AutoconfigAgent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AutoconfigAgent

Simple API, parsing an email address into autoconfig XML files for Thunderbird, Outlook and iOS Mail

Notes

This requires Postfix & Dovecot SNI if used on a single server with multiple different email domains, since the server hostname for imap and smtp will be different and encryption should always be used.

Build

go mod download
go build

Usage

./AutoconfigAgent -b 0.0.0.0 -p 1234

This starts the API bound to a specific IP address and port.

Systemd Service

Replace <user> with a non-root user under which the API should be run. Make sure the executable has the correct owner/permissions and make sure you set the correct path under ExecStart. Save this file under /etc/systemd/system/autoconfig-agent.service, run systemctl daemon-reload and enable and run it via systemctl enable autoconfig-agent; systemctl start autoconfig-agent.

[Unit]
Description=AutoconfigAgent
After=network-online.target

[Service]
Type=simple
Restart=always
User=<user>
ExecStart=/path/to/AutoconfigAgent -b 0.0.0.0 -p 1234

[Install]
WantedBy=multi-user.target

Nginx Config (SSL is optional, but recommended)

For every email domain in use, point the corresponding @, autoconfig. and autodiscover. records to the IP of the nginx server. The following is an example config, repalace any <domain> placeholder with your email domain.

upstream autoconfig {
	# Backend Server where the AutoconfigAgent API is hosted
	server 127.0.0.1:1234;
}
server {
	listen 80;
	listen [::]:80;

	server_name <domain>;

	if ($scheme = http) {
		return 301 https://$host$request_uri;
	}
}
server {
	#listen 443 ssl http2;
	listen 443 ssl;
	listen [::]:443 ssl;

	server_name <domain>;

	ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;
	include /etc/letsencrypt/options-ssl-nginx.conf;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

	root /var/www/<domain>;
	index index.html index.htm index.nginx-debian.html;
	charset utf8;

	# iOS E-Mail Autoconfig
	location = /.well-known/mobileconfig {
		proxy_pass http://autoconfig;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
	}

	location / {
		try_files $uri $uri/ =404;
	}
}

server {
	#listen 443 ssl http2;
	listen 443 ssl;
	listen [::]:443 ssl;

	server_name autoconfig.<domain> autodiscover.<domain>;

	ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;
	include /etc/letsencrypt/options-ssl-nginx.conf;
	ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

	root /var/www/<domain>;
	index index.html index.htm index.nginx-debian.html;
	charset utf8;

	# Thunderbird E-Mail Autoconfig
	location = /mail/config-v1.1.xml {
		proxy_pass http://autoconfig;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
	}

	# Outlook E-Mail Autoconfig
	location = /autodiscover/autodiscover.xml {
		proxy_pass http://autoconfig;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
	}

	location / {
		try_files $uri $uri/ =404;
	}
}

TODO:

  • Add support for CalDAV/CardDAV autoconfig (Radical or Baikal Server required)
  • Research into more autoconfig methods (e.g. K-9 Mail uses SRV Records, so no XML API is necessary)

Contribution

Feel free to create a pull request with your improvements.