Ok - there are a couple of things here
Assumptions: Appointment is defined as an intelligent BO, Email is set to be the default communication channel and for each appointment, you are using the standard AwareIM generated field Appointmenr.EmailAddress
Firstly, the syntax of the below statement is wrong. You are effectively adding 48 milliseconds to starttime
IF Appointment.StartTime<=ThisAppointment.StartTime+48
Secondly, if you are intending to do this as a scheduled process then SEND is better than create.
Third (and I suspect this is the cause of the error) The html syntax in your notification. Tag elements must be in double chevrons as in Dear <<appointment.customer.firstname>>
Fourth - why not hold a date field as well as the timestamp field it will make life a whole lot easier. You can set up a rule in the appointment BO to retrospectively do this Appointment.AppDate = DATE_PART(Appointment.StartTime)
Have a good read of the user manual (date and time functions) and try this.
Assuming you run as a scheduled task at 2:AM
FIND Appointment WHERE Appointment.AppDate=DATE_ADD (CURRENT_DATE, 4)
SEND OutgoingReminderEmal to Appointment
That's it - Simples (as the Meerkat says)
Good luck
...PS Study the Date and Time functions in the user guide - they are very powerful and will save you hours of hair pulling