|
@@ -102,12 +102,16 @@ public class MktMailMessageServiceImpl extends MyBaseServiceImpl<MktMailMessageM
|
|
|
private final List<MktMailOpenCallback> openCallbacks;
|
|
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:}}")
|
|
@Value("${storlead.mail.track-base-url:${domainname:}}")
|
|
|
private String trackBaseUrl;
|
|
private String trackBaseUrl;
|
|
|
|
|
|
|
|
|
|
+ @Value("${server.servlet.context-path:}")
|
|
|
|
|
+ private String servletContextPath;
|
|
|
|
|
+
|
|
|
public MktMailMessageServiceImpl(ObjectProvider<MktMailOpenCallback> openCallbackProvider) {
|
|
public MktMailMessageServiceImpl(ObjectProvider<MktMailOpenCallback> openCallbackProvider) {
|
|
|
this.openCallbacks = openCallbackProvider.orderedStream().collect(Collectors.toList());
|
|
this.openCallbacks = openCallbackProvider.orderedStream().collect(Collectors.toList());
|
|
|
}
|
|
}
|
|
@@ -584,8 +588,7 @@ public class MktMailMessageServiceImpl extends MyBaseServiceImpl<MktMailMessageM
|
|
|
if (body.contains("/mkt/track/")) {
|
|
if (body.contains("/mkt/track/")) {
|
|
|
return body;
|
|
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
|
|
String pixel = "<img src=\"" + pixelUrl
|
|
|
+ "\" width=\"1\" height=\"1\" style=\"display:none!important;width:1px;height:1px;border:0;\" alt=\"\"/>";
|
|
+ "\" 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);
|
|
log.info("mkt inject track pixel, mailId={}, url={}", entity.getId(), pixelUrl);
|
|
@@ -601,7 +604,7 @@ public class MktMailMessageServiceImpl extends MyBaseServiceImpl<MktMailMessageM
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
if (!StringUtils.hasText(trackBaseUrl)) {
|
|
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())) {
|
|
if (!StringUtils.hasText(entity.getTrackToken())) {
|
|
|
throw new WebException("打开追踪 token 生成失败");
|
|
throw new WebException("打开追踪 token 生成失败");
|
|
@@ -612,6 +615,41 @@ public class MktMailMessageServiceImpl extends MyBaseServiceImpl<MktMailMessageM
|
|
|
return entity != null && entity.getIsTrack() != null && entity.getIsTrack() == 1;
|
|
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) {
|
|
private void bindTempAttachments(Long mailId, List<Long> fileIds, Long operatorId) {
|
|
|
if (CollectionUtils.isEmpty(fileIds) || mailId == null) {
|
|
if (CollectionUtils.isEmpty(fileIds) || mailId == null) {
|
|
|
return;
|
|
return;
|