SubethaSmtp example

2.8k Views Asked by At

Can you please tell me how to use SubethaSmtp library?

<dependency>
<groupId>org.subethamail</groupId>
<artifactId>subethasmtp</artifactId>
<version>3.1.7</version>
<scope>test</scope>
</dependency>

I just want to listen to the emails on a port number from my Gmail/outlook inbox and display them in console window/log them in text file/DB.

I studied most of the API doc but I'm not being able to put the pieces together to get the things working.

Can you please tell me about a working example in spring-boot?

Here is my code below so far

package emailbox;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.subethamail.smtp.helper.SimpleMessageListenerAdapter;
import org.subethamail.smtp.server.SMTPServer;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@SuppressWarnings("restriction")
@PropertySource("/emailbox.properties")
@Service
public class SMTPServerService {

    @Value("${smtpserver.enabled}")
    String enabled="";

    @Value("${smtpserver.hostName}")
    String hostName="";

    @Value("${smtpserver.port}")
    String port="";

    SMTPServer smtpServer;

    public SMTPServerService() {
    }

@PostConstruct 
public void start() { 
    if(enabled.equalsIgnoreCase("true"))
{ 
        SimpleMessageListenerImpl l = new SimpleMessageListenerImpl(); 
        smtpServer = new SMTPServer(new SimpleMessageListenerAdapter(l)); 
        smtpServer.setHostName(this.hostName); 
        smtpServer.setPort(Integer.valueOf(port)); 
        smtpServer.start(); 
        System.out.println("****** SMTP Server is running for domain "+smtpServer.getHostName()+" on port "+smtpServer.getPort()); 
        } else { 
        System.out.println("****** SMTP Server NOT ENABLED by settings "); 
        } 
}

@PreDestroy 
public void stop() { 
if(enabled.equalsIgnoreCase("true")){ 
System.out.println("****** Stopping SMTP Server for domain "+smtpServer.getHostName()+" on port "+smtpServer.getPort()); 
smtpServer.stop(); 
} 
}

    public boolean isRunning() {
        return smtpServer.isRunning();
    }
}

package emailbox;

import java.io.InputStream;
import java.util.Properties;

import javax.mail.Session;
import javax.mail.internet.MimeMessage;

 import org.subethamail.smtp.helper.SimpleMessageListener;

 public class SimpleMessageListenerImpl implements SimpleMessageListener {
public SimpleMessageListenerImpl() {
}

@Override
public boolean accept(String from, String recipient) {
    return true;
}

@Override 
public void deliver(String from, String recipient, InputStream data) { 
Session session = Session.getDefaultInstance(new Properties()); 
MimeMessage m = new MimeMessage(session,data); 
ReceivedEmail email=new ReceivedEmail(m); 
// ... here we go with email message ... 
 }
 }
2

There are 2 best solutions below

6
vivekananda On

Subetha SMTP is used for building an SMTP Server. You should be using POP or IMAP for this purpose to read emails from your inbox. Please see the example below: You just need java mail api.

public void receiveMail(){
            Properties props = System.getProperties();
            props.setProperty("mail.store.protocol", "imap");
            props.put("mail.imap.host", host);
            props.put("mail.imap.port", port);
            props.put("mail.imap.auth.login.disable", "true");
            props.put("mail.imap.auth.plain.disable", "false");
            //props.put("mail.imap.ssl.enable", "true");
            props.put("mail.debug", "true");
            props.put("mail.debug.auth", "true");


            Session session = Session.getInstance(props, new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(user, pwd);
                }
            });

            store = (IMAPStore) session.getStore("imap");



            store.connect(host, user, pwd);
            folder = (IMAPFolder) store.getFolder("INBOX"); 

           openFolder(folder);
  }
   public static void openFolder(IMAPFolder folder) throws MessagingException, IOException{
          String subject = null;
          if (!folder.isOpen())
              folder.open(Folder.READ_WRITE);
          Message[] messages = folder.getMessages();
          System.out.println("No of Messages : " + folder.getMessageCount());
          System.out.println("No of Unread Messages : " + folder.getUnreadMessageCount());
          System.out.println(messages.length);
          if (messages.length > 0) {
              for (int i = 0; i < 1; i++) {

                  System.out.println("*****************************************************************************");
                  System.out.println("MESSAGE " + (i + 1) + ":");
                  Message msg = messages[i];
                  System.out.println("Message Number: " + msg.getMessageNumber());
                  // Object String;
                  System.out.println("UID: " + folder.getUID(msg));

                  subject = msg.getSubject();

                  System.out.println("Subject: " + subject);
                  System.out.println("From: " + msg.getFrom()[0]);
                  System.out.println("To: " + msg.getAllRecipients()[0]);
                  System.out.println("Date: " + msg.getReceivedDate());
                  System.out.println("Size: " + msg.getSize());
                  System.out.println(msg.getFlags());
                  System.out.println("Body: \n" + msg.getContent());
                  System.out.println(msg.getContentType());

              }
          }
    }
0
redoff On

A full example of receiving emails with SubEtha SMTP (and maybe if you're using Spring Boot also) is available here