ImapLibrary : How to catch an email et read his content

Hello,

I would like to verify if an email is send and control his content.
I have seen that ImapLibrary can do the job but I must have a mail client to check the received mail ?
Can I do the same job with an another address (yopmail, for example) ?
On my local machine, I have a client but when I will run the test since the PIC (Continuous Integration Platform), I don’t see how can I do.
If I can have a solution which works on the both platform (windows and linux), I will be happy :slight_smile:

Thanks !

John.

Hi John,

Is this the imaplibrary you were referring to: GitHub - rickypc/robotframework-imaplibrary: IMAP email testing library for Robot Framework

I can’t see that you need an additional mail client, though I can’t see that it will prevent you from having one either, this library should act as an imap client, it would be the same as if you had 2 email clients installed on 2 machines both accessing the same account.

Did you install this using pip?

Also does your mail server support imap? I know with Gmail you need to enable it through a setting.

*** I’ve never used this library myself, so am just answering based on what I see in the documentation.

Hi John,

I just had a look at yopmail, for that you might be better off checking the email with SeleniumLibrary or Browser Library.

Dave.

Hi Dave,

I have installed the library and began to use it like this to open the mailbox :

Open Mailbox host=imap.gmail.com user=USER password=PASSWORD port=PORT

But I have an error => ConnectionRefusedError: [WinError 10061] Aucune connexion n’a pu être établie car l’ordinateur cible l’a expressément refusée.
I have activated IMAP access on Gmail. I see on the Google parameter that the IMAP connection should use the SSL : is this the solution ? How to fix it ?

Otherwise, you think that if I use “Browser library”, I can connect to the mailbox and check his content ?

Hi John,

For gmail, I’m pretty sure that you’ll need the is_secure option from Open Mailbox, as if I remember correctly gmail only allows secure imap.

Dave.

Hi,

I have made the modification but I have always an error :

Open Mailbox host=imap.gmail.com user=USER password=PASSWORD port=PORT is_secure=True

FAIL : TimeoutError: [WinError 10060] Une tentative de connexion a échoué car le parti connecté n’a pas répondu convenablement au-delà d’une certaine durée ou une connexion établie a échoué car l’hôte de connexion n’a pas répondu

Hi John,

That error according to google translate says
“A connection attempt failed because the connected party did not respond properly after a certain amount of time or an established connection failed because the connecting host did not respond”

which makes me wonder if you used the correct port number or if need to configure a proxy server?

I can’t see any mention of proxy in the documentation, so i’m not sure how to do that, you might have to contact the maintainer of the library if that’s the problem.

did you manage to connect an email client by imap to this server successfully? sometimes doing that will highlight where any issues are and when you have it working you’ll have the settings you need for this library.

Hope this helps,

Dave.

Dave.

Thanks you for your answer, Dave.
I try to contact the maintainers but I didn’t found their email address on the pipy page => robotframework-imaplibrary · PyPI
I don’t try to connect an email client by imap because my client belongs to my organisation and I can’t modify its parameters.
Perhaps I’m going to create a yopmail account to connect with my browser and make check with SeleniumLibrary… but it will not be very optimal, no?

Hi John,

If you can install software on your work computer, but don’t want to mess up your work email client, try installing something like thunderbird or similar to check if you can access the imap account.

If you can’t install any software, look around and you might find an email client in Java or Python that you might be able to use for testing.

If all that fails yopmail and SeleniumLibrary or Browser Library might be your best bet. you could also try accessing yopmail with requests library, yopmail looked like it had very simple html so if you can read what you need out of it’s emails with requests library this would be a nice low overhead solution.

Dave.

Hi John,

I had a play just for fun :smiley:

I adjusted the example from the smtplib to send an email to yopmail (see yopmail.py below).

Then tried to access it via requests library, that was quite difficult as there is a lot of javascript generated id’s that need to be sent so, while I could login i was getting 400 errors on loading the inbox

Then I tried to read the email with SeleniumLibrary, as expected that was easy (example below

yopmail.robot

*** Settings ***
Library		SeleniumLibrary

*** variables ***

${yopmail_user}		example13
${yopmail_url}		https://yopmail.com/


*** Test Cases ***
yopmail example
	Open Browser	${yopmail_url}	ff

	# //input[@name='login']
	Input Text		//input[@name='login']		${yopmail_user}
	# //div[@id="refreshbut"]/button
	Click Element	//div[@id="refreshbut"]/button
	# ifinbox
	Select Frame	ifinbox
	Click Element	//div[text()='Example for John']/..

	# ifmail
	Unselect Frame
	Select Frame	ifmail
	${mailbody}=	Get Text		//div[@id='mail']/pre
	Should Contain    ${mailbody}    Example13

yopmail.py

# example13@yopmail.com

import smtplib

def prompt(prompt):
    return input(prompt).strip()

# fromaddr = prompt("From: ")
fromaddr = "example13@example.com"
# toaddrs  = prompt("To: ").split()
toaddrs  = "example13@yopmail.com"
# print("Enter message, end with ^D (Unix) or ^Z (Windows):")
subject = "Example for John"
# Add the From: and To: headers at the start!
msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"
       % (fromaddr, ", ".join(toaddrs), subject))

