Version18.106

This commit is contained in:
Antonio Cañas Vargas 2019-04-09 14:04:04 +02:00
parent 5c6c49dd00
commit fdfd02011c
5 changed files with 120 additions and 53 deletions

View File

@ -1680,10 +1680,10 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] =
/* ActSeeMai */{ 855,-1,TabUnk,ActSeeNtf ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_SeeMailDomains ,NULL}, /* ActSeeMai */{ 855,-1,TabUnk,ActSeeNtf ,0x3F8,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,0x3C6,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_SeeMailDomains ,NULL},
/* ActEdiMai */{ 856,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_EditMailDomains ,NULL}, /* ActEdiMai */{ 856,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_EditMailDomains ,NULL},
/* ActNewMai */{ 857,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_RecFormNewMailDomain ,NULL}, /* ActNewMai */{ 857,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Mai_RecFormNewMailDomain ,Mai_ContEditAfterChgMai ,NULL},
/* ActRemMai */{ 860,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_RemoveMailDomain ,NULL}, /* ActRemMai */{ 860,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Mai_RemoveMailDomain ,Mai_ContEditAfterChgMai ,NULL},
/* ActRenMaiSho */{ 858,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_RenameMailDomainShort ,NULL}, /* ActRenMaiSho */{ 858,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Mai_RenameMailDomainShort ,Mai_ContEditAfterChgMai ,NULL},
/* ActRenMaiFul */{ 859,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,NULL ,Mai_RenameMailDomainFull ,NULL}, /* ActRenMaiFul */{ 859,-1,TabUnk,ActSeeNtf ,0x200,0x200,0x200,0x200,0x200,0x200,0x200,Act_CONT_NORM,Act_BRW_1ST_TAB,Mai_RenameMailDomainFull ,Mai_ContEditAfterChgMai ,NULL},
// TabSys ****************************************************************** // TabSys ******************************************************************
// Actions in menu: // Actions in menu:

View File

