Elimizde bir application.properties dosyası olsun
email.host=imap.example.comemail.port=993email.protocol=imapsemail.username=your-email@example.comemail.password=your-email-password
Bir Session nesnesi yaratırız
import javax.mail.*;
import java.util.properties;
@Configuration
public class EmailConfiguration {
@Value("${email.host}")
private String emailHost;
@Value("${email.port}")
private String emailPort;
@Value("${email.username}")
private String emailUsername;
@Value("${email.password}")
private String emailPassword;
@Bean
public Session mailSession() {
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imaps");
props.setProperty("mail.imaps.host", emailHost);
props.setProperty("mail.imaps.port", emailPort);
// Create a new session with the properties
Session session = Session.getInstance(props);
session.setDebug(true); // Enable debug mode for troubleshooting
return session;
}
}Sonra kendi listener nesnemizi yaratırız
@Configuration
public class EmailConfiguration {
@Bean
public EmailListener emailListener() {
return new EmailListener(mailSession(), emailUsername, emailPassword);
}
}import javax.mail.*;
import javax.mail.event.MessageCountAdapter;
import javax.mail.event.MessageCountEvent;
import com.sun.mail.imap.IMAPFolder;
public class EmailListener extends MessageCountAdapter {
private Session session;
private String username;
private String password;
public EmailListener(Session session, String username, String password) {
this.session = session;
this.username = username;
this.password = password;
}
...
}startListening() metodu şöyledir
import com.sun.mail.imap.IMAPFolder;
public class EmailListener extends MessageCountAdapter {
...
public void startListening() throws MessagingException, InterruptedException,
IOException {
Store store = session.getStore("imaps");
store.connect(username, password);
IMAPFolder inbox = (IMAPFolder)store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
// Create a new thread to keep the connection alive
Thread keepAliveThread = new Thread(new KeepAliveRunnable(inbox),
"IdleConnectionKeepAlive");
keepAliveThread.start();
inbox.addMessageCountListener(new MessageCountAdapter() {
@Override
public void messagesAdded(MessageCountEvent event) {
// Process the newly added messages
Message[] messages = event.getMessages();
for (Message message : messages) {
try {
// Implement your email processing logic here
System.out.println("New email received: " + message.getSubject());
} catch (MessagingException e) {
...
}
}
}
});
// Start the IDLE Loop
while (!Thread.interrupted()) {
try {
System.out.println("Starting IDLE");
inbox.idle();
} catch (MessagingException e) {
...
throw new RuntimeException(e);
}
}
// Interrupt and shutdown the keep-alive thread
if (keepAliveThread.isAlive()) {
keepAliveThread.interrupt();
}
}
}KeepAliveRunnable şöyledir
import com.sun.mail.imap.IMAPFolder;
import javax.mail.MessagingException;
public class KeepAliveRunnable implements Runnable {
private static final long KEEP_ALIVE_FREQ = 300000; // 5 minutes
private IMAPFolder folder;
public KeepAliveRunnable(IMAPFolder folder) {
this.folder = folder;
}
@Override
public void run() {
while (!Thread.interrupted()) {
try {
Thread.sleep(KEEP_ALIVE_FREQ);
// Perform a NOOP to keep the connection alive
System.out.println("Performing a NOOP to keep the connection alive");
folder.doCommand(protocol -> {
protocol.simpleCommand("NOOP", null);
return null;
});
} catch (InterruptedException e) {
// Ignore, just aborting the thread...
} catch (MessagingException e) {
// Shouldn't really happen...
System.out.println("Unexpected exception");
e.printStackTrace();
}
}
}
}We need an email server that supports the IMAP IDLE feature. IMAP IDLE allows our application to receive immediate notifications when new messages arrive in the inbox rather than relying on periodic polling.Some servers have specific setting or timeouts that may terminate the IDLE connection after a certain period of inactivity. e.g. Gmail ~ 10 mins. So KeepAlive mechanism is necessary to receive email indefinitely.
Hiç yorum yok:
Yorum Gönder