The internal ProducerMessage struct has a field:
/// UTC Unix timestamp in milliseconds, time at which the message should be
/// delivered to consumers
pub deliver_at_time: ::std::option::Option<i64>,
That today appears to be only settable via the MessageBuilder abstraction. If you implement SerializeMessage yourself, I don't see a way to set it.
Since SerializeMessage produces the public producer::Message, which doesn't have a deliver_at_time, I think you are forced to use MessageBuilder.
Is this expected or a bug?