Jump to content

Validate if user entering the right email address format


Recommended Posts

Hi, i've created a simple program, asking user to enter his/her email address, e.g dannyd_y@hotmail.com

Or user can enter multiple email addresses, dannyd_y@hotmail.com;dannyd_yq@yahoo.com.

Func mainlobby()
Global $msg, $receiver
local $sendemilbutton,$recipientsread,$recipientsenter

GUICreate($toolname,$width, $height, 500, 250, -1, $WS_EX_ACCEPTFILES) ; will create a dialog box that when displayed is centered
GUISetBkColor(0x6666FF)
$recipientsenter = GUICtrlCreateInput("", 10, 5, 250, 20)
$sendemilbutton = GUICtrlCreateButton("Send Email", 230, 128, 70, 25,-1,0x00000001)

GUISetState(@SW_SHOW)

do
$msg = GUIGetMsg()
Select
Case $msg = $sendemilbutton
if GUICtrlRead($recipientsenter) ="" Then
msgbox(16,"Email Not Input","Cannot Find Any Email")
Else
msgbox(0,"Email Input",GUICtrlRead($recipientsenter))
$receiver = GUICtrlRead($recipientsenter)
CreateMailItem()
EndIf
EndSelect
Until $msg = $GUI_EVENT_CLOSE
GUIDelete()
_Exit()

EndFunc

How do i validate if user is entering the right format. i've made some studies on this it seems like the right way of coding is using StringRegExp, but i coudlnt understand the regular expression pattern at all. Appreciate someone can help me. Many Thanks.

Link to comment
Share on other sites

dannydy,

You might do something like this (not tested)

Func mainlobby()
    Global $msg, $receiver
    Local $sendemilbutton, $recipientsread, $recipientsenter, $aEmail

    GUICreate($toolname, $width, $height, 500, 250, -1, $WS_EX_ACCEPTFILES) ; will create a dialog box that when displayed is centered
    GUISetBkColor(0x6666FF)
    $recipientsenter = GUICtrlCreateInput("", 10, 5, 250, 20)
    $sendemilbutton = GUICtrlCreateButton("Send Email", 230, 128, 70, 25, -1, 0x00000001)

    GUISetState(@SW_SHOW)

    Do
        $msg = GUIGetMsg()
        Select
            Case $msg = $sendemilbutton
                If GUICtrlRead($recipientsenter) = "" Then
                    MsgBox(16, "Email Not Input", "Cannot Find Any Email")
                Else
                    MsgBox(0, "Email Input", GUICtrlRead($recipientsenter))
                    $receiver = GUICtrlRead($recipientsenter)

                    ; start added code

                    $aEmail = stringsplit($receiver,';')

                    for $1 = 1 to $aEmail[0]
                        if stringregexp($aEmail[$1],'^[\_]*([a-z0-9]+(\.|\_*)?)+@([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6}$',0) = 1 then
                            CreateMailItem()
                        Else
                            guictrlsetdata($recipientsenter,$aEmail[$1] & ' in error - not sent')
                        EndIf
                    next

                    ; end added code

                EndIf
        EndSelect
    Until $msg = $GUI_EVENT_CLOSE
    GUIDelete()
    _Exit()

EndFunc   ;==>mainlobby

The regexp was found using GOOGLE search. You don't really need to understand it to use it (although better if you do, obviously).

kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Link to comment
Share on other sites

kylomas example reworked slightly to run without modification.

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
mainlobby()
Func mainlobby()
    Global $msg, $receiver
    Local $sendemilbutton, $recipientsread, $recipientsenter, $aEmail
    $toolname= "abc"
    $width= 320
    $height= 200
    GUICreate($toolname, $width, $height, 500, 250, default, $WS_EX_ACCEPTFILES) ; will create a dialog box that when displayed is centered
    GUISetBkColor(0x6666FF)
    $recipientsenter = GUICtrlCreateInput("", 10, 5, 250, 20)
    $sendemilbutton = GUICtrlCreateButton("Send Email", 230, 128, 70, 25, -1, 0x00000001)

    GUISetState(@SW_SHOW)

    Do
        $msg = GUIGetMsg()
        Select
            Case $msg = $sendemilbutton
                If GUICtrlRead($recipientsenter) = "" Then
                    MsgBox(16, "Email Not Input", "Cannot Find Any Email")
                Else
                    MsgBox(0, "Email Input", GUICtrlRead($recipientsenter))
                    $receiver = GUICtrlRead($recipientsenter)

                    ; start added code

                    $aEmail = stringsplit($receiver,';')

                    for $1 = 1 to $aEmail[0]
                        if stringregexp($aEmail[$1],'^[\_]*([a-z0-9]+(\.|\_*)?)+@([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6}$',0) = 1 then
                            ;CreateMailItem()
                        Else
                            guictrlsetdata($recipientsenter,$aEmail[$1] & ' in error - not sent')
                        EndIf
                    next

                    ; end added code

                EndIf
        EndSelect
    Until $msg = $GUI_EVENT_CLOSE
    GUIDelete()
    ;_Exit()