line = "this is a test message for Example13"

# while True:
#     try:
#         line = input()
#     except EOFError:
#         break
#     if not line:
#         break
# msg = msg + line
# msg = msg + "\r\n.\r\n" + line + "\r\n.\r\n"
msg = msg + line + "\r\n\r\n.\r\n"




# msg = "this is a test message for Example13"

print("Message length is", len(msg))

# server = smtplib.SMTP('localhost')
server = smtplib.SMTP('yopmail.com')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

That should give you enough to get something working,

Dave.

Thanks a lot, Dave.
I’m going to have a look for all solutions you suggested and hope to succeed :slight_smile:

John

1 Like

Hi @damies13
I created one cloud account
it sent email verification code to Gmail account
I need to copy that verification code which they sent to mail
Any idea on how to open a mail and copy the verification code
Written code like this to open mail using SeleniumLibrary library
SeleniumLibrary

Execute JavaScript window.open(‘’, ‘_blank’)
Switch Window NEW
Go To https://accounts.google.com/v3/signin/identifier?continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F&emr=1&followup=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F&osid=1&passive=1209600&service=mail&ifkv=ARZ0qKL9bCuTb0pOQWiHizs5SOpZWVjT4gz45nCJ9OvybVc7v3Q4NrSxEGXqVHW1CfjXxFGtca1BFQ&theme=mn&ddm=0&flowName=GlifWebSignIn&flowEntry=ServiceLogin
Sleep 5s
Input Text xpath= //[@id=“identifierId”] xxxx@gmail.com
SeleniumLibrary.Click Element //
[@id=“identifierNext”]/div/button/span
Sleep 10s
#Wait Until Element Is Visible xpath= //[@id=“password”]/div[1]/div/div[1]/input
Input Text xpath= //
[@id=“password”]/div[1]/div/div[1]/input yyyyy
SeleniumLibrary.Click Element xpath= //[@id=“passwordNext”]/div/button/span
Sleep 10s
Wait Until Element Is Visible xpath=//
[@id=“gb”]/div[2]/div[1]/div[4]/div/a/img
Page Should Contain Email Verification
Sleep 5s
installed using pip
Library ImapLibrary
#Library MailClientLibrary
While importing i am getting this error Unresolved library: ImapLibrary.

Hi Surekha,

This is a really old thread, probably would have been better to start a new one.

Once you have the email body you can use Get Regexp Matches to extract the verification code.

Scripting GMail with SeleniumLibrary is likely to cause you a lot of pain with the reCAPTCHA prompts, so you would probably be better to use imap to access your gmail account, though I’ve never done this with RF

login manually to GMail and go to settings, then enable IMAP as below:


image

A final tip, if you use xpaths like this: /div[1]/div/div[1]/input you are asking for trouble as sites often change and you’ll be constantly updating your broken xpaths. There is a really good XPath Tutorial here for learning how to write good xpaths.

Dave.

1 Like

Worth pointing out that for imap library to work, one has to generate “app password” in the gmail settings. That password will be used for auth instead of user’s own password.

2 Likes

Hi,

Been looking into this to use the IMAP library, and indeed Open Mailbox generates an error, that mentions in RF the link for app password:

On my side I use a simple new Gmail address, have IMAP activated as well as 2SV, but I still cannot get the App password part as described in the link…
And the configuration mentioned after topic 8. (reasons it’s not available) does not fit with my setup.

As anyone maybe experienced and solved this?

Edit for those searching : App Passwords are not available in the 2SV window, but you can search for it in top field and access it.

Thanks and regards.
Charlie

Robotframework-imaplibrary hasn’t been updated in like 9 years - there’s fork called Robotframework-imaplibrary2 that has more recent changes - maybe try that ?

@CharlieScene Last time i did use gmail for testing purposes, im quite sure i used some of the Robocorp’s python code and - not directly but just copied off relevant file from their repo, modified it a bit (added @keyword decorator’s and removed some unnecessary dependencies)… But now, it looks like Robocorp’s email/imapsmtp has evolved quite a lot so copying of a single file out from their distribution might not be that straight forward.

EDIT: @CharlieScene not 100% but availability of app password depends on the google’s account type. For example, i have google workspace and its definitely not available there… Have you tried making a throwaway account ?

Hi Rasjani,

About app password, as edited in my post above I finally found it as explained and yes it’s a throwaway email only used for tests with non sensitive use or credentials.

Concerning ImapLibrary I have been digging towards a direct python script yes. Fact that the library has not been updated nor maintained for a while will be a QMS issue at a point.

For my current use and needs (fetch body, link, delete email), imaplib and a custom .py with a good error management and try/catch might be sufficient and will only indeed require a decorated keyword call.

Thanks for you feedback!
Charlie

1 Like