Mail not send if preferred_mail_format is NULL
We fixed this quite old behaviour by hacking CRM/Mailing/BAO/Mailing.php around line 1295 by overriding:

if ($text &amp;&amp; ($test || $contact['preferred_mail_format'] == 'Text' ||
    $contact['preferred_mail_format'] == 'Both' ||
    ($contact['preferred_mail_format'] == 'HTML' &amp;&amp; !array_key_exists('html', $pEmails))
  )
) {
  $textBody = implode('', $text);
  if ($useSmarty) {
    $textBody = $smarty-&gt;fetch("string:$textBody");
  }
  $mailParams['text'] = $textBody;
}

if ($html &amp;&amp; ($test || ($contact['preferred_mail_format'] == 'HTML' ||
      $contact['preferred_mail_format'] == 'Both'
    ))
) {
  $htmlBody = implode('', $html);
  if ($useSmarty) {
    $htmlBody = $smarty-&gt;fetch("string:$htmlBody");
  }
  $mailParams['html'] = $htmlBody;
}


with:

$pmf = isset($contact['preferred_mail_format']) ?   $contact['preferred_mail_format'] : 'Both';
if ($pmf != "Both" &amp;&amp; $pmf != "Text" &amp;&amp; $pmf != "HTML") {
    $pmf = "Both";
}
if ($text &amp;&amp; ($test || $pmf == 'Text' || $pmf == 'Both' ||
        ($pmf == 'HTML' &amp;&amp; !array_key_exists('html', $pEmails))
)
) {
    $textBody = implode('', $text);
    if ($useSmarty) {
        $textBody = $smarty-&gt;fetch("string:$textBody");
    }
    $mailParams['text'] = $textBody;
}

if ($html &amp;&amp; ($test || ($pmf == 'HTML' || $pmf == 'Both' ))) {
    $htmlBody = implode('', $html);
    if ($useSmarty) {
        $htmlBody = $smarty-&gt;fetch("string:$htmlBody");
    }
    $mailParams['html'] = $htmlBody;
}