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.
The 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 WhoId
or WhatId
, and a Contact
as the WhoId
would then depend on the contact's Account
lookup.
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.