|
|
@@ -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;
|
|
|
+ }
|
|
|
+}
|