Note: Some of the following is conclusions my team reached for which we could not find explicit documentation; Salesforce support eventually confirmed our findings, just this past week.
EmailMessage object does not have any explicit CRUD or Sharing Settings. There is also no
EmailMessage__Share object, so Apex sharing is off the table. With no explicit CRUD, you cannot assign "View All" at the object level.
With no explicit sharing options, Salesforce defaults to 'Controlled by Parent'.
EmailMessage has a
ParentId field, which is a lookup to
Case (I believe because the
EmailMessage object was originally added to support Email-to-Case). If this field is present the case is the parent and sharing is controlled by the case. Otherwise,
ActivityId is used, and the auto-generated
Task becomes the parent. Task sharing is a bit complicated as it can use
WhatId, and a
Contact as the
WhoId would then depend on the contact's
The result is that even if you build a custom Activity Feed to replace the Activity related list, only the
EmailMessage's owner would be able to see it without the
Task. We had originally added a trigger on
EmailMessage to remove these tasks, which we eventually removed for this reason.