Схема примерно такая - храним id корзины (сессии и товары) и сам состав корзины в сессии, например в БД.
Смотрим либо на активность пользователя (не активен боле n часов) либо на факт его ухода с сайта без совершения покупки. Тут необходимо будет реализовать таймер или шедуллер, и достаточно хранить где нибудь дату последнего действия.
Если пользователь вернулся на сайт, изменил корзину - удаляем "корзину" из БД. На это поведение надо создать триггер
Если все же нет - через заданный промежуток времени отправляем письмо, с товарами подгружаемыми из БД.
В ссылках необходимо зашить токен для возобновления сессии с корзиной.
Это один из вариантов.