Since you are doing straight inner joins, you only get duplicate entries in the result set if there are duplicate entries in the input tables.
SELECT FIRST 100 e.email_id, e.location_id, e.email, l.location_type, p.salutation,
p.fname, p.lname
FROM email AS e
JOIN location AS l ON e.location_id = l.location_id
JOIN person AS p ON l.per_id = p.per_id
The most likely place for there to be trouble is in the 'location' table. You could establish that with a query such as:
SELECT location_id, per_id, COUNT(*)
FROM location
GROUP BY location_id, per_id
HAVING COUNT(*) > 1;
If this returns any data, then you have a pointer to where the trouble is. You should then examine why you don't have a unique constraint on the combination of location_id, per_id.