Shopping List program
Welcome to Code Review. While your script works as is, it is a good practice to setup and split parts of code into functions, and place the entry point inside the if __name__ wall.



You have an extra conversion to int for productsnm (which could be better named product_count).



Since each product is associated with its own quantity, say hello to a namedtuple:

from collections import namedtuple
Product = namedtuple('Product', ['name', 'quantity'])
# inside the for-loop:
    products.append(Product(name=product_name, quantity=quantity))


You wont need the string manipulation, or the loop. Just printing out the products list should give you something like

[Product(name='n0', quantity=0), Product(name='n1', quantity=1), Product(name='n2', quantity=32)]


Each element of the list now has name and quantity as its property as well.



You can have multiple functions as follows:


gather_products_list which returns a list of N products.
generate_email_body to process the products provided to the function and generating the raw email body.
send_email which accepts the aforementioned raw body, and sends it via the provider of choice.
get_integer which repeatedly asks the user to input an integer value. This function could accept an optional prompt message as well as an error message!