Showing posts with label Computer. Show all posts
Showing posts with label Computer. Show all posts

Friday, February 13, 2009

C# Code to Read Email Attachment

I wrote code in C# to read email from POP3 server. In this case I emphasize on how to save attachment for excel and txt file. I found it is not easy to create the code. Last time I have done this with success test, but when I tried again, it failed to work. And below is my revision, any advice is welcome.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net.Sockets;
using System.Net.Security;
using System.Text.RegularExpressions;

{
string response;
int totmessages;
string msg;
TcpClient mailclient;
SslStream NetStrm;
StreamReader sr;
StreamWriter sw;
NetworkStream ns;
string attachment;
string filename;

string[] data;
int startindex;
int index;
int lastindex;
string x;
MemoryStream ms;
FileStream fs;

//connect to POP3 server
try
{
mailclient = new TcpClient(tbPop.Text, Convert.ToInt16(tbPort.Text));
}
catch (SocketException)
{
tbMessage.Text = "Unable to connect to server 1";
return;
}

if (cbSsl.Checked)
{
NetStrm = new SslStream(mailclient.GetStream());
NetStrm.AuthenticateAsClient(tbPop.Text);
sr = new StreamReader(NetStrm);
sw = new StreamWriter(NetStrm);
}
else
{
ns = mailclient.GetStream();
sr = new StreamReader(ns);
sw = new StreamWriter(ns);
}
response = sr.ReadLine(); //Get opening POP3 banner

sw.WriteLine("user " + tbUid.Text); //Send username
sw.Flush();

response = sr.ReadLine();

if (response.Substring(0, 4) == "-ERR")
{
tbMessage.Text = "Unable to log into server 2";
return;
}

sw.WriteLine("pass " + tbPwd.Text); //Send password
sw.Flush();

response = sr.ReadLine();

if (response.Substring(0, 3) == "-ER")
{
tbMessage.Text = "Unable to log into server 3";
return;
}

sw.WriteLine("stat"); //Send stat command to get number of messages
sw.Flush();

response = sr.ReadLine();

//find number of message
string[] nummess = response.Split(' ');
totmessages = Convert.ToInt16(nummess[1]);

//read emails
for (int i = 1; i <= totmessages; i++)
{
msg = null;

sw.WriteLine("top " + i + " 0"); //read header of each message
sw.Flush();
response = sr.ReadLine();

while (true)
{
response = sr.ReadLine();
if (response == ".")
break;
msg = msg + response + "\r\n";
}

//read attachment
attachment = null;
if (Regex.Match(msg, "multipart/mixed").Success)
{
msg = null;
sw.WriteLine("retr " + i.ToString()); //Retrieve entire message
sw.Flush();
response = sr.ReadLine();

while (true)
{
response = sr.ReadLine();
if (response == ".")
break;
msg = msg + response + "\r\n";
}

if (Regex.Match(msg, tbFile.Text).Success)
{

// below will not work for gmail
//sw.WriteLine("dele " + i.ToString()); //mark for deletion
//sw.Flush();

data = msg.Split('\r');

//tbMessage.Text = msg;

startindex = 0;
index = 0;
lastindex = 0;
x = null;
ms = null;
fs = null;

while (true)
{
attachment = null;
while ((!Regex.Match(data[index].Trim(), "filename").Success)&&(index {
index++;
}
if (index == data.Length-1) break;
filename = data[index].Trim().Substring(42).Replace("\"", "");

//find start of attachment data
index++;
while ((data[index].Length!=1)&&(index {
index++;
}
if (index == data.Length-1) break;
startindex = index + 1;

//find end of data
index = startindex+1;
while ((!Regex.Match(data[index].Trim(), "--0").Success) && (data[index].Length != 1) && (index < data.Length - 1))
{
index++;
}
if (index == data.Length-1) break;
lastindex = index - 1;

for (int j = startindex; j <= lastindex; j++)
{
attachment = attachment + data[j];
}
attachment = attachment + "\r\n";

//saving attachment if xls or txt
if (Regex.Match(filename.ToLower(), "xls").Success)
{
ms = new MemoryStream(Convert.FromBase64String(attachment));
fs = File.OpenWrite("D:\\" + filename);
fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
fs.Close();
}
else if (Regex.Match(filename.ToLower(), "txt").Success)
{
ms = new MemoryStream(Encoding.UTF8.GetBytes(attachment));
fs = File.OpenWrite("D:\\" + filename);
fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
fs.Close();
}

}
}
}
}

sw.WriteLine("quit"); //quit
sw.Flush();

}

Wednesday, October 1, 2008

My First WinSock Application

Finally, I wrote my first WinSock application with Visual C++. It's just the simple one. This application is used to detect IP address and hostname of local host. Here is the code :

WORD Version;
WSADATA wsaData;
char name[255];
CString ip;
CWaitCursor wait;
PHOSTENT hostinfo;
Version = MAKEWORD(2,2);
in_addr m_in;

if (WSAStartup(Version,&wsaData)==0)
{
if (gethostname(name, sizeof(name))==0)
{
if ((hostinfo=gethostbyname(name))!=NULL)
{
memcpy (&m_in, hostinfo->h_addr_list, 4);
ip=inet_ntoa(m_in);
m_cIPAddress.SetWindowTextW(ip);
m_cName.SetWindowTextW((CString)name);
m_cIPAddress.EnableWindow(TRUE);
m_cName.EnableWindow(TRUE);
}
}
WSACleanup();
}

And the output looks like this: