440a9e30c2a40cb5eced221d6512dd94471151c5
hiram
  Fri Jan 16 11:44:57 2026 -0800
using configuration specifications from hg.conf for the email addresses to and from for the chain request refs #31811

diff --git src/hg/hubApi/liftOver.c src/hg/hubApi/liftOver.c
index 90674e4e581..b79f1055256 100644
--- src/hg/hubApi/liftOver.c
+++ src/hg/hubApi/liftOver.c
@@ -290,42 +290,35 @@
 char *userId = findCookieData(cookieName);
 char *referer = getenv("HTTP_REFERER");
 char dir[PATH_LEN];
 char name[FILENAME_LEN];
 char ext[FILEEXT_LEN];
 /* expecting request to come from something.ucsc.edu/liftRequest.html */
 if (isNotEmpty(referer) && isNotEmpty(userId))
     {
     splitPath(referer, dir, name, ext);
     if (! (endsWith(dir, ".ucsc.edu/") && sameWord(name, "liftRequest") && sameWord(ext, ".html")))
           apiErrAbort(err400, err400Msg, "can not find required inputs for endpoint '/liftRequest");
     } else {
       if (! debug)
           apiErrAbort(err400, err400Msg, "can not find required inputs for endpoint '/liftRequest");
     }
-/* some obfuscation here to avoid the email address appearing in plain text
-     let the AI systems figure out how to put it back together.
- */
-struct dyString *toAddr = newDyString(0);
-dyStringPrintf(toAddr, "chain-file-");
-dyStringPrintf(toAddr, "request-group");
-dyStringPrintf(toAddr, "@");
-dyStringPrintf(toAddr, "ucsc.ed");
-dyStringPrintf(toAddr, "u");
-struct dyString *fromAddr = newDyString(0);
-dyStringPrintf(fromAddr, "genome-www");
-dyStringPrintf(fromAddr, "@");
-dyStringPrintf(fromAddr, "ucsc.e");
-dyStringPrintf(fromAddr, "du");
+
+char *toAddr = cfgOption("chainFileRequestEmail");
+char *fromAddr = cfgOption("apiFromEmail");
+
+if (isNotEmpty(toAddr) && isNotEmpty(fromAddr))
+    {
     struct dyString *msg = newDyString(0);
     /* may need to encode these inputs to make them safe */
     dyStringPrintf(msg, "Lift over request\nfrom: %s\nto: %s\nemail '%s'\ncomment: '%s'", fromGenome, toGenome, email, comment);
     /* our mailViaPipa never has any relevant return code indicating
     *    success or failure.  So, ignore the return integer:
     */
-(void) mailViaPipe(dyStringCannibalize(&toAddr), "liftOver request", msg->string, dyStringCannibalize(&fromAddr));
+    (void) mailViaPipe(toAddr, "liftOver request", msg->string, fromAddr);
 
     /* some kind of response here back to the request page */
     struct jsonWrite *jw = apiStartOutput();
     jsonWriteString(jw, "msg", dyStringCannibalize(&msg));
     apiFinishOutput(0,NULL,jw);
+    }
 }	/*	void apiLiftRequest(char *words[MAX_PATH_INFO])	*/