Browse Source

兼容mailLu新邮件系统

zoujiajian 1 year ago
parent
commit
f07d815583

+ 10 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -480,4 +480,14 @@ public interface Constant {
 	 * 声破天平台id
 	 */
 	Long SPOTIFY_GOODS_ID = 4l;
+
+	//mail lu域名邮箱
+	List<String> MAIL_LU_DOMAIN = List.of("@56bbq.com", "yxzh8.com", "@eggks.cc");
+
+	//PS 验证码官方
+	String PS_ADOBE = "Adobe";
+
+	String DISNEY = "Disney";
+
+	String NETFLIX = "Netflix";
 }

+ 7 - 0
netflix-service/pom.xml

@@ -46,6 +46,13 @@
             <artifactId>guava-retrying</artifactId>
             <version>2.0.0</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.sun.mail</groupId>
+            <artifactId>javax.mail</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 13 - 0
netflix-service/src/main/java/com/cyksj/service/mail/MailLuService.java

@@ -0,0 +1,13 @@
+package com.cyksj.service.mail;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: MailLuService
+ * 创建者: JavaZou
+ * 创建时间:2024/12/23 11:14
+ */
+public interface MailLuService {
+	boolean isMailLuEmail(String account);
+
+	String getVerifyCode(String account, Long goodsId, Integer type, Integer linkType, boolean isReturnDeviceUrl) throws Exception;
+}

