Kaynağa Gözat

邮箱问题

chenkq 3 hafta önce
ebeveyn
işleme
d75aab175a

+ 1 - 1
storlead-mail-api/src/main/resources/application-test.yml

@@ -152,7 +152,7 @@ domainname: https://test1.storlead.com
 
 storlead:
   mail:
-    track-base-url: https://test1.storlead.com/router/email
+    track-base-url: https://email.test.storlead.com
 
 file:
   mode: 1

+ 3 - 3
storlead-mail-api/src/main/resources/application.yml

@@ -43,9 +43,9 @@ storlead:
       - sys_app
       - mail_integration_task
   mail:
-    # 营销打开追踪像素公网根地址(含 context-path,末尾不要 /)
-    # 最终像素:{track-base-url}/mail/mkt/track/{token}
-    # 例 test:https://test1.storlead.com/router/mail
+    # 营销打开追踪像素公网根地址(不含 context-path,末尾不要 /)
+    # 最终像素:{track-base-url}{server.servlet.context-path}/mkt/track/{token}
+    # 例 test:https://email.test.storlead.com + /router/email + /mkt/track/{token}
     track-base-url: ${domainname:}
     integration:
       enabled: true

+ 43 - 5
storlead-mail/storlead-mail-mkt/src/main/java/com/storlead/sales/mail/mkt/service/impl/MktMailMessageServiceImpl.java

@@ -102,12 +102,16 @@ public class MktMailMessageServiceImpl extends MyBaseServiceImpl<MktMailMessageM
     private final List<MktMailOpenCallback> openCallbacks;
 
     /**
-     * 打开追踪像素根地址,需可被收件方公网访问,且含 context-path。
-     * 例:https://host/router/mail (像素最终为 {base}/mail/mkt/track/{token})
+     * 打开追踪像素公网根地址(不含 context-path)。
+     * 最终像素:{track-base-url}{context-path}/mkt/track/{token}
+     * 例:https://email.test.storlead.com + /router/email + /mkt/track/{token}
      */
     @Value("${storlead.mail.track-base-url:${domainname:}}")
     private String trackBaseUrl;
 
+    @Value("${server.servlet.context-path:}")
+    private String servletContextPath;
+
     public MktMailMessageServiceImpl(ObjectProvider<MktMailOpenCallback> openCallbackProvider) {
         this.openCallbacks = openCallbackProvider.orderedStream().collect(Collectors.toList());
     }
@@ -584,8 +588,7 @@ public class MktMailMessageServiceImpl extends MyBaseServiceImpl<MktMailMessageM
         if (body.contains("/mkt/track/")) {
             return body;
         }
-        String base = trackBaseUrl.endsWith("/") ? trackBaseUrl.substring(0, trackBaseUrl.length() - 1) : trackBaseUrl;
-        String pixelUrl = base + "/mkt/track/" + entity.getTrackToken();
+        String pixelUrl = joinTrackUrl(trackBaseUrl, servletContextPath, "/mkt/track/" + entity.getTrackToken());
         String pixel = "<img src=\"" + pixelUrl
                 + "\" width=\"1\" height=\"1\" style=\"display:none!important;width:1px;height:1px;border:0;\" alt=\"\"/>";
         log.info("mkt inject track pixel, mailId={}, url={}", entity.getId(), pixelUrl);
@@ -601,7 +604,7 @@ public class MktMailMessageServiceImpl extends MyBaseServiceImpl<MktMailMessageM
             return;
         }
         if (!StringUtils.hasText(trackBaseUrl)) {
-            throw new WebException("已开启打开追踪,请配置 storlead.mail.track-base-url(公网可访问,含 context-path)");
+            throw new WebException("已开启打开追踪,请配置 storlead.mail.track-base-url(公网可访问,不含 context-path)");
         }
         if (!StringUtils.hasText(entity.getTrackToken())) {
             throw new WebException("打开追踪 token 生成失败");
@@ -612,6 +615,41 @@ public class MktMailMessageServiceImpl extends MyBaseServiceImpl<MktMailMessageM
         return entity != null && entity.getIsTrack() != null && entity.getIsTrack() == 1;
     }
 
+    /**
+     * 拼接追踪像素地址:track-base-url + context-path + /mkt/track/{token}
+     */
+    private static String joinTrackUrl(String trackBaseUrl, String contextPath, String trackPath) {
+        StringBuilder sb = new StringBuilder(trimTrailingSlash(trackBaseUrl));
+        String ctx = normalizeLeadingSlash(contextPath);
+        if (StringUtils.hasText(ctx) && !"/".equals(ctx)) {
+            sb.append(ctx);
+        }
+        sb.append(normalizeLeadingSlash(trackPath));
+        return sb.toString();
+    }
+
+    private static String trimTrailingSlash(String value) {
+        if (!StringUtils.hasText(value)) {
+            return "";
+        }
+        String v = value.trim();
+        while (v.endsWith("/")) {
+            v = v.substring(0, v.length() - 1);
+        }
+        return v;
+    }
+
+    private static String normalizeLeadingSlash(String value) {
+        if (!StringUtils.hasText(value)) {
+            return "";
+        }
+        String v = trimTrailingSlash(value);
+        if (!StringUtils.hasText(v)) {
+            return "";
+        }
+        return v.startsWith("/") ? v : "/" + v;
+    }
+
     private void bindTempAttachments(Long mailId, List<Long> fileIds, Long operatorId) {
         if (CollectionUtils.isEmpty(fileIds) || mailId == null) {
             return;