Office 365 has some fairly good builtin filters. I still had to add some domains manually, and filter out using keywords.
Once we ditch o365 and went back to full in-house exchange, you can really fine tune this stuff to keep out most of it. Turn your reject on SCL to 5 or maybe lower then whitelist servers you get legit email from. Add many text pattern filters to remove the worthless contract staffing and industry list emails. Also add an attachment filter to stop lots of types of attachments from coming through. Add a SenderID reject and spf hard fails so people cant send emails purporting to be from your domain to your users.
Went from people getting dozens of spam each day(most users) to maybe 2 messages a day for a handful of people. Once you start this campaign of aggression, it helps to have a quarantine mailbox where mails can be sent if youre not sure they are spam or not. You can then release them if they are not spam, or delte them if they are.