You can remove or add headers in the smtp_data ACL. So let's suppose you have a mysql table somewhere, containing two columns, one for the original address, one for the replacement. In this case, you can use something like this (probably you'll want to modify it, but it's something to give you the idea):
warn condition=${if eq {1}{ \
${lookup mysql {SELECT 1 FROM the_table WHERE \
original_column='${quote_mysql:${sg{$h_From:}{ *<.*>\$}{}}}' } \
} \
{yes}{no} \
}
add_header = From: ${lookup mysql {SELECT replacement_column FROM the_table WHERE \
original_column='${quote_mysql:${sg{$h_From:}{ *<.*>\$}{}}}' } ${sg{$h_From:}{.*(<[^>]+>)}{\$1}}
remove_header = From:
Or, supposing you have a file /etc/exim4/fullnames.txt
in which the substitutions reside (keep in mind, howewer, that this will sequentially read the file):
warn condition=${if eq \
{${lookup{${sg{$h_From:}{ *<.*>\$}{}}}lsearch{/etc/exim4/fullname.txt}}}\
{}\
{no}{yes}}
add_header = From: ${lookup{${sg{$h_From:}{ *<.*>\$}{}}}lsearch{/etc/exim4/fullname.txt}} ${sg{$h_From:}{.*(<[^>]+>)}{\$1}}
remove_header = From:
Note that you want to enclose the full names used as search keys in quotes, in order to escape the space between the family name and given name. So the file should look like this:
"Иванов Иван":Ivanov Ivan
Now, this approach is not the nicest one, but it should work. It adds a From:
header (which will be the last header in the message), and removes a From:
header (the first it encounters, which will be the original one). It does so only if the mysql table or the file contains a suitable replacement.
For the replacement, it assumes that the address is in the form of "Display name ", according to RFC2822 3.4. For the replacement, it cuts the <...> part, and for the new header, it puts it back from the original From:
header.
More about lookups in exim: File and database lookups