A message should only be received once. Because of this, messages can only be received through a portal singleton, the source code of which can be found here. The singleton takes the message data and associated validator signatures and creates a message coin with this puzzle:
The message coin has an amount of 0 and locks in to a receiver coin via announcements. The message coin can optionally be spent in the same transaction that it was created so a user both relays a message and uses the intended receiver puzzle in the same transaction.