void multimail(int *pnUserNumber, int numu) {
  mailrec m, m1;
  char s[255], s2[81];
  User user;
  memset(&m, 0, sizeof(mailrec));

  if (freek1(syscfg.msgsdir) < 10) {
    bout.nl();
    bout << "Sorry, not enough disk space left.\r\n\n";
    return;
  }
  bout.nl();

  MessageEditorData data;
  data.need_title = true;
  if (getslrec(session()->GetEffectiveSl()).ability & ability_email_anony) {
    data.anonymous_flag = anony_enable_anony;
  }
  bout << "|#5Show all recipients in mail? ";
  bool show_all = yesno();
  int j = 0;
  string s1 = StringPrintf("\003""6CC: \003""1");

  m.msg.storage_type = EMAIL_STORAGE;
  strcpy(irt, "Multi-Mail");
  irt_name[0] = 0;
  File::Remove(QUOTES_TXT);
  data.aux = "email";
  data.fsed_flags = INMSG_NOFSED;
  data.to_name = "Multi-Mail";
  data.msged_flags = MSGED_FLAG_NONE;
  if (!inmsg(data)) {
    return;
  }
  savefile(data.text, &m.msg, data.aux);
  strcpy(m.title, data.title.c_str());

  bout <<  "Mail sent to:\r\n";
  sysoplog("Multi-Mail to:");

  lineadd(&m.msg, "\003""7----", "email");

  for (int cv = 0; cv < numu; cv++) {
    if (pnUserNumber[cv] < 0) {
      continue;
    }
    session()->users()->ReadUser(&user, pnUserNumber[cv]);
    if ((user.GetSl() == 255 && (user.GetNumMailWaiting() > static_cast<unsigned int>(syscfg.maxwaiting * 5))) ||
        ((user.GetSl() != 255) && (user.GetNumMailWaiting() > syscfg.maxwaiting)) ||
        user.GetNumMailWaiting() > 200) {
      bout << session()->names()->UserName(pnUserNumber[cv]) << " mailbox full, not sent.";
      pnUserNumber[cv] = -1;
      continue;
    }
    if (user.IsUserDeleted()) {
      bout << "User deleted, not sent.\r\n";
      pnUserNumber[cv] = -1;
      continue;
    }
    strcpy(s, "  ");
    user.SetNumMailWaiting(user.GetNumMailWaiting() + 1);
    session()->users()->WriteUser(&user, pnUserNumber[cv]);
    if (pnUserNumber[cv] == 1) {
      ++fwaiting;
    }
    const string pnunn = session()->names()->UserName(pnUserNumber[cv]);
    strcat(s, pnunn.c_str());
    WStatus* pStatus = session()->status_manager()->BeginTransaction();
    if (pnUserNumber[cv] == 1) {
      pStatus->IncrementNumFeedbackSentToday();
      session()->user()->SetNumFeedbackSentToday(session()->user()->GetNumFeedbackSentToday() + 1);
      session()->user()->SetNumFeedbackSent(session()->user()->GetNumFeedbackSent() + 1);
      ++fsenttoday;
    } else {
      pStatus->IncrementNumEmailSentToday();
      session()->user()->SetNumEmailSent(session()->user()->GetNumEmailSent() + 1);
      session()->user()->SetNumEmailSentToday(session()->user()->GetNumEmailSentToday() + 1);
    }
    session()->status_manager()->CommitTransaction(pStatus);
    sysoplog(s);
    bout << s;
    bout.nl();
    if (show_all) {
      const string pnunn2 = session()->names()->UserName(pnUserNumber[cv]);
      sprintf(s2, "%-22.22s  ", pnunn2.c_str());
      s1.assign(s2);
      j++;
      if (j >= 3) {
        lineadd(&m.msg, s1, "email");
        j = 0;
        s1 = "\003""1    ";
      }
    }
  }
  if (show_all) {
    if (j) {
      lineadd(&m.msg, s1, "email");
    }
  }
  s1 = StringPrintf("\003""2Mail Sent to %d Addresses!", numu);
  lineadd(&m.msg, "\003""7----", "email");
  lineadd(&m.msg, s1, "email");

  m.anony = static_cast<unsigned char>(data.anonymous_flag);
  m.fromsys = 0;
  m.fromuser = static_cast<uint16_t>(session()->usernum);
  m.tosys = 0;
  m.touser = 0;
  m.status = status_multimail;
  m.daten = static_cast<uint32_t>(time(nullptr));

  unique_ptr<File> pFileEmail(OpenEmailFile(true));
  int len = pFileEmail->GetLength() / sizeof(mailrec);
  int i = 0;
  if (len != 0) {
    i = len - 1;
    pFileEmail->Seek(static_cast<long>(i) * sizeof(mailrec), File::seekBegin);
    pFileEmail->Read(&m1, sizeof(mailrec));
    while ((i > 0) && (m1.tosys == 0) && (m1.touser == 0)) {
      --i;
      pFileEmail->Seek(static_cast<long>(i) * sizeof(mailrec), File::seekBegin);
      int i1 = pFileEmail->Read(&m1, sizeof(mailrec));
      if (i1 == -1) {
        bout << "|#6DIDN'T READ WRITE!\r\n";
      }
    }
    if ((m1.tosys) || (m1.touser)) {
      ++i;
    }
  }
  pFileEmail->Seek(static_cast<long>(i) * sizeof(mailrec), File::seekBegin);
  for (int cv = 0; cv < numu; cv++) {
    if (pnUserNumber[cv] > 0) {
      m.touser = static_cast<uint16_t>(pnUserNumber[cv]);
      pFileEmail->Write(&m, sizeof(mailrec));
    }
  }
  pFileEmail->Close();
}
int oneuser() {
  char s[81], *ss;
  int user_number, system_number, i;
  User user;

  if (mml_s) {
    if (mml_started) {
      ss = strtok(nullptr, "\r\n");
    } else {
      ss = strtok(mml_s, "\r\n");
    }
    mml_started = 1;
    if (ss == nullptr) {
      free(mml_s);
      mml_s = nullptr;
      return -1;
    }
    strcpy(s, ss);
    for (i = 0; s[i] != 0; i++) {
      s[i] = upcase(s[i]);
    }
  } else {
    bout << "|#2>";
    input(s, 40);
  }
  user_number = finduser1(s);
  if (user_number == 65535) {
    return -1;
  }
  if (s[0] == 0) {
    return -1;
  }
  if (user_number <= 0) {
    bout.nl();
    bout << "Unknown user.\r\n\n";
    return 0;
  }
  system_number = 0;
  if (ForwardMessage(&user_number, &system_number)) {
    bout.nl();
    bout << "Forwarded.\r\n\n";
    if (system_number) {
      bout << "Forwarded to another system.\r\n";
      bout << "Can't send multi-mail to another system.\r\n\n";
      return 0;
    }
  }
  if (user_number == 0) {
    bout.nl();
    bout << "Unknown user.\r\n\n";
    return 0;
  }
  session()->users()->ReadUser(&user, user_number);
  if (((user.GetSl() == 255) && (user.GetNumMailWaiting() > static_cast<unsigned int>(syscfg.maxwaiting * 5))) ||
      ((user.GetSl() != 255) && (user.GetNumMailWaiting() > syscfg.maxwaiting)) ||
      (user.GetNumMailWaiting() > 200)) {
    bout.nl();
    bout << "Mailbox full.\r\n\n";
    return 0;
  }
  if (user.IsUserDeleted()) {
    bout.nl();
    bout << "Deleted user.\r\n\n";
    return 0;
  }
  bout << "     -> " << session()->names()->UserName(user_number) << wwiv::endl;
  return user_number;
}