void multimail(int *pnUserNumber, int numu) { mailrec m, m1; char s[255], s2[81]; WUser user; if (freek1(syscfg.msgsdir) < 10) { bout.nl(); bout << "Sorry, not enough disk space left.\r\n\n"; return; } bout.nl(); int i = 0; if (getslrec(session()->GetEffectiveSl()).ability & ability_email_anony) { i = 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); std::string t; inmsg(&m.msg, &t, &i, true, "email", INMSG_FSED, "Multi-Mail", MSGED_FLAG_NONE); if (m.msg.stored_as == 0xffffffff) { return; } strcpy(m.title, t.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; } application()->users()->ReadUser(&user, pnUserNumber[cv]); if ((user.GetSl() == 255 && (user.GetNumMailWaiting() > (syscfg.maxwaiting * 5))) || ((user.GetSl() != 255) && (user.GetNumMailWaiting() > syscfg.maxwaiting)) || user.GetNumMailWaiting() > 200) { bout << user.GetUserNameAndNumber(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); application()->users()->WriteUser(&user, pnUserNumber[cv]); if (pnUserNumber[cv] == 1) { ++fwaiting; } strcat(s, user.GetUserNameAndNumber(pnUserNumber[cv])); WStatus* pStatus = application()->GetStatusManager()->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); } application()->GetStatusManager()->CommitTransaction(pStatus); sysoplog(s); bout << s; bout.nl(); if (show_all) { sprintf(s2, "%-22.22s ", user.GetUserNameAndNumber(pnUserNumber[cv])); 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 >(i); m.fromsys = 0; m.fromuser = static_cast<unsigned short>(session()->usernum); m.tosys = 0; m.touser = 0; m.status = status_multimail; m.daten = static_cast<unsigned long>(time(nullptr)); unique_ptr<File> pFileEmail(OpenEmailFile(true)); int len = pFileEmail->GetLength() / sizeof(mailrec); if (len == 0) { i = 0; } else { 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<unsigned short>(pnUserNumber[cv]); pFileEmail->Write(&m, sizeof(mailrec)); } } pFileEmail->Close(); }