The main difference between synchronous send() and asynchronous queue() for your ForgotPassword object is that when sending a queue to an object for sending, it must be serialized to send to the queue, and unserialized when the queue workflow processes it.
Since send() works fine, but an error occurs with queue() , and we can see that the job in the queue is running and trying to be processed, most likely an error in serialization / unserialization.
Your ForgotPassword class probably uses the SerializesModels flag since the artisan command generates a new object to be delivered. This attribute defines the __sleep() and __wakeup() methods that affect the operation of serialization and non-serialization.
When the __sleep method __sleep implemented, PHP will only serialize the variables returned by the __sleep method. In this case, the implementation provided by the SerializesModels tag uses Reflection to navigate through the properties defined in the class to provide a special way to serialize Eloquent models and collections.
Because of this, this means that any variables in your ForgotPassword class that are not specifically defined as a class property will not be serialized and will not be available when processing a job in a queue, but a serialization class. This is the most likely cause for your problem. When your work is done, your uncertified email copy does not have the necessary data and does not work.
There are two ways to solve this problem. Firstly, if your ForgotPassword does not really need to serialize any models, you can remove the SerializedModels tag. This will remove the __sleep() definition from the class, and then all the variables assigned to the class, and not just the ones that are actually defined, will be serialized and will be available if the class is non-sterilized.
The second option, more suitable and more explicit, is to actually define the properties that you need in the ForgotPassword class.
If you define the properties of your class, you can leave the SerializesModels flag in your class. However, if you are not actually serializing the models, I would go and remove it. There is no need for additional serialization costs if you do not need it.