【问题标题】:How to fetch OTP From Mail and print on a text field?如何从邮件中获取 OTP 并在文本字段上打印?
【发布时间】:2020-04-28 08:53:05
【问题描述】:

我正在尝试在网站上自动注册,但该网站将 OTP 发送到电子邮件。所以我需要从邮件中获取 OTP 并将其打印到文本字段。

我正在使用此代码,但它没有显示未读邮件数和 OTP 验证邮件。

谁能帮助我如何从电子邮件中提取 OTP 并将其提交到网站上?

                     package MAVEN.GmailIMAP;

                import java.io.BufferedReader;
                import java.io.InputStreamReader;
                import java.util.Properties;

                import javax.mail.Flags;
                import javax.mail.Folder;
                import javax.mail.Message;
                import javax.mail.Session;
                import javax.mail.Store;

                public class Gmail3 {

                    public static void ReceiveMail(String FolderName,String SubjectContent, String emailContent, int lengthOfOTP){


                        String hostName = "imap.gmail.com";//change it according to your mail

                        String username = "test12345@gmail.com";//username 

                        String password = "test12345"; //password

                        int messageCount;

                        int unreadMsgCount;

                        String emailSubject;

                        Message emailMessage;

                        String searchText=null ;

                        Properties sysProps = System.getProperties();

                        sysProps.setProperty("mail.store.protocol", "imaps");

                        try {

                            Session session = Session.getInstance(sysProps, null);

                            Store store = session.getStore();

                            store.connect(hostName, username, password);

                            Folder emailBox = store.getFolder(FolderName);

                            emailBox.open(Folder.READ_ONLY);

                            messageCount = emailBox.getMessageCount();

                            System.out.println("Total Message Count: " + messageCount);

                            unreadMsgCount = emailBox.getNewMessageCount();

                            System.out.println("Unread Emails count:" + unreadMsgCount);

                            for(int i=messageCount; i>(messageCount-unreadMsgCount); i--)

                            {

                                emailMessage = emailBox.getMessage(i);

                                emailSubject = emailMessage.getSubject();

                                if(emailSubject.contains(SubjectContent))

                                {

                                    System.out.println("OTP mail found");

                                    String line;

                                    StringBuffer buffer = new StringBuffer();

                                    BufferedReader reader = new BufferedReader(new InputStreamReader(emailMessage.getInputStream()));

                                    while ((line = reader.readLine()) != null) {

                                        buffer.append(line);

                                    }

                                    String messageContent=emailContent;

                                    String result = buffer.toString().substring(buffer.toString().indexOf(messageContent));

                                    searchText = result.substring(messageContent.length(), messageContent.length()+lengthOfOTP);

                                    System.out.println("Text found : "+ searchText);

                                    emailMessage.setFlag(Flags.Flag.SEEN, true);

                                    break;

                                }

                                emailMessage.setFlag(Flags.Flag.SEEN, true);

                            }

                            emailBox.close(true);

                            store.close();


                        } catch (Exception mex) {

                            mex.printStackTrace();

                            System.out.println("OTP Not found ");

                        }

                        return searchText ;

                    }




                    public static void main(String[] args) {
                        ReceiveMail("FolderName","SubjectContent","One Time Password (OTP):",6);

                    }
                }

【问题讨论】:

    标签: java eclipse selenium selenium-webdriver gmail-imap


    【解决方案1】:

    下面的电子邮件正文扫描器应该适用于您正在寻找的输入

    import java.util.Scanner;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class OtpRegex {
    
        public static void main(String[] args) {
    //        String regex = "((is|otp|password|key|code|CODE|KEY|OTP|PASSWORD|Do).[0-9]{4,8}.(is|otp|password|key|code|CODE|KEY|OTP|PASSWORD)?)|(^[0-9]{4,8}.(is|otp|password|key|code|CODE|KEY|OTP|PASSWORD))";
            String text = "To auth... \n\n869256\n\n Do is your login OTP. Treat this as confidential. Sharing it with anyone gives them full access to your Paytm Wallet. Paytm never calls to verify your OTP.";
    
    
            Scanner sc = new Scanner(text);
    
            int otp = -1;
            String line = null;
            while (sc.hasNextLine()) {
                line = sc.nextLine().trim();
                try{
                    otp = Integer.parseInt(line);
                    break;
                } catch (NumberFormatException nfx) {
                    //Ignore the exception
                }
            }
            System.out.println(otp);
        }
    }
    
    
    

    【讨论】:

    • 您是否在 placeholderPattern.matcher(emailBody) 中传递了您的电子邮件正文?如果是,那么您需要解析什么文本?
    • 我试过这个方法,但还是不行。它没有从邮件中获取 otp,而是显示存储在字符串文本中的 otp。 [imgur.com/HfZHOBS]
    • 你能通过 is|otp|password|key|code|CODE|KEY|OTP|PASSWORD 这些关键字和 otp 中的任何一个吗? 694554是,694554代码,694554键
    • 是的,我已经通过了电子邮件正文,但它仍然无法正常工作。我需要从邮件中获取 OTP 并在网站上提交。
    • 您的 OTP 是否会单独成为一个单独的行,而该行将只有 OTP 而没有其他内容?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多