Как проверить открытие письма отправленного через mail()?
Вставить ссылку на картинку, хотя бы даже на пиксель с уникальным токеном, соответствующем данному письму, и отслеживать обращение к нему.
100% надежного способа нет. Тот что описал Владимир, охватывает ~80% возможностей. Кроме случаев когда:
1. Почтовики кешируют обращение к картинкам. Проще говоря еще до того как письмо получит пользователь, туда сначала сунется почтовый бот, чтобы сохранить картинку к себе, и от себя уже показывать. В результате письмо отметиться на вашей стороне как прочитанное, а по факту не известно, попало оно вообще во входящие/спам, или отфильтровалось системными/пользовательскими фильтрами.
2. Почтовики сейчас так же палят и вырезают трекинг-ссылки, возможно их надо как-то маскировать получше, но у меня часто вырезали просто, из за чего статистика была не точная.
3. Многие возможности зависят от настройки (dkim, spf, dmarc, etc) и репутации отправляющего домена. Если репутация хорошая на протяжении долгого времени, есть возможность даже использовать микроразметку в письмах, наподобие такого:
Вообщем факторов очень много.