Reputation: 9277
i build the following code that opens a tcp connection and is able to send messages to a remote gmail server via tcp.
TextWriter writerlog = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "service.txt");
writerlog.WriteLine("Initializing service");
TcpClient tcpclient = new TcpClient(); // create an instance of TcpClient
try
{
writerlog.WriteLine("Starting Tcp Client");
writerlog.WriteLine("Connecting Tcp Client");
tcpclient.Connect("pop.gmail.com", 995); // HOST NAME POP SERVER and gmail uses port number 995 for POP
writerlog.WriteLine("Getting stream from client");
System.Net.Security.SslStream sslstream = new SslStream(tcpclient.GetStream()); // This is Secure Stream // opened the connection between client and POP Server
sslstream.AuthenticateAsClient("pop.gmail.com"); // authenticate as client
writerlog.WriteLine("Creating stream writer and stream reader");
StreamWriter sw = new StreamWriter(sslstream); // Asssigned the writer to stream
StreamReader reader = new StreamReader(sslstream); // Assigned reader to stream
writerlog.WriteLine("Init Authentication");
writerlog.WriteLine("Sending user");
SendCommand("USER [email protected]", sw, reader); // refer POP rfc command, there very few around 6-9 command
writerlog.WriteLine("Sending password");
SendCommand("PASS yyyyyyyyy", sw, reader); // Sending password
writerlog.WriteLine("Retrieving last email");
writerlog.WriteLine("Email contents:" + SendCommand("RETR 1", sw, reader)); // this will retrive your first email
writerlog.WriteLine("Closing connection");
SendCommand("Quit", sw, reader);// close the connection
}
catch (Exception ex)
{
writerlog.WriteLine("Exception: " + ex.Message);
writerlog.WriteLine("StackTrace: " + ex.StackTrace);
writerlog.WriteLine("InnerExceptiion: " + ex.StackTrace);
}
finally
{
writerlog.WriteLine("Ending service");
tcpclient.Close();
writerlog.Close();
}
Method to send a tcp message:
protected string SendCommand(string cmdtext, StreamWriter writer, StreamReader reader)
{
writer.WriteLine(cmdtext);
writer.Flush();
return reader.ReadLine();
}
i have the following list of Pop3 commands and i used RETR in order to get the content of an email using this line:
writerlog.WriteLine("Email contents:" + SendCommand("RETR 1", sw, reader));
But in my log file im getting the following:
Email contents:+OK send PASS
USER - Takes one argument i.e., the email address of the user trying to connect to his/her mailbox. Example usage:
USER [email protected]
PASS - Takes one argument i.e., the password of the user. Example usage:
PASS yourpassword
STAT - Returns the number of emails in the mailbox and the number of bytes all the emails are taking on the server. Example usage:
STAT
TOP - Takes two arguments i.e., the sort number of the email on the server and the number of lines of text to retrieve from the body of the email. Example usage:
TOP 1 10
RETR - Takes one argument i.e., the sort number of the email on the server and returns all the headers and lines from the body of the email. Example usage:
RETR 1
DELE - Takes one argument i.e., the sort number of the email on the server and deletes it. Example usage:
DELE 1
RSET - Resets any DELE commands given above. The emails marked to be deleted by DELE command are unmarked. Example usage:
RSET
QUIT - Closes the user session with the server. Example usage:
QUIT
Could you tell me what im missing to get the email contents?
Thanks in advance.
Kind Regards.
Jose.
Upvotes: 3
Views: 8243
Reputation: 1186
You can use Imap for reading gmail :
ImapClient ic = new ImapClient("imap.gmail.com", "[email protected]", "xxxxxx",
ImapClient.AuthMethods.Login, 993, true);
ic.SelectMailbox("INBOX");
int n = ic.GetMessageCount();
textBox1.Text = n.ToString();
MailMessage mail = ic.GetMessage(n-1);
ic.Dispose();
string sub = mail.Subject;
string msgbody = mail.Raw;
or following pop3 method :
string result = "";
string str = string.Empty;
string strTemp = string.Empty;
try
{
TcpClient tcpclient = new TcpClient();
tcpclient.Connect("pop3.gmail.com", 995);
System.Net.Security.SslStream sslstream = new SslStream(tcpclient.GetStream());
sslstream.AuthenticateAsClient("pop3.gmail.com");
System.IO.StreamWriter sw = new StreamWriter(sslstream);
System.IO.StreamReader reader = new StreamReader(sslstream);
strTemp = reader.ReadLine();
sw.WriteLine("USER" + " " + username);
sw.Flush();
strTemp = reader.ReadLine();
sw.WriteLine("PASS" + " " + password);
sw.Flush();
strTemp = reader.ReadLine();
string[] numbers = Regex.Split(strTemp, @"\D+");
int a = 0;
foreach (string value in numbers)
{
if (!string.IsNullOrEmpty(value))
{
int i = int.Parse(value);
numbers[a] = i.ToString();
a++;
}
}
sw.WriteLine("RETR "+numbers[0]);
sw.Flush();
strTemp = reader.ReadLine();
textBox4.Text = strTemp;
while ((strTemp = reader.ReadLine()) != null)
{
if (strTemp == ".")
{
break;
}
if (strTemp.IndexOf("-ERR") != -1)
{
break;
}
str += strTemp;
}
sw.WriteLine("Quit ");
sw.Flush();
this.sourceHTML = str;
}
catch () {}
Upvotes: 2
Reputation: 121
This post (How to read the body of the message in the mail retrieve from gmail by using pop3 in c #?) explain a better way to do what you wanna do. I was using the TCP way.. but with Pop client is much easier!
Best regards,
Yan.
Upvotes: 1