I wrote my own code to tie it all together, but there are tutorials that show how to do pretty much the same thing if you do some searching.
I have my email stack running on linux in a cheap VPS.
The main problem most people run into is having poor ip and/or domain reputation with the large mailbox providers. (gmail, yahoo, etc.) It takes time and not sending email that looks spammy to build enough reputation to get delivery to the inbox and avoid being sent to the spam folder. You can get an idea of domain/ip rep by signing up for google postmaster tools and entering your domain and ip or block of IPs from which you are sending. If you are lucky when you sign up for a cheap VPS you will get an IP address that does not have a bed ruputation or at least no reputation.
My setup is only for my personal, non-commercial stuff.
You could also use a setup like this with integrated with something like AWS SES in order to mitigate bad IP reputation.
edited to fix a typo