There are a few things you should know.
First, the default SQL JOIN constructor is essentially a cross-product set limited to the WHERE clause. This means that it is multiplicative - you get duplicate results, which you then cut. You should also be careful when there are NULL fields.
Secondly, there is the keyword "DISTINCT". When you prefix a column in this selection, you will get no more than one instance of a specific value for that column in the results. Thus, according to your request, "SELECT DISTINCT user.id FROM" will eliminate server-side redundancies.
Third, the correct way to solve this problem is most likely not to use the '*' operator. I suggest:
SELECT user.id, username, email address, subject FROM message m, user WHERE m.user_id = user.id AND user.status = 1
This uses the simple, easy-to-understand implicit join syntax and must be valid SQL on any server. I can guarantee that it works with MySQL, at least. It also smoothes the message table "m" as abbreviated.
As you might guess, this will reduce the traffic from the SQL server to your database.
edit: if you want to exclude "redundant" email information, you cannot - you must make two different requests. SQL results are tables and must be rectangular, with all known values. No entry for 'ditto'.
edit 2: you only need to make two queries. For instance:
SELECT subject FROM message WHERE message.id IN (SELECT user.id FROM user WHERE status = 1)
This is one query containing a subquery, so it makes two calls to the database. But it does not have program cycles.