Why?
I have been using gmail and outlook for ages at this point. But given the enormous amounts of places where these accounts are tied to, made me think that I would like to be not so overly dependent on them over time.
This made me think more seriously about having email tied to my own domain.
Beginning
This all started with nemo offering to have my domain’s (tasdikrahman.me back then) email hosted over at his migadu account. I created a few mailboxes, with the migadu account which nemo had created and off I went. This was just before 2020. This kept running for a while but what didn’t happen was that I didn’t really move over it completely, but only for a few services.
Which created a split view of email for me. The workflow was, gmail/outlook for emails and then thunderbird for my tasdikrahman.me mailboxes on my machine and then outlook/apple mail on my phone.
Pause
While the change did happen at the beginning, I would still ping pong back and forth between using either of the two big email providers for services that required email to sign up for, or my custom domain, but it wasn’t a fixed answer on when to use what.
This continued all the way till recently this month when I sat down to at least start sorting out my email situation for tasdikrahman.com. While tasdikrahman.me was over at nemo’s migadu, tasdikrahman.com, I hadn’t created any mailboxes.
Moving domains over from namecheap to hetzner
My wife’s domain was also being managed by me and she recently created a small website of her using hugo. While I had been a user of namecheap since more than a decade, I wanted to move to something which could bill me directly using SEPA on my bank account. This was missing out on namecheap, and given the yearly renewals for one of the domains, I decided to take the plunge over to hetzner after researching a bit. The decision was also a bit easier to make as I already was using blob storage over at hetzner for daily backups of my homeserver.
I also wanted to start paying for my own migadu account and had the domains transferred over from nemo’s account to mine, the process is quite straightforward. Sincere thanks to nemo again for hosting my email domains at his account for so long.
The next step was to manage the dns settings over at hetzner for all the three domains now which I had.
tasdikrahman.com, tasdikrahman.me and my wife’s domain. To not have to click through a bunch of buttons over at hetzner console, I decided to import some of the existing config to opentofu. As the configuration was mostly going to be the same for the other two domains. This ended up being quite fast.
For example a sample domains tf config looks like this
locals {
# Keyed by "<name>/<type>", which is also the suffix of the import ID.
# Apex NS and SOA are left to Hetzner. ttl = null inherits the zone default.
tasdikrahman_com_rrsets = {
"@/A" = {
ttl = 1800
records = [
"185.199.108.153",
"185.199.109.153",
"185.199.110.153",
"185.199.111.153",
]
}
"www/CNAME" = {
ttl = 1800
records = ["tasdikrahman.github.io."]
}
# GitHub Pages domain verification
"_github-pages-challenge-tasdikrahman/TXT" = {
ttl = null
records = ["\"${local.verification_tokens.tasdikrahman_com_github_pages}\""]
}
# Migadu mail
"@/MX" = {
ttl = 1800
records = [
"10 aspmx1.migadu.com.",
"20 aspmx2.migadu.com.",
]
}
"@/TXT" = {
ttl = null
records = [
"\"hosted-email-verify=${local.verification_tokens.tasdikrahman_com_migadu}\"",
"\"v=spf1 include:spf.migadu.com -all\"",
]
}
"_dmarc/TXT" = {
ttl = null
records = ["\"v=DMARC1; p=quarantine;\""]
}
"autoconfig/CNAME" = {
ttl = null
records = ["autoconfig.migadu.com."]
}
"key1._domainkey/CNAME" = {
ttl = null
records = ["key1.tasdikrahman.com._domainkey.migadu.com."]
}
"key2._domainkey/CNAME" = {
ttl = null
records = ["key2.tasdikrahman.com._domainkey.migadu.com."]
}
"key3._domainkey/CNAME" = {
ttl = null
records = ["key3.tasdikrahman.com._domainkey.migadu.com."]
}
}
}
resource "hcloud_zone" "tasdikrahman_com" {
name = "tasdikrahman.com"
mode = "primary"
ttl = 3600
delete_protection = true
}
resource "hcloud_zone_rrset" "tasdikrahman_com" {
for_each = merge(local.tasdikrahman_com_rrsets, local.migadu_discovery_rrsets)
zone = hcloud_zone.tasdikrahman_com.name
name = split("/", each.key)[0]
type = split("/", each.key)[1]
ttl = each.value.ttl
records = [for value in each.value.records : { value = value }]
}
I am using the hcloud provider for the same, for migadu since there was no official provider, I ended up skipping it for now. And since the email domains and domains for the same seemed pretty static for now, I didn’t want to invest further on that. But maybe that will change.
The state file is stored over in my hetzner account to keep track of the managed resources. The config above is not on a CI as of now and I don’t intend to put it on it so far.
Why migadu?
I already had been using it since a while, and since nemo was also using it since ages, that made me not think too much about it. I did check some other options to compare like mailbox.org and proton email and they seemed to also be great options at the same time.
Some of these services are bundling email with storage, which is also a great way for value added services, but I wanted to not go that route as of now. Basing my email provider based on open protocols, gives me the ability to move over to another provider without much hassle and lock in. And that flexibility is something which I wanted.
I am awaiting thunderbird to launch its stable release for ios and ipad, and then I can also use it similarly to my machine on ios. Moving away from outlook/apple email. Thunderbird for iOS: a first look
There are some upper limits on how much mail you can receive on your account in total of all your mailboxes in migadu for the subscription you have, but they have a buffer of 25% which they will give and send an email worst case if you are hitting. Those limits are quite generous and I don’t think I will be hitting those anytime. But if that’s important for you, you can check some other email providers which don’t have such limits.
Ending notes
Now that I have mailboxes created for both of my domains, I would like to start migrating the email services slowly over to my custom domain over time. While this will take time, the process has already started.
I also created some mailboxes for my wife, which she will start using soon. Her mailbox also being under my migadu account is a good consolidation to be able to manage everything under the same accounts for standardisation in managing them.