Przyznam, że nigdy w ten sposób PMek nie wysyłałem, korzystałem z tego kodu:
#Replace the name in PM Subject
$pm_subject = str_replace("{name}", $to['members_display_name'], $data['pm_subject']);
$this->ipsclass->DB->do_insert('message_topics', array(
'mt_msg_id' => $msg_id,
'mt_date' => time(),
'mt_title' => $pm_subject,
'mt_from_id' => $this->ipsclass->member['id'],
'mt_to_id' => $to['id'],
'mt_vid_folder' => 'in',
'mt_tracking' => 0,
'mt_hasattach' => 0,
'mt_owner_id' => $to['id'],
'mt_hide_cc' => 1,
) );
$to['vdirs'] = $to['vdirs'] ? $to['vdirs'] : 'in:Inbox;0|sent:Sent Items;0';
$inbox_count = $this->get_dir_count($to['vdirs']);
$this->rebuild_dir_count($to['id'], $to['vdirs'], $inbox_count, $show_popup);
Oczywiście to tylko fragment, ale ideę widać myślę.
Natomiast odnośnie Twojego kodu to tak, jak pisałem, to jest funkcja do wysyłania niejako 'oryginalnych' pmek, a dopiero z niej trzeba wyłuskać ten kod odpowiedzialny stricte za wysłanie PM, czyli ten podany wyżej. Spójrz sobie w tę funkcję i zobaczysz.
Gdyby możliwe było skorzystanie z tej funkcji to myślisz, że Terabyte by pisał swoją do wysyłania mass pmek?
I jeszcze wg mnie powinieneś najpierw w pętli while wyłuskać wszystkie ID/nazwy do kogo chcesz wysłać, a dopiero potem to wysyłać, a nie robić tego w pętli od razu. Dlaczego? Wg mnie tak będzie przejrzyściej i lepiej.