@@ -287,6 +287,44 @@ function extractErrorMessage(error: unknown): string {
287287 return "Unknown error" ;
288288}
289289
290+ function getUserFriendlyError ( error : unknown ) : string {
291+ const message = extractErrorMessage ( error ) ;
292+
293+ // Detect OAuth/credential errors (535, 534, BadCredentials, etc.)
294+ if (
295+ message . includes ( "535" ) ||
296+ message . includes ( "534" ) ||
297+ message . includes ( "BadCredentials" ) ||
298+ message . includes ( "invalid credentials" ) ||
299+ message . includes ( "authentication" ) ||
300+ message . includes ( "Username and Password not accepted" )
301+ ) {
302+ return "Identifiants OAuth invalides ou token expiré. Veuillez reconnecter ce compte." ;
303+ }
304+
305+ // Detect connection/timeout errors
306+ if (
307+ message . includes ( "ETIMEDOUT" ) ||
308+ message . includes ( "timeout" ) ||
309+ message . includes ( "ECONNREFUSED" ) ||
310+ message . includes ( "ENOTFOUND" )
311+ ) {
312+ return "Impossible de se connecter au serveur SMTP. Veuillez réessayer plus tard." ;
313+ }
314+
315+ // Detect rate limiting
316+ if (
317+ message . includes ( "rate limit" ) ||
318+ message . includes ( "throttl" ) ||
319+ message . includes ( "429" )
320+ ) {
321+ return "Trop de requêtes. Veuillez réessayer plus tard." ;
322+ }
323+
324+ // Default: return the original message but truncated
325+ return message . length > 100 ? message . substring ( 0 , 100 ) + "..." : message ;
326+ }
327+
290328function toTextFromHtml ( html : string ) : string {
291329 return html
292330 . replace ( / < b r \s * \/ ? > / gi, "\n" )
@@ -646,7 +684,7 @@ async function resolveSenderOptions(authorization: string, userEmail: string) {
646684 options . push ( {
647685 email : source . email ,
648686 available : false ,
649- reason : extractErrorMessage ( error ) ,
687+ reason : getUserFriendlyError ( error ) ,
650688 } ) ;
651689 }
652690 }
0 commit comments