If you are happy to use web clients to access your mail and calendar services, then google / exchange / outlook and icloud can all be accessed with any of the standard Linux web browsers. There are also apps available in WebCatalog to make this easier for you. Syncing is not an issue with this approach as everything is stored on the web servers.
The only problems with this approach are that it can be a bit slow and your information is not available to you when offline. For this reason, I like to set up a desktop client that will remain in sync with the web services and also store data locally.
There are now several great email clients around for Linux and some offer calendar clients in addition. My preferred application is Evolution as I have had greatest success syncing both icloud email and calendars with this.
Before starting, assuming that you use 2 factor authentication with your iCloud account, you need to set up app specific passwords for both email and calendars. You also need to find out which calender server your own calendars reside on in icloud. To do this, click on the sharing icon for one of your ical calendars to reveal the webcal sharing url. Within the sddress you will see a p and 2 numbers such as p29.
The Evolution imap settings are as below – with your own apple id in place of appleid
And these are the smtp settings￼
When you connect for the first time you will be asked for your password – remember to use the app-specific password.
To sync calendars select new calendar ￼- CalDav￼
Enter the info as below with the pxx number that matches your icloud calendar server
Use your own apple id
When you click on Find Calendars you will be asked for your password – again, remember to use you app specific password. You can not use the same app specific password for both the mail and calendar modules.