我构建以下代码,打开tcp连接,并能够通过tcp将消息发送到远程gmail服务器。
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 xxxxxxxx@gmail.com", 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();
}
发送tcp消息的方法:
protected string SendCommand(string cmdtext, StreamWriter writer, StreamReader reader)
{
writer.WriteLine(cmdtext);
writer.Flush();
return reader.ReadLine();
}
我有以下Pop3命令列表,我使用RETR以使用此行获取电子邮件的内容:
writerlog.WriteLine(“电子邮件内容:”+ SendCommand(“RETR 1”,sw,reader));
但是在我的日志文件中我得到以下内容:
电子邮件内容:+确定发送通行证
USER - Takes one argument i.e., the email address of the user trying to connect to his/her mailbox. Example usage:
USER youremail@xyz.com
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
你能告诉我收到电子邮件内容的遗漏吗?
提前致谢。
亲切的问候。
何。
答案 0 :(得分:2)
您可以使用Imap阅读gmail:
ImapClient ic = new ImapClient("imap.gmail.com", "xxxxx@gmail.com", "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;
或遵循pop3方法:
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 () {}
答案 1 :(得分:1)
这篇文章(How to read the body of the message in the mail retrieve from gmail by using pop3 in c #?)解释了一个更好的方法来做你想做的事情。我使用的是TCP方式..但是使用Pop客户端要容易得多!
致以最诚挚的问候,
严