If the site is not using members then you are correct there is nothing built in that would prevent users from using the same promo code multiple times. From the docs:
- Limit Per User: Limit the number of times this promo code can be used by each member. NOTE: If you enable this option, customers
must be logged in before they will be able to use the promo code
(otherwise there would be no way to tell which customers have already
used the code).
- Total Use Limit: Limit the total number of times this promo code can be used.
You could set the total use limit to 1 and generate multiple promo codes that would be sent to each user.
The other option you have would be to enable membership functionality on the site so that you can use the functionality of Limit Per User w/ promo codes. This also has the added benefit of storing the users billing/shipping details but not CC details.
You could also if you are comfortable with PHP write your own extension to check the orders table in the database with the submitted email address to see if that email has used a promo code in the past. (Extension Hook Documentation)