application.yml配置邮件参数
mail:
host: imap.163.com
port: 143
username: 1234@163.com
password: 不是邮件密码,是那个授权码
protocol: imap
webhook:
url: (webhook网址)
EmailReceiverService.java 接收邮件的类
package com.run.server;
import com.run.config.CommonConfig;
import com.run.config.WebhookConfig;
import jakarta.mail.Folder;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.InternetAddress;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Properties;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.eclipse.angus.mail.imap.IMAPFolder;
import org.eclipse.angus.mail.imap.IMAPStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class EmailReceiverService {
private static final Logger log = LoggerFactory.getLogger(EmailReceiverService.class);
@Autowired
private JavaMailSenderImpl mailSender;
@Autowired
private WebhookConfig webhookConfig;
@Autowired
private CommonConfig commonConfig;
public EmailReceiverService(JavaMailSenderImpl mailSender) {
this.mailSender = mailSender;
Properties properties = new Properties();
properties.setProperty("mail.store.protocol", mailSender.getProtocol());
properties.setProperty("mail.imap.host", mailSender.getHost());
properties.setProperty("mail.imap.port", String.valueOf(mailSender.getPort()));
properties.setProperty("mail.imap.starttls.enable", "true");
properties.setProperty("mail.imap.auth", "true");
mailSender.setJavaMailProperties(properties);
this.startTime = System.currentTimeMillis();
}
public Runnable receiveEmail() throws Exception {
IMAPStore store = (IMAPStore) mailSender.getSession().getStore("imap");
store.connect(mailSender.getUsername(), mailSender.getPassword());
//这部分是解决异常的地方,设置IAMP ID信息 这个value的值随便写就行
HashMap IAM = new HashMap();
IAM.put("name","myname");
IAM.put("version","1.0.0");
IAM.put("vendor","myclient");
IAM.put("support-email","testmail@test.com");
store.id(IAM);
IMAPFolder inbox = (IMAPFolder) store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
int count = inbox.getMessageCount();
for(Message message : inbox.getMessages()) {
// 邮件处理
String msg = message.getSubject();
sendWebHook(msg);
}
size = count;
inbox.close(false);
store.close();
return null;
}
private void sendWebHook(String msg){
String url = webhookConfig.getUrl();
String body = "{\"msgtype\":\"text\", \"text\": {\"content\": \"" +msg+"\"}";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<>(body, headers);
ResponseEntity<String> res = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
this.startTime = System.currentTimeMillis();
}
}
EmailRunner.java 定时执行接收邮件的类
package com.run.task;
import com.run.server.EmailReceiverService;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
@Configuration
@EnableScheduling
public class EmailRunner {
private final EmailReceiverService emailService;
public EmailRunner(EmailReceiverService emailService) {
this.emailService = emailService;
}
@Scheduled(cron = "30 * * * * *") // 每30s执行一次
private void runMail(){
System.out.println("Email running...");
try {
emailService.receiveEmail();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}