Это либо / или. и это не имеет ничего общего с Drupal, но с природой HTTP POST.
Либо вы используете # type => value, и Drupal сохраняет свое хранилище вне формы, внутри Drupal, через сеанс,
Или вы отправляете сообщение на внешний сервер, и в этом случае внутреннее хранилище сеанса не может помочь.
Система безопасности Drupals в API форм опирается на тот факт, что Drupal «знает» саму точную форму и, следовательно, может избежать неправильных значений, сравнивая их с исходной формой.
Внешний сайт ничего не знает об исходной форме и поэтому ничего не знает о том, как ее проверить.
Вам нужно будет выполнить проверку на конце получателя POST (этого внешнего сайта), ничего другого не будет безопасным (достаточно).
Эта проверка может быть локальным сценарием, запущенным на удаленном сайте, который просто проверяет белые списки или регулярные выражения.
В качестве альтернативы, этот удаленный сайт может запросить (например, через HTTP-SOAP или XMLRPC) форму на исходном Drupal-сайте, но этого будет довольно сложно достичь.
Третья альтернатива, и IMHO, самая простая, это позволить Drupal обрабатывать всю форму локально, а при проверке обрабатывать ее в ловушке submit. Там вы можете либо отправить значения на удаленный сайт безопасным способом, либо вы можете просто вставить его в базу данных или в некоторую систему спула этого удаленного сайта. В любом случае: в хуке отправки после того, как Drupal проверил форму, вы отправляете ее на удаленный сайт.