C#实现接收QQ邮件的示例代码

目录
  • 实现功能
  • 开发环境
  • 实现代码

前面写了一篇通过smtp协议利用qq邮箱去实现发送邮件的功能。这一篇我们使用pop协议来实现一下接收邮件。

由于邮件的内容类型比较丰富,我暂时没有一个比较好的解决方案(确切的说我是懒得一种种去解析),所以这里就获取下邮件的列表,以及邮件的标题信息

实现功能

C#获取QQ邮箱内的邮件

开发环境

开发工具: Visual Studio 2013

.NET Framework版本:4.5

实现代码

 static class Program
    {

        static string mail = "", pwd = "";
        static void Main(string[] args)
        {
            Connect();
            Console.WriteLine("结束运行");
            Console.ReadKey();
        }

          static void Connect()
        {

            TcpClient tcpClient = new TcpClient("pop.qq.com", 995);
            Console.WriteLine("已建立连接");

            SslStream sslStream = new SslStream(tcpClient.GetStream(), true);
            sslStream.AuthenticateAsClient("pop.qq.com");

            //发送邮箱账号
            sslStream.SendPop("user " + mail);
            Console.WriteLine(sslStream.ReadString().msg);

            //发送邮箱密码
            sslStream.SendPop("pass " + pwd);
            Console.WriteLine(sslStream.ReadString().msg);

            //获取邮箱统计数据
            sslStream.SendPop("stat");
            Console.WriteLine(sslStream.ReadString().msg);

            //获取邮件数量和每个邮件的大小
            sslStream.SendPop("list");
            string listMsg = sslStream.ReadString().msg;
            List<string> list = listMsg.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (list.Count < 2)
            {
                Console.WriteLine("未获取到邮件");
                return;
            }
            list.RemoveAt(0);
            list.RemoveAt(list.Count - 1);
            for (int i = list.Count - 1; i > -1; i--)
            {
                string[] arr = list[i].Split(' ');
                //获取邮件前n行内容
                sslStream.SendPop("top " + arr[0] + " 1");
                Console.WriteLine(list[i]);
                Console.WriteLine(GetHeader(sslStream.ReadString().msg));
                Console.WriteLine();
                Console.WriteLine();
            }

            //string id = Console.ReadLine();

            //sslStream.SendPop("retr " + id);
            //Console.WriteLine(GetContext(sslStream.ReadString().msg));

            sslStream.Close();
            tcpClient.Close();
        }

        /// <summary>
        /// 解析邮件标题
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        static string GetHeader(string text)
        {
            List<string> list = text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
            list.RemoveAt(0);
            list.RemoveAt(list.Count - 1);
            StringBuilder sb = new StringBuilder();
            for (int i = 1; i < list.Count; i++)
            {
                if (list[i].StartsWith("Date: "))
                {
                    sb.AppendLine("发送时间:" + list[i].Substring("Date: ".Length));
                }
                if (list[i].StartsWith("From: "))
                {
                    string value = list[i].Substring("From: ".Length);
                    sb.AppendLine("发送人:" + GetText(value));
                }
                if (list[i].StartsWith("Subject: "))
                {
                    string value = list[i].Substring("Subject: ".Length);
                    sb.AppendLine("邮件标题:" + GetText(value));
                }
                if (list[i].StartsWith("Cc: "))
                {
                    string value = list[i].Substring("Cc: ".Length);
                    sb.AppendLine("抄送:" + GetText(value));
                }

            }
            return sb.ToString();
        }

        /// <summary>
        /// 解析邮件内容
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        static string GetContext(string text)
        {
            List<string> list = text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
            list.RemoveAt(0);
            list.RemoveAt(list.Count - 1);
            StringBuilder sb = new StringBuilder();
            string s = list.Where(a => a.StartsWith("Content-Transfer-Encoding:")).SingleOrDefault();
            int index = list.IndexOf(s) + 1;
            for (int i = index; i < list.Count - index; i++)
            {
                sb.AppendLine(GetText(list[i]));
            }

            return sb.ToString();
        }

        /// <summary>
        /// 解析原始文本
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        static string GetText(string value)
        {
            string encoding = "utf-8";
            if (value.IndexOf("=?") == 0)
            {
                string tag = "";
                if (value.Contains("?B?"))
                {
                    tag = "?B?";
                    encoding = value.SubStr("=?", tag);
                }
                if (value.Contains("?b?"))
                {
                    tag = "?b?";
                    encoding = value.SubStr("=?", tag);
                }
                if (value.Contains("?Q?"))
                {
                    tag = "?Q?";
                    encoding = value.SubStr("=?", tag);
                }
                if (tag != "")
                {
                    string last = "";
                    int lastIndex = value.LastIndexOf("?=");
                    if (lastIndex != value.TrimEnd().Length - 2)
                    {
                        last = value.Substring(lastIndex + 2);
                    }
                    string text = value.SubStr(tag, "?=");
                    if (tag.ToLower().Contains("b"))
                    {
                        return Encoding.GetEncoding(encoding).GetString(Convert.FromBase64String(text)) + last;
                    }
                    else if (tag.ToLower().Contains("q"))
                    {
                        return DecodeQP(text, encoding) + last;
                    }
                }
            }
            return value;
        }
        static string SubStr(this string text, string start, string end)
        {
            try
            {
                int s = text.IndexOf(start);
                int e = text.LastIndexOf(end);
                if (s == -1 || e == -1)
                {
                    return text;
                }
                string result = text.Substring(s + start.Length, e - s - start.Length);
                return result;
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        /// <summary>
        /// 发送数据到pop
        /// </summary>
        /// <param name="sslStream"></param>
        /// <param name="text"></param>
        /// <param name="isNewLine"></param>
        static void SendPop(this SslStream sslStream, string text, bool isNewLine = true)
        {
            if (isNewLine)
            {
                text += "\r\n";
            }
            sslStream.Write(Encoding.ASCII.GetBytes(text));

        }

        static dynamic ReadString(this SslStream sslStream)
        {
            try
            {
                byte[] buffer = new byte[2048 * 2048];
                int len = sslStream.Read(buffer, 0, buffer.Length);
                string result = Encoding.UTF8.GetString(buffer, 0, len);
                if (result.StartsWith("-ERR"))
                {
                    throw new Exception(result);
                }
                else
                {
                    return new { code = 1, msg = result };
                }
            }
            catch (Exception ex)
            {
                return new { code = 0, msg = "读取错误:" + ex.Message };
            }
        }

        //Quoted-Printable 解码(QP解码)
        static string DecodeQP(string data, string encoding)
        {
            char ch;
            string ret = "";
            byte[] bytes = new byte[data.Length];
            int bIdex = 0;

            try
            {
                for (int rIndex = 0; rIndex < data.Length; rIndex++)
                {
                    ch = data[rIndex];
                    if (ch == '=')
                    {
                        rIndex++;
                        if (rIndex < data.Length && (Char.IsDigit(data[rIndex]) || Char.IsLetter(data[rIndex])))
                        {
                            bytes[bIdex++] = Byte.Parse(data.Substring(rIndex++, 2), System.Globalization.NumberStyles.HexNumber);
                            continue;
                        }
                        if (rIndex < data.Length && data[rIndex] == '\r' && (rIndex + 1) < data.Length && data[rIndex + 1] == '\n')
                        {
                            rIndex++;
                            continue;
                        }
                    }
                    if (ch == '\r' || ch == '\n')
                        continue;
                    bytes[bIdex++] = (byte)ch;
                }
                ret = Encoding.GetEncoding(encoding).GetString(bytes, 0, bIdex);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return ret;
        }
    }

到此这篇关于C#实现接收QQ邮件的示例代码的文章就介绍到这了,更多相关C#接收QQ邮件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#实现收发邮件功能

    一.服务端 TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 13000);//定义监听器 server.Start();//启动监听器 byte[] buffer = new byte[1024]; //创建一个容器用于接受数据 string data = null; while (true) { //等待客户端连接过来 TcpClient client = server.AcceptTcpClien

  • 使用c#+IMap实现收取163邮件

    最近我要做一个爬虫.这个爬虫需要如下几个步骤: 1 填写注册内容(需要邮箱注册) 2 过拖拽验证码(geetest) 3 注册成功会给邮箱发一封确认邮箱 4 点击确认邮箱中的链接 完成注册 我这里就采用163邮箱注册. 邮箱协议有 pop3 和 imap 和 smtp 我试了pop3  不能够筛选邮件 例如筛选未读 和 发件人这2个条件 所以放弃用pop3 imap协议是支持的. 我就找了一个开源的第三方lib:S22.Imap 用法很简单: public void Test163() { va

  • C# 邮件发送和接收实现代码

    邮件发送 方法一:使用System.Web.Mail命名空间(此方法我测试没有成功过)  复制代码 代码如下: #region 发送邮件:此方法失败 protected void SendFailed() { System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage(); mail.From = "test@ gmail.com"; mail.To = " test@ gmail.com "

  • c#使用IMap收取163邮件的方法示例

    前言 IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一.不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作.所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的. 最近我要做一个爬虫.这个爬虫需要如下几个步骤: 1 填写注册内容(需要邮箱注册) 2 过拖拽验证码(ge

  • c#使用S22.Imap收剑灵激活码邮件代码示例(imap收邮件)

    复制代码 代码如下: 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 S22.Imap; namespace _163pop3{    public partial class For

  • C#实现接收QQ邮件的示例代码

    目录 实现功能 开发环境 实现代码 前面写了一篇通过smtp协议利用qq邮箱去实现发送邮件的功能.这一篇我们使用pop协议来实现一下接收邮件. 由于邮件的内容类型比较丰富,我暂时没有一个比较好的解决方案(确切的说我是懒得一种种去解析),所以这里就获取下邮件的列表,以及邮件的标题信息 实现功能 C#获取QQ邮箱内的邮件 开发环境 开发工具: Visual Studio 2013 .NET Framework版本:4.5 实现代码 static class Program { static stri

  • SpringBoot实现发送QQ邮件的示例代码

    目录 配置发送邮件 1.引入SpringBoot的Mail依赖 2.配置邮箱发送的Bean 3.发送测试邮件 4.查看效果 应用启动&停止邮件通知 总结 在跑个人应用的时候,想引入一个通知机制,在应用启动和停止的时候通知下自己(因为应用部署在服务器上,不想每次都到服务器上看): 发送短信要申请模板,而且还收费... 发送手机通知又太多依赖: 钉钉.微信:至于钉钉和微信骚扰消息太多了,容易漏掉通知信息 剩下的就是发送邮箱.免费.而且没有那么多的通知干扰,邮箱App在收到邮件的时候会自动的发生一条P

  • PHP使用POP3读取邮箱接收邮件的示例代码

    直接上代码: <?php $array_values['host'] = "host"; $array_values['port'] = 110; $array_values['user'] = '用户名'; $array_values['password'] = '密码'; $array_values['checkmail'] = 'xxx@xxx.xxx'; ganji_get_test_mail($array_values); function ganji_get_test

  • Python结合Window计划任务监测邮件的示例代码

    说起自动化绝对算是茶余饭后最有显B格的谈资,毕竟解放双手是从老祖先那里就流传下来的基因,都2020了,你每天上班还要登录各个邮箱账号查收邮件?快来解锁本章内容 整体思路 通过Python zemail库实现邮件读取 将最新一封邮件ID进行保存,第二次执行时比对邮件ID,判断是否是新邮件 通过Python pymsgbox库实现window弹窗提示 配置Window计划任务,每1分钟执行一次 步骤一:邮件读取 读取邮件通过Python zemail库进行,使用前通过 pip install zem

  • python 发送qq邮件的示例

    python自带了两个模块smtplib和email用于发送邮件.smtplib模块主要负责发送邮件,它对smtp协议进行了简单的封装.email模块主要负责邮件的构造. email包下有三个模块:MIMEText,MIMEImage,MIMEMultipart 发送纯文本qq邮件 import smtplib from email.header import Header from email.mime.text import MIMEText sender = '888888@qq.com'

  • Python使用POP3和SMTP协议收发邮件的示例代码

    先来了解一下收/发邮件有哪些协议: SMTP协议 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议.相当于中转站,将邮件发送到客户端. POP3协议 POP3(Post Office Protocol 3),即邮局协议的第3个版本,是电子邮件的第一个离线协议标准.该协议把邮件下载到本地计算机,不与服务器同步,缺点是更易丢失邮件或多次下载相同的邮件. IMAP协议 IMAP(Internet Mail Access Protocol),即交互式邮件存取协议

  • Python qqbot 实现qq机器人的示例代码

    qqbot 是一个用 python 实现的.基于腾讯 SmartQQ 协议的 QQ 机器人框架,可运行在 Linux . Windows 和 Mac OSX 平台下. 你可以通过扩展 qqbot 来实现: 监控.收集 QQ 消息 自动消息推送 聊天机器人 通过 QQ 远程控制你的设备 qqbot项目Gayhub地址:https://github.com/pandolia/qqbot # -*- coding: utf-8 -*- import qqbot from qqbot import QQ

  • PHP版QQ互联OAuth示例代码分享

    由于国内QQ用户的普遍性,所以现在各大网站都尽可能的提供QQ登陆口,下面我们来看看php版,给大家参考下 /** * QQ互联 oauth * @author dyllen * */ class Oauth { //取Authorization Code Url const PC_CODE_URL = 'https://graph.qq.com/oauth2.0/authorize'; //取Access Token Url const PC_ACCESS_TOKEN_URL = 'https:

  • 使用spring mail发送html邮件的示例代码

    序 本文展示一下如何使用spring mail来发送html邮件. maven <!-- email --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 发送图片 public void send(String from, St

  • Python实现发送QQ邮件的封装

    本文实例为大家分享了Python实现发送QQ邮件的封装代码,供大家参考,具体内容如下 封装code import smtplib from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header # type=plain 文本格式 默认 # type=ht

随机推荐