@ -464,10 +464,11 @@ En OpenSWAD:
ps2pdf source.ps destination.pdf ps2pdf source.ps destination.pdf
*/ */
#define Log_PLATFORM_VERSION "SWAD 18.105 (2019-04-09)" #define Log_PLATFORM_VERSION "SWAD 18.106 (2019-04-09)"
#define CSS_FILE "swad18.92.css" #define CSS_FILE "swad18.92.css"
#define JS_FILE "swad18.92.js" #define JS_FILE "swad18.92.js"
/* /*
Version 18.106: Apr 09, 2019 Code refactoring in edition of mail domains. (242208 lines)
Version 18.105: Apr 09, 2019 Code refactoring in edition of holidays. (242152 lines) Version 18.105: Apr 09, 2019 Code refactoring in edition of holidays. (242152 lines)
Version 18.104: Apr 09, 2019 Code refactoring in edition of classrooms. (242151 lines) Version 18.104: Apr 09, 2019 Code refactoring in edition of classrooms. (242151 lines)
Version 18.103: Apr 09, 2019 Code refactoring in edition of places. (242091 lines) Version 18.103: Apr 09, 2019 Code refactoring in edition of places. (242091 lines)

View File

@ -249,7 +249,6 @@ struct Globals
unsigned Num; // Number of mail domains unsigned Num; // Number of mail domains
struct Mail *Lst; // List of mail domains struct Mail *Lst; // List of mail domains
Mai_DomainsOrder_t SelectedOrder; Mai_DomainsOrder_t SelectedOrder;
struct Mail EditingMai;
} Mails; } Mails;
struct struct
{ {

View File

@ -63,7 +63,8 @@ extern struct Globals Gbl;
/***************************** Private variables *****************************/ /***************************** Private variables *****************************/
/*****************************************************************************/ /*****************************************************************************/
const char *Mai_EMAIL_SECTION_ID = "email_section"; static const char *Mai_EMAIL_SECTION_ID = "email_section";
static struct Mail *Mai_EditingMai = NULL; // Static variable to keep the mail domain being edited
/*****************************************************************************/ /*****************************************************************************/
/***************************** Private prototypes ****************************/ /***************************** Private prototypes ****************************/
@ -71,6 +72,7 @@ const char *Mai_EMAIL_SECTION_ID = "email_section";
static void Mai_GetParamMaiOrder (void); static void Mai_GetParamMaiOrder (void);
static void Mai_PutIconToEditMailDomains (void); static void Mai_PutIconToEditMailDomains (void);
static void Mai_EditMailDomainsInternal (void);
static void Mai_GetListMailDomainsAllowedForNotif (void); static void Mai_GetListMailDomainsAllowedForNotif (void);
static void Mai_GetMailDomain (const char *Email,char MailDomain[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]); static void Mai_GetMailDomain (const char *Email,char MailDomain[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]);
static bool Mai_CheckIfMailDomainIsAllowedForNotif (const char MailDomain[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]); static bool Mai_CheckIfMailDomainIsAllowedForNotif (const char MailDomain[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]);
@ -95,6 +97,9 @@ static void Mai_NewUsrEmail (struct UsrData *UsrDat,bool ItsMe);
static void Mai_InsertMailKey (const char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1], static void Mai_InsertMailKey (const char Email[Cns_MAX_BYTES_EMAIL_ADDRESS + 1],
const char MailKey[Mai_LENGTH_EMAIL_CONFIRM_KEY + 1]); const char MailKey[Mai_LENGTH_EMAIL_CONFIRM_KEY + 1]);
static void Mai_EditingMailDomainConstructor (void);
static void Mai_EditingMailDomainDestructor (void);
/*****************************************************************************/ /*****************************************************************************/
/************************* List all the mail domains *************************/ /************************* List all the mail domains *************************/
/*****************************************************************************/ /*****************************************************************************/
@ -195,6 +200,18 @@ static void Mai_PutIconToEditMailDomains (void)
/*****************************************************************************/ /*****************************************************************************/
void Mai_EditMailDomains (void) void Mai_EditMailDomains (void)
{
/***** Mail domain constructor *****/
Mai_EditingMailDomainConstructor ();
/***** Edit mail domains *****/
Mai_EditMailDomainsInternal ();
/***** Mail domain destructor *****/
Mai_EditingMailDomainDestructor ();
}
static void Mai_EditMailDomainsInternal (void)
{ {
/***** Get list of mail domains *****/ /***** Get list of mail domains *****/
Mai_GetListMailDomainsAllowedForNotif (); Mai_GetListMailDomainsAllowedForNotif ();
@ -540,26 +557,26 @@ long Mai_GetParamMaiCod (void)
void Mai_RemoveMailDomain (void) void Mai_RemoveMailDomain (void)
{ {
extern const char *Txt_Email_domain_X_removed; extern const char *Txt_Email_domain_X_removed;
struct Mail Mai;
/***** Mail domain constructor *****/
Mai_EditingMailDomainConstructor ();
/***** Get mail code *****/ /***** Get mail code *****/
if ((Mai.MaiCod = Mai_GetParamMaiCod ()) == -1L) if ((Mai_EditingMai->MaiCod = Mai_GetParamMaiCod ()) == -1L)
Lay_ShowErrorAndExit ("Code of mail domain is missing."); Lay_ShowErrorAndExit ("Code of mail domain is missing.");
/***** Get data of the mail from database *****/ /***** Get data of the mail from database *****/
Mai_GetDataOfMailDomainByCod (&Mai); Mai_GetDataOfMailDomainByCod (Mai_EditingMai);
/***** Remove mail *****/ /***** Remove mail *****/
DB_QueryDELETE ("can not remove a mail domain", DB_QueryDELETE ("can not remove a mail domain",
"DELETE FROM mail_domains WHERE MaiCod=%ld", "DELETE FROM mail_domains WHERE MaiCod=%ld",
Mai.MaiCod); Mai_EditingMai->MaiCod);
/***** Write message to show the change made *****/ /***** Write message to show the change made *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_Email_domain_X_removed, Ale_CreateAlert (Ale_SUCCESS,NULL,
Mai.Domain); Txt_Email_domain_X_removed,
Mai_EditingMai->Domain);
/***** Show the form again *****/
Mai_EditMailDomains ();
} }
/*****************************************************************************/ /*****************************************************************************/
@ -568,6 +585,10 @@ void Mai_RemoveMailDomain (void)
void Mai_RenameMailDomainShort (void) void Mai_RenameMailDomainShort (void)
{ {
/***** Mail domain constructor *****/
Mai_EditingMailDomainConstructor ();
/***** Rename mail domain *****/
Mai_RenameMailDomain (Cns_SHRT_NAME); Mai_RenameMailDomain (Cns_SHRT_NAME);
} }
@ -577,6 +598,10 @@ void Mai_RenameMailDomainShort (void)
void Mai_RenameMailDomainFull (void) void Mai_RenameMailDomainFull (void)
{ {
/***** Mail domain constructor *****/
Mai_EditingMailDomainConstructor ();
/***** Rename mail domain *****/
Mai_RenameMailDomain (Cns_FULL_NAME); Mai_RenameMailDomain (Cns_FULL_NAME);
} }
@ -590,40 +615,38 @@ static void Mai_RenameMailDomain (Cns_ShrtOrFullName_t ShrtOrFullName)
extern const char *Txt_The_email_domain_X_already_exists; extern const char *Txt_The_email_domain_X_already_exists;
extern const char *Txt_The_email_domain_X_has_been_renamed_as_Y; extern const char *Txt_The_email_domain_X_has_been_renamed_as_Y;
extern const char *Txt_The_email_domain_X_has_not_changed; extern const char *Txt_The_email_domain_X_has_not_changed;
struct Mail *Mai;
const char *ParamName = NULL; // Initialized to avoid warning const char *ParamName = NULL; // Initialized to avoid warning
const char *FieldName = NULL; // Initialized to avoid warning const char *FieldName = NULL; // Initialized to avoid warning
unsigned MaxBytes = 0; // Initialized to avoid warning unsigned MaxBytes = 0; // Initialized to avoid warning
char *CurrentMaiName = NULL; // Initialized to avoid warning char *CurrentMaiName = NULL; // Initialized to avoid warning
char NewMaiName[Mai_MAX_BYTES_MAIL_INFO + 1]; char NewMaiName[Mai_MAX_BYTES_MAIL_INFO + 1];
Mai = &Gbl.Mails.EditingMai;
switch (ShrtOrFullName) switch (ShrtOrFullName)
{ {
case Cns_SHRT_NAME: case Cns_SHRT_NAME:
ParamName = "Domain"; ParamName = "Domain";
FieldName = "Domain"; FieldName = "Domain";
MaxBytes = Cns_MAX_BYTES_EMAIL_ADDRESS; MaxBytes = Cns_MAX_BYTES_EMAIL_ADDRESS;
CurrentMaiName = Mai->Domain; CurrentMaiName = Mai_EditingMai->Domain;
break; break;
case Cns_FULL_NAME: case Cns_FULL_NAME:
ParamName = "Info"; ParamName = "Info";
FieldName = "Info"; FieldName = "Info";
MaxBytes = Mai_MAX_BYTES_MAIL_INFO; MaxBytes = Mai_MAX_BYTES_MAIL_INFO;
CurrentMaiName = Mai->Info; CurrentMaiName = Mai_EditingMai->Info;
break; break;
} }
/***** Get parameters from form *****/ /***** Get parameters from form *****/
/* Get the code of the mail */ /* Get the code of the mail */
if ((Mai->MaiCod = Mai_GetParamMaiCod ()) == -1L) if ((Mai_EditingMai->MaiCod = Mai_GetParamMaiCod ()) == -1L)
Lay_ShowErrorAndExit ("Code of mail domain is missing."); Lay_ShowErrorAndExit ("Code of mail domain is missing.");
/* Get the new name for the mail */ /* Get the new name for the mail */
Par_GetParToText (ParamName,NewMaiName,MaxBytes); Par_GetParToText (ParamName,NewMaiName,MaxBytes);
/***** Get from the database the old names of the mail *****/ /***** Get from the database the old names of the mail *****/
Mai_GetDataOfMailDomainByCod (Mai); Mai_GetDataOfMailDomainByCod (Mai_EditingMai);
/***** Check if new name is empty *****/ /***** Check if new name is empty *****/
if (!NewMaiName[0]) if (!NewMaiName[0])
@ -637,14 +660,14 @@ static void Mai_RenameMailDomain (Cns_ShrtOrFullName_t ShrtOrFullName)
if (strcmp (CurrentMaiName,NewMaiName)) // Different names if (strcmp (CurrentMaiName,NewMaiName)) // Different names
{ {
/***** If mail was in database... *****/ /***** If mail was in database... *****/
if (Mai_CheckIfMailDomainNameExists (ParamName,NewMaiName,Mai->MaiCod)) if (Mai_CheckIfMailDomainNameExists (ParamName,NewMaiName,Mai_EditingMai->MaiCod))
Ale_CreateAlert (Ale_WARNING,Mai_EMAIL_SECTION_ID, Ale_CreateAlert (Ale_WARNING,Mai_EMAIL_SECTION_ID,
Txt_The_email_domain_X_already_exists, Txt_The_email_domain_X_already_exists,
NewMaiName); NewMaiName);
else else
{ {
/* Update the table changing old name by new name */ /* Update the table changing old name by new name */
Mai_UpdateMailDomainNameDB (Mai->MaiCod,FieldName,NewMaiName); Mai_UpdateMailDomainNameDB (Mai_EditingMai->MaiCod,FieldName,NewMaiName);
/* Write message to show the change made */ /* Write message to show the change made */
Ale_CreateAlert (Ale_SUCCESS,Mai_EMAIL_SECTION_ID, Ale_CreateAlert (Ale_SUCCESS,Mai_EMAIL_SECTION_ID,
@ -658,10 +681,9 @@ static void Mai_RenameMailDomain (Cns_ShrtOrFullName_t ShrtOrFullName)
CurrentMaiName); CurrentMaiName);
} }
/***** Show the form again *****/ /***** Update name *****/
Str_Copy (CurrentMaiName,NewMaiName, Str_Copy (CurrentMaiName,NewMaiName,
MaxBytes); MaxBytes);
Mai_EditMailDomains ();
} }
/*****************************************************************************/ /*****************************************************************************/
@ -690,6 +712,22 @@ static void Mai_UpdateMailDomainNameDB (long MaiCod,const char *FieldName,const
FieldName,NewMaiName,MaiCod); FieldName,NewMaiName,MaiCod);
} }
/*****************************************************************************/
/******* Show alerts after changing a mail domain and continue editing *******/
/*****************************************************************************/
void Mai_ContEditAfterChgMai (void)
{
/***** Write message to show the change made *****/
Ale_ShowAlerts (NULL);
/***** Show the form again *****/
Mai_EditMailDomainsInternal ();
/***** Mail domain destructor *****/
Mai_EditingMailDomainDestructor ();
}
/*****************************************************************************/ /*****************************************************************************/
/*********************** Put a form to create a new mail *********************/ /*********************** Put a form to create a new mail *********************/
/*****************************************************************************/ /*****************************************************************************/
@ -700,9 +738,6 @@ static void Mai_PutFormToCreateMailDomain (void)
extern const char *Txt_New_email_domain; extern const char *Txt_New_email_domain;
extern const char *Txt_EMAIL_DOMAIN_ORDER[3]; extern const char *Txt_EMAIL_DOMAIN_ORDER[3];
extern const char *Txt_Create_email_domain; extern const char *Txt_Create_email_domain;
struct Mail *Mai;
Mai = &Gbl.Mails.EditingMai;
/***** Start form *****/ /***** Start form *****/
Frm_StartForm (ActNewMai); Frm_StartForm (ActNewMai);
@ -730,7 +765,7 @@ static void Mai_PutFormToCreateMailDomain (void)
" size=\"15\" maxlength=\"%u\" value=\"%s\"" " size=\"15\" maxlength=\"%u\" value=\"%s\""
" required=\"required\" />" " required=\"required\" />"
"</td>", "</td>",
Cns_MAX_CHARS_EMAIL_ADDRESS,Mai->Domain); Cns_MAX_CHARS_EMAIL_ADDRESS,Mai_EditingMai->Domain);
/***** Mail domain info *****/ /***** Mail domain info *****/
fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">" fprintf (Gbl.F.Out,"<td class=\"CENTER_MIDDLE\">"
@ -740,7 +775,7 @@ static void Mai_PutFormToCreateMailDomain (void)
"</td>" "</td>"
"<td></td>" "<td></td>"
"</tr>", "</tr>",
Mai_MAX_CHARS_MAIL_INFO,Mai->Info); Mai_MAX_CHARS_MAIL_INFO,Mai_EditingMai->Info);
/***** End table, send button and end box *****/ /***** End table, send button and end box *****/
@ -787,35 +822,41 @@ static void Mai_PutHeadMailDomains (void)
void Mai_RecFormNewMailDomain (void) void Mai_RecFormNewMailDomain (void)
{ {
extern const char *Txt_The_email_domain_X_already_exists; extern const char *Txt_The_email_domain_X_already_exists;
extern const char *Txt_Created_new_email_domain_X;
extern const char *Txt_You_must_specify_the_short_name_and_the_full_name_of_the_new_email_domain; extern const char *Txt_You_must_specify_the_short_name_and_the_full_name_of_the_new_email_domain;
struct Mail *Mai;
Mai = &Gbl.Mails.EditingMai; /***** Mail domain constructor *****/
Mai_EditingMailDomainConstructor ();
/***** Get parameters from form *****/ /***** Get parameters from form *****/
/* Get mail short name */ /* Get mail short name */
Par_GetParToText ("Domain",Mai->Domain,Cns_MAX_BYTES_EMAIL_ADDRESS); Par_GetParToText ("Domain",Mai_EditingMai->Domain,Cns_MAX_BYTES_EMAIL_ADDRESS);
/* Get mail full name */ /* Get mail full name */
Par_GetParToText ("Info",Mai->Info,Mai_MAX_BYTES_MAIL_INFO); Par_GetParToText ("Info",Mai_EditingMai->Info,Mai_MAX_BYTES_MAIL_INFO);
if (Mai->Domain[0] && Mai->Info[0]) // If there's a mail name if (Mai_EditingMai->Domain[0] &&
Mai_EditingMai->Info[0]) // If there's a mail name
{ {
/***** If name of mail was in database... *****/ /***** If name of mail was in database... *****/
if (Mai_CheckIfMailDomainNameExists ("Domain",Mai->Domain,-1L)) if (Mai_CheckIfMailDomainNameExists ("Domain",Mai_EditingMai->Domain,-1L))
Ale_ShowAlert (Ale_WARNING,Txt_The_email_domain_X_already_exists, Ale_CreateAlert (Ale_WARNING,NULL,
Mai->Domain); Txt_The_email_domain_X_already_exists,
else if (Mai_CheckIfMailDomainNameExists ("Info",Mai->Info,-1L)) Mai_EditingMai->Domain);
Ale_ShowAlert (Ale_WARNING,Txt_The_email_domain_X_already_exists, else if (Mai_CheckIfMailDomainNameExists ("Info",Mai_EditingMai->Info,-1L))
Mai->Info); Ale_CreateAlert (Ale_WARNING,NULL,
Txt_The_email_domain_X_already_exists,
Mai_EditingMai->Info);
else // Add new mail to database else // Add new mail to database
Mai_CreateMailDomain (Mai); {
Mai_CreateMailDomain (Mai_EditingMai);
Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_email_domain_X,
Mai_EditingMai->Domain);
}
} }
else // If there is not a mail name else // If there is not a mail name
Ale_ShowAlert (Ale_WARNING,Txt_You_must_specify_the_short_name_and_the_full_name_of_the_new_email_domain); Ale_CreateAlert (Ale_WARNING,NULL,
Txt_You_must_specify_the_short_name_and_the_full_name_of_the_new_email_domain);
/***** Show the form again *****/
Mai_EditMailDomains ();
} }
/*****************************************************************************/ /*****************************************************************************/
@ -824,8 +865,6 @@ void Mai_RecFormNewMailDomain (void)
static void Mai_CreateMailDomain (struct Mail *Mai) static void Mai_CreateMailDomain (struct Mail *Mai)
{ {
extern const char *Txt_Created_new_email_domain_X;
/***** Create a new mail *****/ /***** Create a new mail *****/
DB_QueryINSERT ("can not create mail domain", DB_QueryINSERT ("can not create mail domain",
"INSERT INTO mail_domains" "INSERT INTO mail_domains"
@ -833,10 +872,6 @@ static void Mai_CreateMailDomain (struct Mail *Mai)
" VALUES" " VALUES"
" ('%s','%s')", " ('%s','%s')",
Mai->Domain,Mai->Info); Mai->Domain,Mai->Info);
/***** Write success message *****/
Ale_ShowAlert (Ale_SUCCESS,Txt_Created_new_email_domain_X,
Mai->Domain);
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1889,3 +1924,34 @@ bool Mai_ICanSeeOtherUsrEmail (const struct UsrData *UsrDat)
return false; return false;
} }
} }
/*****************************************************************************/
/********************** Mail domain constructor/destructor *******************/
/*****************************************************************************/
static void Mai_EditingMailDomainConstructor (void)
{
/***** Pointer must be NULL *****/
if (Mai_EditingMai != NULL)
Lay_ShowErrorAndExit ("Error initializing mail domain.");
/***** Allocate memory for mail domain *****/
if ((Mai_EditingMai = (struct Mail *) malloc (sizeof (struct Mail))) == NULL)
Lay_ShowErrorAndExit ("Error allocating memory for mail domain.");
/***** Reset place *****/
Mai_EditingMai->MaiCod = -1L;
Mai_EditingMai->Domain[0] = '\0';
Mai_EditingMai->Info[0] = '\0';
Mai_EditingMai->NumUsrs = 0;
}
static void Mai_EditingMailDomainDestructor (void)
{
/***** Free memory used for mail domain *****/
if (Mai_EditingMai != NULL)
{
free ((void *) Mai_EditingMai);
Mai_EditingMai = NULL;
}
}

View File

@ -69,6 +69,7 @@ long Mai_GetParamMaiCod (void);
void Mai_RemoveMailDomain (void); void Mai_RemoveMailDomain (void);
void Mai_RenameMailDomainShort (void); void Mai_RenameMailDomainShort (void);
void Mai_RenameMailDomainFull (void); void Mai_RenameMailDomainFull (void);
void Mai_ContEditAfterChgMai (void);
void Mai_RecFormNewMailDomain (void); void Mai_RecFormNewMailDomain (void);
void Mai_ListEmails (void); // Creates an email message to students void Mai_ListEmails (void); // Creates an email message to students