Then you limited on your options, since you can't installs apps freely. The best option is probably a router that supports VPN connections or a node in your network that acts as a proxy.
But you can't look at a method signature and instantly know who handles the null check. You need to inspect code and calls to know for sure. This will lead to paranoia, sooner or later
The problem is that when an project is too big and a method is called from multiple contexts it's very easy to lose track of the context where the null check has been done and where it hasn't. This leads to a lot of duplicated null checks around the project and the constant paranoia of "can this be null here?".
A much better way of doing this is using the Optional when an Object can be "null" and a direct instance where it cannot. This way, at any given context you know for absolute sure if a null check is needed or not. However, even with annotations this does not throw a compile error...
I want to write functions that fail at compile time if called with a null object. You can use annotations to kinda do this, but they do not produce compile errors.
Self hosting an email server is a pain in the ass and I don't really recommend it.
Buying your own domain and using it in whatever email provider you want is very easy and gives you ownership over the email address. You may switch providers freely without needing anyone else to do anything.
Then you limited on your options, since you can't installs apps freely. The best option is probably a router that supports VPN connections or a node in your network that acts as a proxy.