mirror of https://github.com/acanas/swad-core.git
Version 22.60: Nov 29, 2022 Fixed bug sending notification emails. Reported by Manuel Rodríguez Álvarez and Eva Martínez Ortigosa.
This commit is contained in:
parent
809be1539c
commit
0b2fff1b0c
|
@ -290,7 +290,9 @@ unsigned Brw_DB_GetFileMetadataByPath (MYSQL_RES **mysql_res,const char *Path)
|
|||
" WHERE FileBrowser=%u"
|
||||
" AND Cod=%ld"
|
||||
" AND ZoneUsrCod=%ld"
|
||||
" AND Path='%s'",
|
||||
" AND Path='%s'"
|
||||
" ORDER BY FilCod DESC" // Due to errors, there could be old entries for the same path.
|
||||
" LIMIT 1", // Select the most recent entry.
|
||||
(unsigned) Brw_DB_FileBrowserForDB_files[Gbl.FileBrowser.Type],
|
||||
Cod,
|
||||
ZoneUsrCod,
|
||||
|
@ -2311,7 +2313,9 @@ unsigned Brw_DB_CheckIfFileOrFolderIsSetAsHiddenUsingPath (MYSQL_RES **mysql_res
|
|||
" WHERE FileBrowser=%u"
|
||||
" AND Cod=%ld"
|
||||
" AND ZoneUsrCod=%ld"
|
||||
" AND Path='%s'",
|
||||
" AND Path='%s'"
|
||||
" ORDER BY FilCod DESC" // Due to errors, there could be old entries for the same path.
|
||||
" LIMIT 1", // Select the most recent entry.
|
||||
(unsigned) Brw_DB_FileBrowserForDB_files[Gbl.FileBrowser.Type],
|
||||
Cod,
|
||||
ZoneUsrCod,
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
/*****************************************************************************/
|
||||
|
||||
#include <dirent.h> // For scandir, etc.
|
||||
#include <stdlib.h> // For free
|
||||
#include <string.h> // For string functions
|
||||
#include <sys/stat.h> // For lstat
|
||||
|
||||
|
|
|
@ -604,7 +604,7 @@ TODO: Fix bug: error al enviar un mensaje a dos recipientes, error on duplicate
|
|||
|
||||
TODO: Attach pdf files in multimedia.
|
||||
*/
|
||||
#define Log_PLATFORM_VERSION "SWAD 22.59.1 (2022-11-23)"
|
||||
#define Log_PLATFORM_VERSION "SWAD 22.60 (2022-11-29)"
|
||||
#define CSS_FILE "swad22.57.1.css"
|
||||
#define JS_FILE "swad22.49.js"
|
||||
/*
|
||||
|
@ -615,6 +615,7 @@ Que al subir un fichero por defecto est
|
|||
Al subir cosas para los grupos, en documentos, resltar más los grupos porque no son conscientes...
|
||||
Exportar listas en CSV.
|
||||
|
||||
Version 22.60: Nov 29, 2022 Fixed bug sending notification emails. Reported by Manuel Rodríguez Álvarez and Eva Martínez Ortigosa. (334114 lines)
|
||||
Version 22.59.1: Nov 23, 2022 Fixed bug in file browser. Reported by Javier Fernández Baldomero. (334070 lines)
|
||||
Version 22.59: Nov 06, 2022 New module swad_browser_size. (334067 lines)
|
||||
Version 22.58: Nov 06, 2022 New module swad_action_list for list of actions. (333958 lines)
|
||||
|
|
38
swad_mail.c
38
swad_mail.c
|
@ -326,12 +326,20 @@ bool Mai_CheckIfUsrCanReceiveEmailNotif (const struct Usr_Data *UsrDat)
|
|||
{
|
||||
char MailDomain[Cns_MAX_BYTES_EMAIL_ADDRESS + 1];
|
||||
|
||||
/***** Check #1: is my email address confirmed? *****/
|
||||
/***** Check #1: is email empty or filled? *****/
|
||||
if (!UsrDat->Email[0])
|
||||
return false;
|
||||
|
||||
/***** Check #2: is email address confirmed? *****/
|
||||
if (!UsrDat->EmailConfirmed)
|
||||
return false;
|
||||
|
||||
/***** Check #2: if my mail domain allowed? *****/
|
||||
/***** Check #3: check if there is mail domain *****/
|
||||
Mai_GetMailDomain (UsrDat->Email,MailDomain);
|
||||
if (!MailDomain[0])
|
||||
return false;
|
||||
|
||||
/***** Check #4: is mail domain allowed? *****/
|
||||
return Mai_DB_CheckIfMailDomainIsAllowedForNotif (MailDomain);
|
||||
}
|
||||
|
||||
|
@ -1454,15 +1462,21 @@ bool Mai_SendMailMsgToConfirmEmail (void)
|
|||
extern const char *Txt_There_was_a_problem_sending_an_email_automatically;
|
||||
char FileNameMail[PATH_MAX + 1];
|
||||
FILE *FileMail;
|
||||
Lan_Language_t ToUsrLanguage;
|
||||
const char *UniqueNameEncrypted = Cry_GetUniqueNameEncrypted ();
|
||||
int ReturnCode;
|
||||
|
||||
/***** Create temporary file for mail content *****/
|
||||
Mai_CreateFileNameMail (FileNameMail,&FileMail);
|
||||
|
||||
/***** If I have no language, set language to current language *****/
|
||||
ToUsrLanguage = Gbl.Usrs.Me.UsrDat.Prefs.Language;
|
||||
if (ToUsrLanguage == Lan_LANGUAGE_UNKNOWN)
|
||||
ToUsrLanguage = Gbl.Prefs.Language;
|
||||
|
||||
/***** Write mail content into file and close file *****/
|
||||
/* Welcome note */
|
||||
Mai_WriteWelcomeNoteEMail (FileMail,&Gbl.Usrs.Me.UsrDat);
|
||||
Mai_WriteWelcomeNoteEMail (FileMail,&Gbl.Usrs.Me.UsrDat,ToUsrLanguage);
|
||||
|
||||
/* Store encrypted key in database */
|
||||
Mai_InsertMailKey (Gbl.Usrs.Me.UsrDat.Email,UniqueNameEncrypted);
|
||||
|
@ -1475,13 +1489,14 @@ bool Mai_SendMailMsgToConfirmEmail (void)
|
|||
Cfg_URL_SWAD_CGI);
|
||||
|
||||
/* Footer note */
|
||||
Mai_WriteFootNoteEMail (FileMail,Gbl.Prefs.Language);
|
||||
Mai_WriteFootNoteEMail (FileMail,ToUsrLanguage);
|
||||
|
||||
fclose (FileMail);
|
||||
|
||||
/***** Call the script to send an email *****/
|
||||
ReturnCode = Mai_SendMailMsg (FileNameMail,
|
||||
Txt_Confirmation_of_your_email_NO_HTML);
|
||||
Txt_Confirmation_of_your_email_NO_HTML,
|
||||
Gbl.Usrs.Me.UsrDat.Email);
|
||||
|
||||
/***** Remove temporary file *****/
|
||||
unlink (FileNameMail);
|
||||
|
@ -1609,15 +1624,16 @@ void Mai_CreateFileNameMail (char FileNameMail[PATH_MAX + 1],FILE **FileMail)
|
|||
/************ Write a welcome note heading the automatic email ***************/
|
||||
/*****************************************************************************/
|
||||
|
||||
void Mai_WriteWelcomeNoteEMail (FILE *FileMail,struct Usr_Data *UsrDat)
|
||||
void Mai_WriteWelcomeNoteEMail (FILE *FileMail,const struct Usr_Data *UsrDat,
|
||||
Lan_Language_t ToUsrLanguage)
|
||||
{
|
||||
extern const char *Txt_Dear_NO_HTML[Usr_NUM_SEXS][1 + Lan_NUM_LANGUAGES];
|
||||
extern const char *Txt_user_NO_HTML[Usr_NUM_SEXS][1 + Lan_NUM_LANGUAGES];
|
||||
|
||||
fprintf (FileMail,"%s %s:\n",
|
||||
Txt_Dear_NO_HTML[UsrDat->Sex][UsrDat->Prefs.Language],
|
||||
Txt_Dear_NO_HTML[UsrDat->Sex][ToUsrLanguage],
|
||||
UsrDat->FrstName[0] ? UsrDat->FrstName :
|
||||
Txt_user_NO_HTML[UsrDat->Sex][UsrDat->Prefs.Language]);
|
||||
Txt_user_NO_HTML[UsrDat->Sex][ToUsrLanguage]);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -1731,7 +1747,9 @@ static void Mai_EditingMailDomainDestructor (void)
|
|||
// Return 0 on success
|
||||
// Return != 0 on error
|
||||
|
||||
int Mai_SendMailMsg (char FileNameMail[PATH_MAX + 1],const char *Subject)
|
||||
int Mai_SendMailMsg (const char FileNameMail[PATH_MAX + 1],
|
||||
const char *Subject,
|
||||
const char ToEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1])
|
||||
{
|
||||
char Command[2048 +
|
||||
Cfg_MAX_BYTES_SMTP_PASSWORD +
|
||||
|
@ -1747,7 +1765,7 @@ int Mai_SendMailMsg (char FileNameMail[PATH_MAX + 1],const char *Subject)
|
|||
Cfg_AUTOMATIC_EMAIL_SMTP_PORT,
|
||||
Cfg_AUTOMATIC_EMAIL_FROM,
|
||||
Cfg_GetSMTPPassword (),
|
||||
Gbl.Usrs.Me.UsrDat.Email,
|
||||
ToEmail,
|
||||
Cfg_PLATFORM_SHORT_NAME,Subject,
|
||||
FileNameMail);
|
||||
ReturnCode = system (Command);
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
/********************************* Headers ***********************************/
|
||||
/*****************************************************************************/
|
||||
|
||||
#include "swad_constant.h"
|
||||
#include "swad_user.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
@ -94,11 +95,14 @@ bool Mai_SendMailMsgToConfirmEmail (void);
|
|||
void Mai_ConfirmEmail (void);
|
||||
|
||||
void Mai_CreateFileNameMail (char FileNameMail[PATH_MAX + 1],FILE **FileMail);
|
||||
void Mai_WriteWelcomeNoteEMail (FILE *FileMail,struct Usr_Data *UsrDat);
|
||||
void Mai_WriteWelcomeNoteEMail (FILE *FileMail,const struct Usr_Data *UsrDat,
|
||||
Lan_Language_t ToUsrLanguage);
|
||||
void Mai_WriteFootNoteEMail (FILE *FileMail,Lan_Language_t Language);
|
||||
|
||||
bool Mai_ICanSeeOtherUsrEmail (const struct Usr_Data *UsrDat);
|
||||
|
||||
int Mai_SendMailMsg (char FileNameMail[PATH_MAX + 1],const char *Subject);
|
||||
int Mai_SendMailMsg (const char FileNameMail[PATH_MAX + 1],
|
||||
const char *Subject,
|
||||
const char ToEmail[Cns_MAX_BYTES_EMAIL_ADDRESS + 1]);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -90,7 +90,7 @@ unsigned Mai_DB_GetEmailFromUsrCod (MYSQL_RES **mysql_res,long UsrCod)
|
|||
{
|
||||
return (unsigned)
|
||||
DB_QuerySELECT (mysql_res,"can not get email address",
|
||||
"SELECT E_mail," // row[0]
|
||||
"SELECT E_mail," // row[0]
|
||||
"Confirmed" // row[1]
|
||||
" FROM usr_emails"
|
||||
" WHERE UsrCod=%ld"
|
||||
|
|
|
@ -296,7 +296,9 @@ static Act_Action_t Ntf_StartFormGoToAction (Ntf_NotifyEvent_t NotifyEvent,
|
|||
const struct For_Forums *Forums);
|
||||
static void Ntf_PutHiddenParamNotifyEvent (Ntf_NotifyEvent_t NotifyEvent);
|
||||
|
||||
static void Ntf_SendPendingNotifByEMailToOneUsr (struct Usr_Data *ToUsrDat,unsigned *NumNotif,unsigned *NumMails);
|
||||
static void Ntf_SendPendingNotifByEMailToOneUsr (const struct Usr_Data *ToUsrDat,
|
||||
unsigned *NumNotif,
|
||||
unsigned *NumMails);
|
||||
static void Ntf_GetNumNotifSent (long DegCod,long CrsCod,
|
||||
Ntf_NotifyEvent_t NotifyEvent,
|
||||
unsigned *NumEvents,unsigned *NumMails);
|
||||
|
@ -1204,7 +1206,7 @@ void Ntf_SendPendingNotifByEMailToAllUsrs (void)
|
|||
MYSQL_RES *mysql_res;
|
||||
unsigned NumUsrs;
|
||||
unsigned NumUsr;
|
||||
struct Usr_Data UsrDat;
|
||||
struct Usr_Data ToUsrDat;
|
||||
unsigned NumNotif;
|
||||
unsigned NumTotalNotif = 0;
|
||||
unsigned NumMails;
|
||||
|
@ -1214,7 +1216,7 @@ void Ntf_SendPendingNotifByEMailToAllUsrs (void)
|
|||
if ((NumUsrs = Ntf_DB_GetUsrsWhoMustBeNotified (&mysql_res)))
|
||||
{
|
||||
/***** Initialize structure with user's data *****/
|
||||
Usr_UsrDataConstructor (&UsrDat);
|
||||
Usr_UsrDataConstructor (&ToUsrDat);
|
||||
|
||||
/***** Notify the users one by one *****/
|
||||
for (NumUsr = 0;
|
||||
|
@ -1222,22 +1224,22 @@ void Ntf_SendPendingNotifByEMailToAllUsrs (void)
|
|||
NumUsr++)
|
||||
{
|
||||
/* Get next user */
|
||||
UsrDat.UsrCod = DB_GetNextCode (mysql_res);
|
||||
ToUsrDat.UsrCod = DB_GetNextCode (mysql_res);
|
||||
|
||||
/* Get user's data */
|
||||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&UsrDat, // Get user's data from database
|
||||
Usr_DONT_GET_PREFS,
|
||||
if (Usr_ChkUsrCodAndGetAllUsrDataFromUsrCod (&ToUsrDat, // Get user's data from database
|
||||
Usr_GET_PREFS, // User's language necessary to write email
|
||||
Usr_DONT_GET_ROLE_IN_CURRENT_CRS))
|
||||
{
|
||||
/* Send one email to this user */
|
||||
Ntf_SendPendingNotifByEMailToOneUsr (&UsrDat,&NumNotif,&NumMails);
|
||||
Ntf_SendPendingNotifByEMailToOneUsr (&ToUsrDat,&NumNotif,&NumMails);
|
||||
NumTotalNotif += NumNotif;
|
||||
NumTotalMails += NumMails;
|
||||
}
|
||||
}
|
||||
|
||||
/***** Free memory used for user's data *****/
|
||||
Usr_UsrDataDestructor (&UsrDat);
|
||||
Usr_UsrDataDestructor (&ToUsrDat);
|
||||
}
|
||||
|
||||
/***** Free structure that stores the query result *****/
|
||||
|
@ -1251,7 +1253,9 @@ void Ntf_SendPendingNotifByEMailToAllUsrs (void)
|
|||
/************ Send pending notifications of one user by email ****************/
|
||||
/*****************************************************************************/
|
||||
|
||||
static void Ntf_SendPendingNotifByEMailToOneUsr (struct Usr_Data *ToUsrDat,unsigned *NumNotif,unsigned *NumMails)
|
||||
static void Ntf_SendPendingNotifByEMailToOneUsr (const struct Usr_Data *ToUsrDat,
|
||||
unsigned *NumNotif,
|
||||
unsigned *NumMails)
|
||||
{
|
||||
extern const char *Txt_NOTIFY_EVENTS_There_is_a_new_event_NO_HTML[1 + Lan_NUM_LANGUAGES];
|
||||
extern const char *Txt_NOTIFY_EVENTS_There_are_X_new_events_NO_HTML[1 + Lan_NUM_LANGUAGES];
|
||||
|
@ -1290,13 +1294,13 @@ static void Ntf_SendPendingNotifByEMailToOneUsr (struct Usr_Data *ToUsrDat,unsig
|
|||
/***** If user has no language, set it to current language *****/
|
||||
ToUsrLanguage = ToUsrDat->Prefs.Language;
|
||||
if (ToUsrLanguage == Lan_LANGUAGE_UNKNOWN)
|
||||
ToUsrLanguage = Gbl.Prefs.Language;
|
||||
ToUsrLanguage = Cfg_DEFAULT_LANGUAGE;
|
||||
|
||||
/***** Create temporary file for mail content *****/
|
||||
Mai_CreateFileNameMail (FileNameMail,&FileMail);
|
||||
|
||||
/***** Welcome note *****/
|
||||
Mai_WriteWelcomeNoteEMail (FileMail,ToUsrDat);
|
||||
Mai_WriteWelcomeNoteEMail (FileMail,ToUsrDat,ToUsrLanguage);
|
||||
if (NumNtfs == 1)
|
||||
fprintf (FileMail,Txt_NOTIFY_EVENTS_There_is_a_new_event_NO_HTML[ToUsrLanguage],
|
||||
Cfg_PLATFORM_SHORT_NAME);
|
||||
|
@ -1315,6 +1319,13 @@ static void Ntf_SendPendingNotifByEMailToOneUsr (struct Usr_Data *ToUsrDat,unsig
|
|||
{
|
||||
/* Get next event */
|
||||
row = mysql_fetch_row (mysql_res);
|
||||
/* row[0]: NotifyEvent
|
||||
row[1]: FromUsrCod
|
||||
row[2]: InsCod
|
||||
row[3]: CtrCod
|
||||
row[4]: DegCod
|
||||
row[5]: CrsCod
|
||||
row[6]: Cod */
|
||||
|
||||
/* Get event type (row[0]) */
|
||||
NotifyEvent = Ntf_GetNotifyEventFromStr (row[0]);
|
||||
|
@ -1325,7 +1336,7 @@ static void Ntf_SendPendingNotifByEMailToOneUsr (struct Usr_Data *ToUsrDat,unsig
|
|||
Usr_DONT_GET_PREFS,
|
||||
Usr_DONT_GET_ROLE_IN_CURRENT_CRS);
|
||||
|
||||
/* Get institution code (row[2]),
|
||||
/* Get insti. code (row[2]),
|
||||
center code (row[3]),
|
||||
degree code (row[4]),
|
||||
course code (row[5]) */
|
||||
|
@ -1417,7 +1428,8 @@ static void Ntf_SendPendingNotifByEMailToOneUsr (struct Usr_Data *ToUsrDat,unsig
|
|||
|
||||
/***** Call the command to send an email *****/
|
||||
ReturnCode = Mai_SendMailMsg (FileNameMail,
|
||||
Txt_Notifications_NO_HTML[ToUsrLanguage]);
|
||||
Txt_Notifications_NO_HTML[ToUsrLanguage],
|
||||
ToUsrDat->Email);
|
||||
|
||||
/***** Remove temporary file *****/
|
||||
unlink (FileNameMail);
|
||||
|
@ -1429,7 +1441,8 @@ static void Ntf_SendPendingNotifByEMailToOneUsr (struct Usr_Data *ToUsrDat,unsig
|
|||
*NumMails = 1;
|
||||
|
||||
/* Update statistics about notifications */
|
||||
Ntf_UpdateNumNotifSent (Hie.Deg.DegCod,Hie.Crs.CrsCod,NotifyEvent,*NumNotif,*NumMails);
|
||||
Ntf_UpdateNumNotifSent (Hie.Deg.DegCod,Hie.Crs.CrsCod,NotifyEvent,
|
||||
*NumNotif,*NumMails);
|
||||
}
|
||||
|
||||
/***** Mark all pending notifications of this user as 'sent' *****/
|
||||
|
|
|
@ -405,6 +405,7 @@ int Pwd_SendNewPasswordByEmail (char NewRandomPlainPassword[Pwd_MAX_BYTES_PLAIN_
|
|||
extern const char *Txt_New_password_NO_HTML[1 + Lan_NUM_LANGUAGES];
|
||||
char FileNameMail[PATH_MAX + 1];
|
||||
FILE *FileMail;
|
||||
Lan_Language_t ToUsrLanguage;
|
||||
int ReturnCode;
|
||||
|
||||
/***** Create temporary file for mail content *****/
|
||||
|
@ -413,9 +414,14 @@ int Pwd_SendNewPasswordByEmail (char NewRandomPlainPassword[Pwd_MAX_BYTES_PLAIN_
|
|||
/***** Create a new random password *****/
|
||||
Pwd_CreateANewPassword (NewRandomPlainPassword);
|
||||
|
||||
/***** If I have no language, set language to current language *****/
|
||||
ToUsrLanguage = Gbl.Usrs.Me.UsrDat.Prefs.Language;
|
||||
if (ToUsrLanguage == Lan_LANGUAGE_UNKNOWN)
|
||||
ToUsrLanguage = Gbl.Prefs.Language;
|
||||
|
||||
/***** Write mail content into file and close file *****/
|
||||
/* Welcome note */
|
||||
Mai_WriteWelcomeNoteEMail (FileMail,&Gbl.Usrs.Me.UsrDat);
|
||||
Mai_WriteWelcomeNoteEMail (FileMail,&Gbl.Usrs.Me.UsrDat,ToUsrLanguage);
|
||||
|
||||
/* Message body */
|
||||
fprintf (FileMail,Txt_The_following_password_has_been_assigned_to_you_to_log_in_X_NO_HTML,
|
||||
|
@ -424,13 +430,14 @@ int Pwd_SendNewPasswordByEmail (char NewRandomPlainPassword[Pwd_MAX_BYTES_PLAIN_
|
|||
Gbl.Usrs.Me.UsrDat.Email);
|
||||
|
||||
/* Footer note */
|
||||
Mai_WriteFootNoteEMail (FileMail,Gbl.Prefs.Language);
|
||||
Mai_WriteFootNoteEMail (FileMail,ToUsrLanguage);
|
||||
|
||||
fclose (FileMail);
|
||||
|
||||
/***** Call the script to send an email *****/
|
||||
ReturnCode = Mai_SendMailMsg (FileNameMail,
|
||||
Txt_New_password_NO_HTML[Gbl.Usrs.Me.UsrDat.Prefs.Language]);
|
||||
Txt_New_password_NO_HTML[ToUsrLanguage],
|
||||
Gbl.Usrs.Me.UsrDat.Email);
|
||||
|
||||
/***** Remove temporary file *****/
|
||||
unlink (FileNameMail);
|
||||
|
|
Loading…
Reference in New Issue