EndFunc   ;==>mainlobby
Link to comment
Share on other sites

Many Thanks both of you(kylomas and Xandy). Its working fine, however if i entered one email address, the program threw me an error on that. its only worked on multiple email addresses. i'm working on it right now, make some modification will handle it. Really appreciate that save me a lot of time:)

Link to comment
Share on other sites

i found the issue, my company address has this hyphen "-". So if i enter any email address with hypen(i.e danny-dy@hotmail.com), it will throw me an error. How to i modify the coding to handle hyphen. i did several trial and error, but i couldn't get it right.

This is the expression for handling underscore

stringregexp($aEmail[$1],'^[\_]*([a-z0-9]+(\.|\_*)?)+@([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6}$',0)

This is the expression for handling hyphen

stringregexp($aEmail[$1],'^[\-]*([a-z0-9]+(\.|\-*)?)+@([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6}$',0)

How do i make them into one statement, please?

Link to comment
Share on other sites

Sorry I don't know stringregexp() formatting well enough (at all really) to try to write one without getting very frustrated.

I would do something like use stringinstr() to find a '@', make sure it was not the first character. Is there always a '.' after the '@'? I don't know.

Doing it this way would not be that many lines, but it would not be one line. You could smash it into a function though.

I could write it pretty easy, would you like me to do it?

Link to comment
Share on other sites

Xandy, with luck i managed to do it.

Here's the code

stringregexp($aEmail[$1],'^[\_|[color=#ff0000][b]\-[/b][/color]]*([a-z0-9]+(\.|\_|[color=#ff0000][b]\-[/b][/color]*)?)+@([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6}$',0)

Basically i added - in the statement(Highlighted in red).

Many Thanks for taken a loop into it.

Link to comment
Share on other sites

you can check the syntax of an Email.

The Regex would match most of it, excluding the special chars, U+007F above chars IP address domain name and comments.

That's the general syntax many email providers allow only a few chars other than alphanum.

Use a Case-Insensitivity switch(?i), for matching upper-case chars.

Edit: I tried to simplify the regex

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
mainlobby()

Func mainlobby()
Global $msg, $receiver
Local $sendemilbutton, $recipientsread, $recipientsenter, $aEmail
$width = 320
$height = 200
GUICreate('', 320, 200, 500, 250)
$recipientsenter = GUICtrlCreateInput("", 10, 5, 250, 20)
$sendemilbutton = GUICtrlCreateButton("Send Email", 230, 128, 70, 25, 1)
GUISetState()

Do
$msg = GUIGetMsg()
Select
Case $msg = $sendemilbutton
If GUICtrlRead($recipientsenter) = "" Then
MsgBox(16, "Email Not Input", "Cannot Find Any Email")
Else
; start added code
$aEmail = StringSplit(GUICtrlRead($recipientsenter), ';')
$localpart = "[[:alnum:]!#$%&'*+-/=?^_`{|}~.]+"
$domainname = "[[:alnum:].-]+\.[[:alnum:]]+"

For $1 = 1 To $aEmail[0]
If StringRegExp($aEmail[$1], '(?i)^(' & $localpart & ')@(' & $domainname & ')$', 0) Then
ConsoleWrite("Email_" & $1 & " is valid" & @CRLF)
Else
MsgBox(0, "Error", "Email " & $1 & " is not valid")
EndIf
Next

; end added code

EndIf
EndSelect
Until $msg = $GUI_EVENT_CLOSE
GUIDelete()
EndFunc   ;==>mainlobby
The limitations are still the same

Regards :)

Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to comment
Share on other sites

I'm sure there is something on RegExLib.

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Very helpful ;)

RegExLib is a website. Take this as a starter.

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

What makes an email address "valid" is very complex in practice. Already at the email client level, what is considered valid is variable based on actual client, setup and network context. Then relays have to adhere to the same validity set of rules which is hardly the case. Finally the recipient host also has to consider valid the local part the same way as you did.

This is one of the most complex routine task in IT and I don't believe it can be done unconditionnally from a blind end. Even if the practice is doubtful (due to overload of the servers) I regard asking SMTP the most reliable approach (or the less prone to failure). Of course that means you have access to a (the!) SMTP server on the machine the validation is running on.

I don't know of any online service working correctly.

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to comment
Share on other sites

If the user runs Outlook you could use my OutlookEX UDF to validate the mail address.

Edited by water

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

Yeah or a hidden telnet (more ubiquitous) going thru until answer to RCPT TO: command.

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Link to comment
Share on other sites

:D

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...