While I was working on a "Social network" project, I had to give the user interface to 'Invite friends' - as in every social network application.
So, I add a page with 10 TextBoxes, add a RegularExpression validator to each one, let the user fill them, and send email to each email he filled.
The users complained that it is not comfortable couse most of them were copy their friend's emails from their gmail account,
and gmail uses a big TextBox with all the emails and names mixed.
So the solution to do the same functionality is quite simple.
Using RegularExpression we can get a MatchCollection of all strings that match our regular expression pattern.
I used the following regular expression, but you can use anything. (I'm open for suggestions) :
private const string strRegex = @"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b";
using System.Text.RegularExpressions;
public System.Collections.Specialized.StringCollection CollectFromString(string input)
{
System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection();
if (string.IsNullOrEmpty(input)) return sc;
MatchCollection mc = Regex.Matches(input, strRegex, RegexOptions.IgnoreCase);
for (int i = 0; i < mc.Count; i++)
{
if (!sc.Contains(mc[i].Value))
{
sc.Add(mc[i].Value);
}
}
return sc;
}
With this method you can just "drop" a big multi-line TextBox, and let the user enter his emails with any format he want
- emails sperates with ',' or ';' or with ever char that is not valid as en email,
and even mix the emails with names by copy & paste from his favorite email client.
The same functionality but collecting from file is quite the same:
public System.Collections.Specialized.StringCollection CollectFromFile(string fileName)
{
System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection();
if (string.IsNullOrEmpty(fileName)) return sc;
if (!System.IO.File.Exists(fileName))
throw new System.IO.FileNotFoundException();
using (System.IO.StreamReader sr = new System.IO.StreamReader(fileName))
{
string str = sr.ReadToEnd();
sr.Close();
return CollectFromString(str);
}
}
And the last method is to collect all emails from a given web site (one page):
public System.Collections.Specialized.StringCollection CollectFromSite(string url)
{
System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection();
if (string.IsNullOrEmpty(url)) return sc;
System.IO.Stream st = null;
if (!url.StartsWith("http://"))
url = "http://" + url;
try
{
// make a Web request
System.Net.WebRequest req = System.Net.WebRequest.Create(url);
// get the response and read from the result stream
System.Net.WebResponse resp = req.GetResponse();
st = resp.GetResponseStream();
using (System.IO.StreamReader sr = new System.IO.StreamReader(st))
{
return CollectFromString(sr.ReadToEnd());
}
}
finally
{
if (st != null)
st.Dispose();
}
}
In the source code bellow, I added some more functionalities and wrapped all in a collection to be "generic" and it can be use easly in other projects.
CustomCollections.rar (4.10 kb)