Какой объем писем вы планируете архивировать? Если вы не ожидаете, что архив потребует много терабайт, я думаю, это преждевременная оптимизация.
Поскольку каждое поле может быть представлено в виде строки или массива байтов, не имеет значения, сколько значений оно содержит, все это выглядит одинаково для хэш-функции. Просто объедините их все вместе, и вы получите уникальный идентификатор.
РЕДАКТИРОВАТЬ Пример Psuedocode
# intialized the hash object
hash = md5()
# compute the hashes for each field
hash.update(from_str)
hash.update(to_str)
hash.update(cc_str)
hash.update(body_str)
hash.update(...) # the rest of the email fields
# compute the identifier string
id = hash.hexdigest()
Вы получите тот же вывод, если замените все вызовы обновления на
# concatenate all fields and hash
hash.update(from_str + to_str + cc_str + body_str + ...)
Способ извлечения строк и интерфейса зависит от вашего приложения, языка и API.
Неважно, что разные почтовые клиенты могут производить разное форматирование для некоторых полей при одинаковом вводе, это даст вам хэш, уникальный для исходного письма.