/**
  * @param Campaign           $campaign
  * @param CampaignEmail      $campaignEmail
  * @param CampaignRepository $campaignRepository
  * @return Campaign
  * @throws \Mailgun\Messages\Exceptions\MissingRequiredMIMEParameters
  */
 public function send(Campaign $campaign, CampaignEmail $campaignEmail, CampaignRepository $campaignRepository)
 {
     $mg = new Mailgun($this->key);
     $domain = $campaign->getFromEmailDomain();
     if (!$campaign->remoteCampaignId()) {
         $campaign = $this->setRemoteCampaignId($campaign, $mg, $domain, $campaignRepository);
     }
     $vars = [];
     $vars['from'] = $campaign->fromName() . ' <' . $campaign->fromEmail() . '>';
     $vars['to'] = $this->getNameFromVariables($campaignEmail->variables()) . ' <' . $campaignEmail->emailAddress() . '>';
     $vars['subject'] = $this->insertVariables($campaign->subjectLine(), $campaignEmail->variables());
     $vars['text'] = $this->insertVariables($campaign->plaintext(), $campaignEmail->variables());
     $vars['html'] = $this->insertVariables($campaign->html(), $campaignEmail->variables());
     $vars['o:campaign'] = $campaign->remoteCampaignId();
     $vars['o:testmode'] = $this->testMode;
     $result = $mg->sendMessage($domain, $vars);
     return $result;
 }