+ 4 - 10
netflix-service/src/main/java/com/cyksj/service/mail/impl/CuiQiuMailServiceImpl.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpUtil;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.common.util.TicketCodeCommonUtil;
@@ -44,13 +45,6 @@ public class CuiQiuMailServiceImpl implements CuiQiuMailService {
 	//脆球域名id
 	private final static String DOMAIN_ID = "1696913058045050661";
 
-	//PS 验证码官方
-	private final static String PS_ADOBE = "Adobe";
-
-	private final static String DISNEY = "Disney";
-
-	private final static String NETFLIX = "Netflix";
-
 	private static List<CuiQiuEmailConfig> CuiQiuEmailConfigs;
 
 	private final CuiQiuEmailConfigMapper CuiQiuEmailConfigMapper;
@@ -100,14 +94,14 @@ public class CuiQiuMailServiceImpl implements CuiQiuMailService {
 			CuiQiuEmailDto.CuiQiuUser cuiQiuUser = emailInfo.getTo().get(0);
 			if (StrUtil.equalsIgnoreCase(cuiQiuUser.getAddress(), email)) {
 				//PS
-				if (from.getName().contains(PS_ADOBE)) {
+				if (from.getName().contains(Constant.PS_ADOBE)) {
 					return true;
 				}
 				//Disney
-				if (from.getName().contains(DISNEY)) {
+				if (from.getName().contains(Constant.DISNEY)) {
 					return true;
 				}
-				if (from.getName().contains(NETFLIX)) {
+				if (from.getName().contains(Constant.NETFLIX)) {
 					return true;
 				}
 			}

+ 143 - 0
netflix-service/src/main/java/com/cyksj/service/mail/impl/MailLuServiceImpl.java

@@ -0,0 +1,143 @@
+package com.cyksj.service.mail.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.StringUtil;
+import com.cyksj.common.util.TicketCodeCommonUtil;
+import com.cyksj.service.mail.MailLuService;
+import com.cyksj.service.relation.GroupsRelationNetflixService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.mail.*;
+import javax.mail.search.AndTerm;
+import javax.mail.search.ComparisonTerm;
+import javax.mail.search.ReceivedDateTerm;
+import javax.mail.search.SearchTerm;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.Properties;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: MailLuServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/12/23 11:14
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class MailLuServiceImpl implements MailLuService {
+	//mail lu邮箱统一密码
+	private final static String UNIFIED_PWD = "Wp112233";
+
+	private final GroupsRelationNetflixService groupsRelationNetflix;
+
+	@Override
+	public boolean isMailLuEmail(String account) {
+		for (String domain : Constant.MAIL_LU_DOMAIN) {
+			if (account.contains(domain)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	@Override
+	public String getVerifyCode(String account, Long goodsId, Integer type, Integer linkType, boolean isReturnDeviceUrl) throws Exception{
+		Properties props = new Properties();
+		props.put("mail.imap.host", "mail.yxzh8.com"); // 替换为你的IMAP服务器
+		props.put("mail.imap.port", "993"); // IMAP服务的端口号,通常是993
+		props.put("mail.imap.ssl.enable", "true"); // 启用SSL
+
+		Session session = Session.getInstance(props, new javax.mail.Authenticator() {
+			protected PasswordAuthentication getPasswordAuthentication() {
+				return new PasswordAuthentication(account, UNIFIED_PWD);
+			}
+		});
+
+		Store store = session.getStore("imap");
+		store.connect();
+		// 访问收件箱
+		Folder inbox = store.getFolder("INBOX");
+		inbox.open(Folder.READ_ONLY);
+		// 设置时间范围
+		DateTime now = DateTime.now();
+		//10分钟
+		DateTime differ = DateUtil.offsetMinute(now, -10);
+		// 构建搜索条件
+		SearchTerm searchTerm = new AndTerm(
+				new ReceivedDateTerm(ComparisonTerm.GE, differ),
+				new ReceivedDateTerm(ComparisonTerm.LE, now)
+		);
+
+		// 执行搜索
+		Message[] messages = inbox.search(searchTerm);
+		// 根据接收日期对邮件进行排序
+		Arrays.sort(messages, new Comparator<Message>() {
+			public int compare(Message m1, Message m2) {
+				try {
+					return m2.getReceivedDate().compareTo(m1.getReceivedDate());
+				} catch (MessagingException e) {
+					log.error("将邮件按时间排序错误:{}", StringUtil.getErrorText(e));
+					throw BusinessRuntimeException.getInstance("获取异常,请联系客服");
+				}
+			}
+		});
+		String code = null;
+		for (int i = 0; i < messages.length; i++) {
+			Message message = messages[i];
+			//主题
+			String subject = message.getSubject();
+			//content
+			String body = message.getContent().toString();
+			if (goodsId == 1 && subject.contains(Constant.NETFLIX)) {
+				if (type != null && type == 1) {
+					String pre = "NetflixSans-Regular, Helvetica, Roboto, Segoe UI, sans-serif; font-weight";
+					if (body.contains("輸入此代碼登入") || body.contains("输入此代码登录") || body.contains("Enter this code to sign in")) {
+						code = StrUtil.subAfter(body, pre, false);
+						if (StrUtil.isEmpty(code)) {
+							code = StrUtil.subAfter(body, "Enter this code to sign in", true);
+						}
+					}
+					if (StrUtil.isEmpty(code)) {
+						throw BusinessRuntimeException.getInstance("查询失败,请检查是否发送了登陆码..");
+					}
+				} else {
+					String urlPref;
+					String nfVerifyUrl;
+					if (linkType == 1) {
+						urlPref = "https://www.netflix.com/account/update-primary-location";
+						nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
+					} else {
+						urlPref = "https://www.netflix.com/account/travel/verify";
+						nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
+					}
+					if (StrUtil.isEmpty(nfVerifyUrl)) {
+						throw BusinessRuntimeException.getInstance("请在奈飞端点击“传送电子邮件”");
+					}
+					//非点击装置同步更新按钮 直接返回链接
+					if (linkType == 2) return nfVerifyUrl;
+					//直接返回同步装置url
+					if (isReturnDeviceUrl) {
+						return nfVerifyUrl;
+					}
+					//失败返回验证链接
+					if (!groupsRelationNetflix.confirmUpdate(nfVerifyUrl)) {
+						return nfVerifyUrl;
+					}
+					return StrUtil.EMPTY;
+				}
+			}
+			//PS、Disney
+			return TicketCodeCommonUtil.getTicketCodeStr(body, goodsId);
+		}
+		inbox.close(false);
+		store.close();
+		return code;
+	}
+}

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java

@@ -27,6 +27,7 @@ import com.cyksj.model.views.CmsUserVO;
 import com.cyksj.model.views.ExpiredAccountDataView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.mail.CuiQiuMailService;
+import com.cyksj.service.mail.MailLuService;
 import com.cyksj.service.mail.YhMailService;
 import com.cyksj.service.mange.AccountCommonService;
 import com.cyksj.service.mange.CmsAccountService;
@@ -83,6 +84,8 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 
 	private final YhMailService yhMailService;
 
+	private final MailLuService mailLuService;
+
 	@Override
 	public IPage<ExpiredAccountDataView> getExpiredAccountView(Boolean isCorpWx, String customerService, Long goodsId, Long skuId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer userId, String startTime, String endTime, String now, Long offset, Long limit) {
 		return accountMapper.getExpiredAccountView(isCorpWx, customerService, goodsId, skuId, account, renewStatus, handleStatus, cnAccount, usAccount, userId, startTime, endTime, now, new Page<>(offset, limit));
@@ -475,6 +478,10 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 		if (cuiQiuMailService.isCuiQiuEmail(account)) {
 			return cuiQiuMailService.getVerifyCode(account, at.getGoodsId(), null, 1, false);
 		}
+		//是否是 mail lu邮箱
+		if (mailLuService.isMailLuEmail(account)) {
+			return mailLuService.getVerifyCode(account, at.getGoodsId(), null, 1, false);
+		}
 		String code = null;
 		try {
 			code = yhMailService.getVerifyCode(account, at.getGoodsId(), null, 1, false);
@@ -504,6 +511,10 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 		if (cuiQiuMailService.isCuiQiuEmail(account)) {
 			return cuiQiuMailService.getVerifyCode(account, at.getGoodsId(), null, null, false);
 		}
+		//是否是 mail lu邮箱
+		if (mailLuService.isMailLuEmail(account)) {
+			return mailLuService.getVerifyCode(account, at.getGoodsId(), null, null, false);
+		}
 		String code = yhMailService.getVerifyCode(account, at.getGoodsId(), null, null, false);
 		return code;
 	}

+ 15 - 0
netflix-service/src/main/java/com/cyksj/service/relation/impl/GroupRelationFrontServiceImpl.java

@@ -37,6 +37,7 @@ import com.cyksj.service.claude.ClaudeService;
 import com.cyksj.service.groups.GroupsFuncService;
 import com.cyksj.service.luma.LumaService;
 import com.cyksj.service.mail.CuiQiuMailService;
+import com.cyksj.service.mail.MailLuService;
 import com.cyksj.service.mail.MailService;
 import com.cyksj.service.mail.YhMailService;
 import com.cyksj.service.mange.coupon.CouponCommonService;
@@ -124,6 +125,8 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 
 	private final CuiQiuMailService cuiQiuMailService;
 
+	private final MailLuService mailLuService;
+
 	private final UserCertRecordMapper userCertRecordMapper;
 
 	private final MidjourneyAccountService midjourneyAccountService;
@@ -611,6 +614,10 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		if (cuiQiuMailService.isCuiQiuEmail(account)) {
 			return cuiQiuMailService.getVerifyCode(account, renewalView.getGoodsId(), type, loginReq.getLinkType(), false);
 		}
+		//是否是 mail lu邮箱
+		if (mailLuService.isMailLuEmail(account)) {
+			return mailLuService.getVerifyCode(account, renewalView.getGoodsId(), type, loginReq.getLinkType(), false);
+		}
 		//银河域名邮件
 		String code = yhMailService.getVerifyCode(account, renewalView.getGoodsId(), type, loginReq.getLinkType(), false);
 		GroupsRelationLoginCodeRecord record = new GroupsRelationLoginCodeRecord();
@@ -1003,6 +1010,10 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		if (cuiQiuMailService.isCuiQiuEmail(renewalView.getAccount())) {
 			return cuiQiuMailService.getVerifyCode(account, renewalView.getGoodsId(), null, 1, true);
 		}
+		//是否是 mail lu邮箱
+		if (mailLuService.isMailLuEmail(account)) {
+			return mailLuService.getVerifyCode(account, renewalView.getGoodsId(), null, 1, true);
+		}
 		//银河域名邮件
 		return yhMailService.getVerifyCode(account, renewalView.getGoodsId(), null, 1, true);
 	}
@@ -1028,6 +1039,10 @@ public class GroupRelationFrontServiceImpl implements GroupRelationFrontService
 		if (cuiQiuMailService.isCuiQiuEmail(account)) {
 			return cuiQiuMailService.getVerifyCode(account, at.getGoodsId(), null, null, false);
 		}
+		//是否是 mail lu邮箱
+		if (mailLuService.isMailLuEmail(account)) {
+			return mailLuService.getVerifyCode(account, at.getGoodsId(), null, null, false);
+		}
 		String code = yhMailService.getVerifyCode(account, at.getGoodsId(), null, null, false);
 		return code;
 	}