精华内容
下载资源
问答
  • C++ POP3

    热门讨论 2012-02-19 21:33:48
    实现一个简单的pop3接收邮件的程序,能够连接到指定的pop3服务器(port=110),通过账户和口令认证后读取邮件信息。
  • c++ pop3_3PO

    2020-09-28 00:12:41
    c++ pop3Say hello to the 3PO extension for YSlow. It checks your site for integration with popular 3rd parties, such as Facebook, Twitter widgets, Google Analytics and so on. 向YSlow的3PO扩展问好。 ...
    c++ pop3

    c++ pop3

    Say hello to the 3PO extension for YSlow. It checks your site for integration with popular 3rd parties, such as Facebook, Twitter widgets, Google Analytics and so on.

    向YSlow的3PO扩展问好。 它检查您的网站是否与流行的第三方集成,例如Facebook,Twitter小部件,Google Analytics(分析)等。

    3PO (3rd party optimization) extension currently has 5 checks: two of them generic to all 3rd parties and three specific to Facebook plugins. I'm looking forward to adding more checks and more specific to a particular provider's best practices.

    3PO(第三方优化)扩展当前具有5个检查:其中两个对所有第三方通用,而三个特定于Facebook插件。 我期待增加更多的检查,并针对特定提供商的最佳做法进行更具体的检查。

    The extension is currently available as a bookmarklet, but since YSlow is a platform available on many platforms, it can be built as a Firefox or Chrome extension, command line tool, etc.

    该扩展程序目前可以作为书签使用,但是由于YSlow是许多平台上都可以使用的平台,因此可以将其构建为Firefox或Chrome扩展程序,命令行工具等。

    安装 (Install)

    Click this link to test, or drag to your bookmarks to install

    单击此链接进行测试,或拖动到书签进行安装

    慢速+ 3PO(YSlow +3PO)

    And the code is available in my YSlow fork on Github.

    代码可以在我在Github上的YSlow分支中找到

    支票 (Checks)

    Here's a the list of checks along with some explanation.

    这是检查清单以及一些说明。

    异步加载第三方JS (Load 3rd party JS asyncrhonously)

    Category: Common

    分类:普通

    Use the JavaScript snippets that load the JS files asynchronously in order to speed up the user experience. Most providers offer you an asynchronous version of the script you're including on your page. If they don't, let them know and meanwhile do it yourself

    使用JavaScript片段来异步加载JS文件,以加快用户体验。 大多数提供程序都会为您提供页面上包含的脚本的异步版本。 如果他们不这样做,请让他们知道,同时自己动手做

    If you don't include the script asynchronously, you create a SPOF (Single Point of Failure) and your site effectively goes down when the 3rd party goes down. See for yourself.

    如果不异步包含脚本,则创建一个SPOF(单点故障),并且当第3方关闭时,您的站点也会有效关闭。 你自己看。

    仅加载一次第三方JS (Load the 3rd party JS only once)

    Category: Common

    分类:普通

    Loading the 3rd party JS files more than once per page is not necessary and slows down the user experience. Sometimes people copy-paste snippets multiple times on the page, e.g. when you have one widget per blog post in a blog post listing. The script only needs to load once and serve multiple widgets.

    每页不必多次加载第三方JS文件,这会减慢用户体验。 有时,人们在页面上多次复制粘贴摘要,例如,当您在博客文章列表中每个博客文章都具有一个小部件时。 该脚本仅需要加载一次并提供多个小部件。

    定义XML名称空间 (Define XML namespace)

    Category: Facebook

    类别: Facebook

    If you use tags like <fb:like> you need to define an XML namespace to make the plugin work in old IE versions. Same for any tag that has :

    如果使用<fb:like>之类的标记,则需要定义XML名称空间,以使插件在旧IE版本中正常工作。 对于具有以下内容的任何标签都相同:

    添加#fb-root元素 (Add an #fb-root element)

    Category: Facebook

    类别: Facebook

    The Facebook JS SDK needs an element with id="fb-root". So add this to your page, before you include the Facebook JS SDK

    Facebook JS SDK需要一个具有id="fb-root"的元素。 因此,在添加Facebook JS SDK之前,请将其添加到页面中

    <div id="fb-root">
    

    包含OG(开放图)元标记 (Include OG (Open Graph) meta tags)

    Category: Facebook

    类别: Facebook

    Open graph tags let you better describe your content. To learn more, see the documentation. And run the tool to validate your page.

    开放式图形标签可让您更好地描述您的内容。 要了解更多信息,请参阅文档。 并运行该工具来验证您的页面。

    Tell your friends about this post on Facebook and Twitter

    FacebookTwitter上告诉您的朋友有关此帖子的信息

    翻译自: https://www.phpied.com/3po/

    c++ pop3

    展开全文
  • 谁有c++ pop3的连接或是TCP连接
  • Sniffer POP3 Visual C++

    2009-10-21 19:15:49
    Sniffer POP3 Visual C++ Sniffer POP3 Visual C++
  • ... by mx38 (Coremail) with SMTP id WMCowECZw0KENhpaanBhBg--.44982S3; Sun, 26 Nov 2017 11:35:33 +0800 (CST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;... s=s201512;... bh=JwG8Rb430dNUOlGYzpxxIK9...
  • visual c++基于SMTP,POP3收发电子邮件.zip
  • c++《网络编程》pop3

    2009-12-11 12:45:01
    很多EMAIL系统都是使用SMTP协议来作为发送协议,而POP3协议来作为接受协议。关于这2个协议的许多资料,你可以看一下RCF821(关于SMTP的)和RCF1225(关于POP3的)。虽然在WINDOWS操作系统中,有一个叫MAPI应用程序是...
  • C++开发的基于POP3协议的电子邮件接收端
  • c++编写的smtp和pop3服务器实现,简单小巧,运行流畅,支持多客户端。
  • pop3 client --c++源码

    2010-04-10 19:28:21
    pop3 client源码,附demo,配合base64-utf-8解码,能够很好的支持中文
  • pop3高级程序开发是一个能够从pop3服务器中检查所有邮件,并且可以查看邮件内容,也可以删除邮件但是没有实现附件的接收,使用时需要设定服务器地址以及用户名和密码;
  • pop3邮件接收器 in C++..

    2011-03-14 16:39:47
    pop3邮件接收器 in C++.....................
  • C++BUILDER 实现 POP3 电子邮件的接收 (转)[@more@]通过对 C++BUILDER 的组件设置,我们可以创建一个自己的POP3电子邮件接收程序。 一、建立一个工程文件 二、建立一个新的表单,设置...
    用 C++BUILDER 实现 POP3 电子邮件的接收 (转)[@more@]

    通过对 C++BUILDER 的组件设置,我们可以创建一个自己的POP3电子邮件接收程序

    一、建立一个工程文件

    二、建立一个新的表单,设置它的caption属性为GetMail,在上面放置一个TpageControl控件,单击右键创建三个TabSheet(1,2,3)。在TabSheet1上放置四个Edit(1,2,3,4)控件并清除它们的Text属性及两个Botton(1,2),其中Edit1用以输入POP3服务器的名称;Edit2用以设置访问端口号,我们设置它为110,并将它的Text属性设为110;Edit3用以输入用户名;Edit4用以输入口令。设Botton1的caption为“连接”,Botton2的caption为“断开连接”。在TabSheet2上放置五个Edit(5,6,7,8,9)控件、两个Memo控件和三个Botton(3,4,5),Edit5用来显示邮件的编号;Edit6、Edit7、Edit8和Edit9分别用来显示邮件的发送者、邮件的主题、大小及ID号;Memo1用来显示邮件的正文;Memo2用来显示邮件头;Botton3、Botton4、Botton5的caption属性分别设置为“删除”、“邮件”和“邮件信息”。在TabSheet3上放置两个Botton和一个Memo控件,其中Botton6的caption属性为“邮件列表”;Botton7的caption为“清除列表”;Memo的用途自然为显示邮件列表。在表单的底部放置一个Statusbar控件用以显示工作状态。最后,最重要的是在表单上放置一个NMPOP3控件,在这个程序里,它是我们与POP3服务器通讯的核心。

    三、编写代码

    为Botton1的OnClick事件编写代码:

    NMPOP31->AttachFilePath = "."; //设定邮件的存储目录
    NMPOP31->DeleteOnRead = false; //读完邮件后是否删除
    NMPOP31->ReportLevel = Status_Basic; //控制OnStatus事件和Status属性报告的资料的数量
    NMPOP31->TimeOut = 20000; //设置超时的时间
    NMPOP31->Host = Edit1->Text; //设置pop3服务器的主机名
    NMPOP31->Port = StrToInt(Edit2->Text); //设置pop3服务器的端口号
    NMPOP31->UserID = Edit3->Text; //取得用户名
    NMPOP31->Password = Edit4->Text; //得到口令
    NMPOP31->Connect(); //开始连接
    Label10->Caption = "# of Messages: "+IntToStr(NMPOP31->MailCount); //显示邮件的数量

    为Botton2的OnClick事件编写代码:

    NMPOP31->DiSCOnnect(); //使之能够与服务器断开连接

    为Botton3的OnClick事件编写代码,当点击它时可以删除邮件:

    NMPOP31->DeletemailMessage(StrToInt(Edit5->Text));

    为Botton4的OnClick事件编写代码,当点击它时显示整个邮件:

    NMPOP31->GetMailMessage(StrToInt(Edit5->Text));
    Edit6->Text = NMPOP31->MailMessage->From; //通过MailMessage的From属性得到发信人
    Edit7->Text = NMPOP31->MailMessage->Subject; //通过MailMessage的Subjecet属性得到主题
    Edit9->Text = NMPOP31->MailMessage->MessageId; //通过MailMessage的MessageIds属性得到Id
    Memo2->Lines->Assign(NMPOP31->MailMessage->Head);
    Memo1->Lines->Assign(NMPOP31->MailMessage->Body);
    if (NMPOP31->MailMessage->Attachments->Text != "")
    ShowMessage("Attachments:n"+NMPOP31->MailMessage->Attachments->Text);

    为Botton5的OnClick事件编写代码,点击它时将在Memo中显示邮件的概要信息:

    NMPOP31->GetSummary(StrToInt(Edit5->Text));
    Edit6->Text = NMPOP31->Summary->From;
    Edit7->Text = NMPOP31->Summary->Subject;
    Edit8->Text = IntToStr(NMPOP31->Summary->Bytes);
    Edit9->Text = NMPOP31->Summary->MessageId;

    为Botton6的OnClick事件编写代码,点击它时将在Memo3中显示邮件列表:

    NMPOP31->List(); //得到邮件的数量和大小的列表

    为Botton7的OnClick事件编写代码,点击它时将清除Memo3中的邮件列表:

    Memo3->Clear();

    为NMPOP3的事件编写代码

    1. 为它的OnConnect事件编写代码

    StatusBar1->SimpleText = "Connected"; //连接后在状态栏显示已连接

    2. 为它的OnConnectionFailed事件编写代码

    ShowMessage("Connection Failed"); //若连接失败则报告

    3. 为它的OnConnectionRequired事件编写代码

    AnsiString BoxCaption;
    AnsiString BoxMsg;
    BoxCaption = "请求连接";
    BoxMsg = "请求连接,连接吗?";
    if (MessageBox(0, &BoxMsg[1], &BoxCaption[1], MB_YESNO + MB_ICONEXCLAMATION) == IDYES)
    {
      handled = TRUE;
      Form1->Button1Click(this);
    }

    4.为它的OnDisconnect事件编写代码

    if (StatusBar1 != 0)
      StatusBar1->SimpleText = "Disconnected"; //断开连接后在状态栏显示已断开

    5. 为它的OnFailuer事件编写代码

    ShowMessage("操作失败!");

    6. 为它的OnHostResovled事件编写代码

    StatusBar1->SimpleText = "Host Resolved";

    7.为它的OnInvailidHost事件编写代码

    AnsiString NewHost;

    if (InputQuery("非法主机名!", "请重新输入新的主机名",NewHost))
    {
      NMPOP31->Host = NewHost;
      handled = true;
    }

    8. 为它的OnList事件编写代码

    if (Msg < 2)
    {
      Memo3->Clear();
      Memo3->Lines->Add("Message Number / Message Size");
    }
    Memo3->Lines->Add(IntToStr(Msg)+"/ "+IntToStr(Size));

    9. 为它的OnListPacketRecvd事件编写代码

    StatusBar1->SimpleText = IntToStr(NMPOP31->BytesRecvd)+" bytesof "+IntToStr(NMPOP31->BytesTotal)+" Received";

    10. 为它的OnReset事件编写代码

    ShowMessage("重置删除标志");

    11. 为它的OnRetrieveEnd事件编写代码

    Form1->Cursor = crDefault;
    StatusBar1->SimpleText = "恢复完成";

    12. 为它的OnRetrieveStart事件编写代码

    Form1->Cursor =crHourGlass;
    StatusBar1->SimpleText = "恢复开始";

    13. 为它的OnStatus事件编写代码

    if (StatusBar1 != 0)
    StatusBar1->SimpleText = Status;

    14. 为它的OnSuccess事件编写代码

    StatusBar1->SimpleText = "操作成功"。

    至此,我们的电子邮件程序就完成了,编译运行后,输入你的pop3服务器名,你就可以接收到你的电子邮件了,怎么样?试一试吧。

    -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-
     /
     __________/LB___ OUTINN
     / _[]_ /____ 
    /_________/| () |__  .NET/">http://outinn.yeah.net/
     | ____ /-| __ |-| Welcome to visit OUTINN!
     |__|==|___| || |__|
     -=--=--=- |_||_| =- Fancy,  outinn@china.com

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-990003/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/10752043/viewspace-990003/

    展开全文
  • 采用Pop3协议实现的收邮件工具,VC8.0以上开发
  • 通过对 C++BUILDER 的组件设置,我们可以创建一个自己的POP3电子邮件接收程序。 一、建立一个工程文件 二、建立一个新的表单,设置它的caption属性为Getmail,在上面放置一个TpageControl控件,单击右键创建三个TabSheet...

    通过对 C++BUILDER 的组件设置,我们可以创建一个自己的POP3电子邮件接收程序。

    一、建立一个工程文件

    二、建立一个新的表单,设置它的caption属性为Getmail,在上面放置一个TpageControl控件,单击右键创建三个TabSheet(1,2,3)。在TabSheet1上放置四个Edit(1,2,3,4)控件并清除它们的Text属性及两个Botton(1,2),其中Edit1用以输入POP3服务器的名称;Edit2用以设置访问端口号,我们设置它为110,并将它的Text属性设为110;Edit3用以输入用户名;Edit4用以输入口令。设Botton1的caption为“连接”,Botton2的caption为“断开连接”。在TabSheet2上放置五个Edit(5,6,7,8,9)控件、两个Memo控件和三个Botton(3,4,5),Edit5用来显示邮件的编号;Edit6、Edit7、Edit8和Edit9分别用来显示邮件的发送者、邮件的主题、大小及ID号;Memo1用来显示邮件的正文;Memo2用来显示邮件头;Botton3、Botton4、Botton5的caption属性分别设置为“删除”、“邮件”和“邮件信息”。在TabSheet3上放置两个Botton和一个Memo控件,其中Botton6的caption属性为“邮件列表”;Botton7的caption为“清除列表”;Memo的用途自然为显示邮件列表。在表单的底部放置一个StatusBar控件用以显示工作状态。最后,最重要的是在表单上放置一个NMPOP3控件,在这个程序里,它是我们与POP3服务器通讯的核心。

    三、编写代码

    为Botton1的OnClick事件编写代码:

    NMPOP31->AttachFilePath = "."; //设定邮件的存储目录
    NMPOP31->DeleteOnRead = false; //读完邮件后是否删除
    NMPOP31->ReportLevel = Status_Basic; //控制OnStatus事件和Status属性报告的资料的数量
    NMPOP31->TimeOut = 20000; //设置超时的时间
    NMPOP31->Host = Edit1->Text; //设置pop3服务器的主机名
    NMPOP31->Port = StrToInt(Edit2->Text); //设置pop3服务器的端口号
    NMPOP31->UserID = Edit3->Text; //取得用户名
    NMPOP31->Password = Edit4->Text; //得到口令
    NMPOP31->Connect(); //开始连接
    Label10->Caption = "# of Messages: "+IntToStr(NMPOP31->MailCount); //显示邮件的数量

    为Botton2的OnClick事件编写代码:

    NMPOP31->Disconnect(); //使之能够与服务器断开连接

    为Botton3的OnClick事件编写代码,当点击它时可以删除邮件:

    NMPOP31->DeleteMailMessage(StrToInt(Edit5->Text));

    为Botton4的OnClick事件编写代码,当点击它时显示整个邮件:

    NMPOP31->GetMailMessage(StrToInt(Edit5->Text));
    Edit6->Text = NMPOP31->MailMessage->From; //通过MailMessage的From属性得到发信人
    Edit7->Text = NMPOP31->MailMessage->Subject; //通过MailMessage的Subjecet属性得到主题
    Edit9->Text = NMPOP31->MailMessage->MessageId; //通过MailMessage的MessageIds属性得到Id
    Memo2->Lines->Assign(NMPOP31->MailMessage->Head);
    Memo1->Lines->Assign(NMPOP31->MailMessage->Body);
    if (NMPOP31->MailMessage->Attachments->Text != "")
    ShowMessage("Attachments:/n"+NMPOP31->MailMessage->Attachments->Text);

    为Botton5的OnClick事件编写代码,点击它时将在Memo中显示邮件的概要信息:

    NMPOP31->GetSummary(StrToInt(Edit5->Text));
    Edit6->Text = NMPOP31->Summary->From;
    Edit7->Text = NMPOP31->Summary->Subject;
    Edit8->Text = IntToStr(NMPOP31->Summary->Bytes);
    Edit9->Text = NMPOP31->Summary->MessageId;

    为Botton6的OnClick事件编写代码,点击它时将在Memo3中显示邮件列表:

    NMPOP31->List(); //得到邮件的数量和大小的列表

    为Botton7的OnClick事件编写代码,点击它时将清除Memo3中的邮件列表:

    Memo3->Clear();

    为NMPOP3的事件编写代码

    1. 为它的OnConnect事件编写代码

    StatusBar1->SimpleText = "Connected"; //连接后在状态栏显示已连接

    2. 为它的OnConnectionFailed事件编写代码

    ShowMessage("Connection Failed"); //若连接失败则报告

    3. 为它的OnConnectionRequired事件编写代码

    AnsiString BoxCaption;
    AnsiString BoxMsg;
    BoxCaption = "请求连接";
    BoxMsg = "请求连接,连接吗?";
    if (MessageBox(0, &BoxMsg[1], &BoxCaption[1], MB_YESNO + MB_ICONEXCLAMATION) == IDYES)
    {
        handled = TRUE;
        Form1->Button1Click(this);
    }

    4.为它的OnDisconnect事件编写代码

    if (StatusBar1 != 0)
        StatusBar1->SimpleText = "Disconnected"; //断开连接后在状态栏显示已断开

    5. 为它的OnFailuer事件编写代码

    ShowMessage("操作失败!");

    6. 为它的OnHostResovled事件编写代码

    StatusBar1->SimpleText = "Host Resolved";

    7.为它的OnInvailidHost事件编写代码

    AnsiString NewHost;

    if (InputQuery("非法主机名!", "请重新输入新的主机名",NewHost))
    {
        NMPOP31->Host = NewHost;
        handled = true;
    }

    8. 为它的OnList事件编写代码

    if (Msg < 2)
    {
        Memo3->Clear();
        Memo3->Lines->Add("Message Number / Message Size");
    }
    Memo3->Lines->Add(IntToStr(Msg)+"/ "+IntToStr(Size));

    9. 为它的OnListPacketRecvd事件编写代码

    StatusBar1->SimpleText = IntToStr(NMPOP31->BytesRecvd)+" bytesof "+IntToStr(NMPOP31->BytesTotal)+" Received";

    10. 为它的OnReset事件编写代码

    ShowMessage("重置删除标志");

    11. 为它的OnRetrieveEnd事件编写代码

    Form1->Cursor = crDefault;
    StatusBar1->SimpleText = "恢复完成";

    12. 为它的OnRetrieveStart事件编写代码

    Form1->Cursor =crHourGlass;
    StatusBar1->SimpleText = "恢复开始";

    13. 为它的OnStatus事件编写代码

    if (StatusBar1 != 0)
    StatusBar1->SimpleText = Status;

    14. 为它的OnSuccess事件编写代码

    StatusBar1->SimpleText = "操作成功"。

    至此,我们的电子邮件程序就完成了,编译运行后,输入你的pop3服务器名,你就可以接收到你的电子邮件了,怎么样?试一试吧。

    -=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=--=-
                 //
      __________/LB/___   OUTINN
     /  _[]_   /____/  /
    /_________/| () |/__/  http://outinn.yeah.net/
     |  ____ /-| __ |-/|  Welcome to visit OUTINN!
     |__|==|___| || |__|
     -=--=--=- |_||_| =-  Fancy,  outinn@china.com
    展开全文
  • 只要实现连接就可以了,连接成功就显示“连接成功”,用户名或密码错就显示“连接失败”,不需要显示邮箱的邮件总数、大小等详细信息。感激。
  • c++开发的邮件发送和接受程序,里面有pop3和smtp类,使用非常方便,封装的很合理。代码写得非常流畅合理:)mail sending and receiving procedures
  • POP3和SMTP的C++实现代码

    千次阅读 2013-06-23 18:02:02
    多年前写的邮件收发c++代码,有兴趣的朋友可看看。 支持windows和linux平台编译运行。 /// mail.h 头文件 //////wrote by Fanxiushu 2007-4-29 /// MAIL Protocol #pragma once #include #...

                                                               By Fanxiushu ,引用和转载请注明原作者。

    多年前写的邮件收发c++代码,有兴趣的朋友可看看。

    支持windows和linux平台编译运行。


    /// mail.h 头文件

    //wrote by Fanxiushu 2007-4-29
    /// MAIL Protocol

    #pragma once



    #include <string>
    #include <list>

    using namespace std;

    struct mail_t
    {
        string mail_from;
        list<string> rcpt_to;
        string subject;
        string body;
        list<string> attachments;
        string err_msg;
    };

    struct mailex_t
    {
        string mail_svrip;
        int mail_svrport;
        string user;
        string passwd;
        ///
        string mail_from;
        list<string> rcpt_to;
        string subject;
        string body;
        list<string> attachments;
        ///
        string err_msg;
    };

    const char*  base64_encode(const unsigned char* text,
                               int size,char* buf,int* out_len);
    int base64_decode(const char* text,int size,char* buf);
    //SMTP
    int smtp_login(const char* str_ip,int port,
                   const char* user,const char* passwd);
    void smtp_bye(int fd);
    int smtp_sendmail(int fd,struct mail_t* mail);
    int smtp_sendmail(struct mailex_t* mail);

    POP3
    int pop3_login(const char* str_ip,int port,
                   const char* user,const char* passwd);
    void pop3_bye(int fd);
    int pop3_getmails(int fd,const char* path,bool del_svrmail);


    ///

    mail.cpp 实现源文件

    //wrote by Fanxiushu 2007-4-29
    /// MAIL Protocol
    //

    #ifdef WIN32
    #pragma warning(disable:4786)
    #include <winsock2.h>
    #pragma comment(lib,"ws2_32")
    #include <io.h>
    #include <direct.h>

    #undef  mkdir
    #define mkdir(a,b) _mkdir(a)

    #define strncasecmp strnicmp

    #else
    #ifdef __sun
    #ifndef INADDR_NONE
        #define INADDR_NONE (uint32_t)-1
    #endif
    #include <sys/filio.h>
    #include <sys/sockio.h>
    #include <sys/termios.h>
    #include <sys/statvfs.h>
    #endif //solaris

    #include <unistd.h>
    #include <sys/socket.h>
    #include <sys/stat.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <sys/poll.h>
    #include <poll.h>
    #include <sys/ioctl.h>
    #include <errno.h>
    #include <stdarg.h>
    #include <resolv.h>

    typedef int SOCKET;
    #define closesocket(s) close(s)

    #endif

    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>

    #include "mail.h"


    static const int BUF_SIZE = 4096;

    //the two functions copy from internet,and modified by Fanxiushu.
    const char* base64_encode(const unsigned char* text,int size,char* buf,int *out_len)
    {
        char* head_buf = buf;
        static char *base64_encoding =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        int buflen = 0;
        while(size>0)
        {
            *buf++ = base64_encoding[ (text[0] >> 2 ) & 0x3f];
            if(size>2)
            {
                *buf++ = base64_encoding[((text[0] & 3) << 4) | (text[1] >> 4)];
                *buf++ = base64_encoding[((text[1] & 0xF) << 2) | (text[2] >> 6)];
                *buf++ = base64_encoding[text[2] & 0x3F];
            }
            else
            {
                switch(size)
                {
                case 1:
                    *buf++ = base64_encoding[(text[0] & 3) << 4 ];
                    *buf++ = '=';
                    *buf++ = '=';
                    break;
                case 2:
                    *buf++ = base64_encoding[((text[0] & 3) << 4) | (text[1] >> 4)];
                    *buf++ = base64_encoding[((text[1] & 0x0F) << 2) | (text[2] >> 6)];
                    *buf++ = '=';
                    break;
                }
            }
            
            text +=3;
            size -=3;
            buflen +=4;
        }
        *buf = 0;
        *out_len = buflen;
    //    return buflen;
        return head_buf;
    }

    static inline
    char GetBase64Value(char ch)
    {
        if ((ch >= 'A') && (ch <= 'Z'))
            return ch - 'A';
        if ((ch >= 'a') && (ch <= 'z'))
            return ch - 'a' + 26;
        if ((ch >= '0') && (ch <= '9'))
            return ch - '0' + 52;
        switch (ch)
        {
        case '+':
            return 62;
        case '/':
            return 63;
        case '=': /* base64 padding */
            return 0;
        default:
            return 0;
        }
    }
    int base64_decode(const char* text,int size,char* buf)
    {
        if(size%4)
            return -1;
        unsigned char chunk[4];
        int parsenum=0;
        while(size>0)
        {
            chunk[0] = GetBase64Value(text[0]);
            chunk[1] = GetBase64Value(text[1]);
            chunk[2] = GetBase64Value(text[2]);
            chunk[3] = GetBase64Value(text[3]);
            
            *buf++ = (chunk[0] << 2) | (chunk[1] >> 4);
            *buf++ = (chunk[1] << 4) | (chunk[2] >> 2);
            *buf++ = (chunk[2] << 6) | (chunk[3]);
            
            text+=4;
            size-=4;
            parsenum+=3;
        }
        return parsenum;
    }

    /basic comunication functions.
    inline static
    int block_read(int fd,char* buf,int len,int tmo= 15 )
    {
        int curr_len = 0;

    #ifdef WIN32
        fd_set rdst;FD_ZERO(&rdst);FD_SET(fd,&rdst);
        struct timeval timeout;timeout.tv_sec = tmo;timeout.tv_usec = 0;
        int status = select(fd + 1,&rdst,NULL,NULL,tmo != 0 ? &timeout : NULL);
    #else
        struct pollfd ufds;
        ufds.fd = fd;ufds.events = POLLIN; ufds.revents = 0;
        int ms = tmo != 0 ? tmo*1000:-1;
        int status = poll(&ufds,1,ms);
    #endif
        ///
        
        if(status < 0)
            return -1;
        else if( status == 0)
            return 0;
        ///
        curr_len = recv(fd,buf,len,0);
        if(curr_len <= 0)
            return -1;
        return curr_len;
    }
    inline static
    int read_complete(int fd,char* buf,int len,int tmo =30 )
    {
        int sz = 0;
        while(sz < len){
    #ifdef WIN32
            fd_set rdst;FD_ZERO(&rdst);FD_SET(fd,&rdst);
            struct timeval timeout;timeout.tv_sec = tmo;timeout.tv_usec = 0;
            int status = select(fd + 1,&rdst,NULL,NULL,tmo != 0 ? &timeout : NULL);
    #else
            struct pollfd ufds;
            ufds.fd = fd;ufds.events = POLLIN; ufds.revents = 0;
            int ms = tmo != 0 ? tmo*1000:-1;
            int status = poll(&ufds,1,ms);
    #endif
            ///
            if(status <= 0)
                return -1;
            int r = recv(fd,buf + sz,len - sz,0);
            if( r <= 0)
                return -1;
            sz += r;
        }
        return sz;
    }
    inline static
    int read_line(int fd,char* buf,int len,int tmo = 30 )
    {
        int sz = 0;
        while(sz < len ){
    #ifdef WIN32
            fd_set rdst;FD_ZERO(&rdst);FD_SET(fd,&rdst);
            struct timeval timeout;timeout.tv_sec = tmo;timeout.tv_usec = 0;
            int status = select(fd + 1,&rdst,NULL,NULL,tmo != 0 ? &timeout : NULL);
    #else
            struct pollfd ufds;
            ufds.fd = fd;ufds.events = POLLIN; ufds.revents = 0;
            int ms = tmo != 0 ? tmo*1000:-1;
            int status = poll(&ufds,1,ms);
    #endif
            
            if(status <= 0)
                return -1;
            int r = recv(fd,buf + sz,len -1 - sz,0);
            if( r <= 0)
                return -1;
            sz += r;
            buf[sz]='\0';
            char* str = strstr(buf,"\r\n");
            if(str){
                *str = '\0';
                return sz;
            }
        }
        return sz;
    }
    inline static
    int write_complete(int fd,char* buf,int len,int timeout = 30)
    {
        int sz = 0;
        while(sz < len){
    #ifdef WIN32
            fd_set wrst;FD_ZERO(&wrst);FD_SET((SOCKET)fd,&wrst);
            struct timeval tmo;memset(&tmo,0,sizeof(tmo));tmo.tv_sec = timeout;
            int status = select(fd +1,NULL,&wrst,NULL,timeout != 0 ? &tmo: NULL);
    #else
            struct pollfd ufds;
            ufds.fd = fd;ufds.events = POLLOUT;ufds.revents = 0;
            int ms = timeout != 0 ? timeout*1000:-1;
            int status = poll(&ufds,1,ms);
    #endif

            if(status <= 0)
                return -1;
            int r = send(fd,buf + sz,len - sz,0);
            if (r <= 0)
                return -1;
            sz += r;
        }
        return sz;
    }
    inline static
    int simple_connect(const char* str_ip,int port,int tmo)
    {
        int sock = socket(AF_INET,SOCK_STREAM,0);
        if( sock < 0)
            return -1;
        sockaddr_in addr;memset(&addr,0,sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        unsigned int ip = inet_addr(str_ip);
        if( ip ==  INADDR_NONE){
    #ifndef WIN32
            res_init(); //确保改变 /etc/resolv.conf能马上生效
    #endif
            hostent* p= gethostbyname(str_ip);
            if(!p){
                closesocket(sock);
                return -1;
            }
            memcpy(&ip , (p->h_addr_list[0]),sizeof(unsigned int));
        }
        memcpy(&addr.sin_addr,&ip,sizeof(unsigned int));
    #ifdef WIN32
        fd_set wrst;FD_ZERO(&wrst);FD_SET((SOCKET)sock,&wrst);
        fd_set exst;FD_ZERO(&exst);FD_SET((SOCKET)sock,&exst);
        DWORD arg = 1;
        ioctlsocket(sock,FIONBIO,&arg);
        
        int r = connect(sock,(sockaddr*)&addr,sizeof(addr));
        if( r< 0){
            if( WSAGetLastError() != WSAEWOULDBLOCK){
                closesocket(sock);
                return -1;
            }
            struct timeval timeout;timeout.tv_sec = tmo;timeout.tv_usec = 0;
            int status = select(sock + 1,NULL,&wrst,&exst,&timeout);
            if( status <= 0){
                closesocket(sock);
                return -1;
            }
            if(FD_ISSET(sock,&exst)){
                closesocket(sock);
                return -1;
            }
            
        }
        ///
    #else
        
        fcntl(sock,F_SETFL,fcntl(sock,F_GETFL) | O_NONBLOCK);
        unsigned long arg = 1;
        ioctl(sock,FIONBIO,&arg);

        int r = connect(sock,(sockaddr*)&addr,sizeof(addr));
        if( r < 0){
            if( errno != EINPROGRESS){
                closesocket(sock);
                return -1;
            }
            ///
            pollfd ufds;ufds.fd = sock;
            ufds.events = POLLIN|POLLOUT; ufds.revents = 0;
            int status = poll(&ufds,1,tmo * 1000 );
            if( status <= 0 ){
                closesocket(sock);
                return -1;
            }
            if( ufds.revents & POLLERR || ufds.revents&POLLHUP){
                closesocket(sock);
                return -1;
            }
        }
        
    #endif
        ///
        return sock;
    }

    /
    inline static
    int smtp_cmd(int fd,const char* rep_code,const char* format,...)
    {
        char buf[BUF_SIZE];
        va_list valist;
        va_start(valist,format);
        vsprintf(buf,format,valist);
        va_end(valist);
        int r = write_complete(fd,buf,strlen(buf), 15 );
        if( r < 0){
            printf("write socket data [%s] error.\n",buf);
            return -1;
        }
        r = read_line(fd,buf,BUF_SIZE,15);
        if( r < 0){
            printf("read socket data error.\n");
            return -1;
        }
        if( strncmp(buf,rep_code,strlen(rep_code)) != 0){
            printf("command not right <%s> [%s]\n",rep_code,buf);
            return -2;
        }
        return 0;
    }
    int smtp_login(const char* str_ip,int port,
                   const char* user,const char* passwd)
    {
        int fd = -1;
        fd = simple_connect(str_ip,port, 30 );
        if( fd < 0){
            printf("connect [%s] error.\n",str_ip);
            return -1;
        }
        char buf[BUF_SIZE];buf[0]='\0';
        int r= read_line(fd,buf,BUF_SIZE,15 );
        if( r < 0 || strncmp(buf,"220",3) != 0){
            closesocket(fd);
            printf("Get SMTP Server[%s] error.\n",buf);
            return -1;
        }
        if( smtp_cmd(fd,"250","EHLO localhost\r\n" ) < 0){ //EHLO 扩展smtp
    //        closesocket(fd);
            printf("Send EHLO error.\n");
    //        return -1;
        }
        // auth login ,if nessary.
        char tmp_buf[512];int len;
        if( (r = smtp_cmd(fd,"334","AUTH LOGIN\r\n")) == 0 ){
            
            if( smtp_cmd(fd,"334","%s\r\n",base64_encode((const unsigned char*)user,strlen(user),tmp_buf,&len)) < 0){
                closesocket( fd);
                printf("auth login fail.\n");
                return -1;
            }
            if( smtp_cmd(fd,"235","%s\r\n",base64_encode((const unsigned char*)passwd,strlen(passwd),tmp_buf,&len)) < 0){
                closesocket(fd);
                printf("auth login fail.\n");
                return -1;
            }
        }
        if( r== -1){
            closesocket(fd);
            return -1;
        }
        /
        return fd;
    }
    void smtp_bye(int fd)
    {
        if( fd < 0)
            return;
        ///
        smtp_cmd(fd,"221","QUIT\r\n");
        ///
        closesocket(fd);
    }

    const static char* boundary="---$#367.babyxiu2007.&##3901--6#";
    ///

    int smtp_sendmail(int fd,struct mail_t* mail)
    {
        //
        if(!mail || mail->mail_from.empty() ||
            mail->rcpt_to.size() == 0)
        {
            mail->err_msg ="invalid paramter.";
            return -1;
        }
        ///
        int r ;
        string str;
        str.reserve(4096);
        str = "MAIL FROM: <"+mail->mail_from+">\r\n";
        r = smtp_cmd(fd,"250",str.c_str());
        if( r < 0){
            mail->err_msg = "send CMD err: "+str;
            return -1;
        }
        string all_to;all_to.reserve(512);
        list<string>::iterator it;
        for( it = mail->rcpt_to.begin(); it != mail->rcpt_to.end(); ++it){
             str = "RCPT TO: <"+ *it +">\r\n";
             r = smtp_cmd(fd,"250",str.c_str());
             if( r < 0){
        //         return -1;
             }
             ///
             if(all_to.empty())
                 all_to +=*it;
             else
                 all_to +=","+*it;
             /
        }
        r = smtp_cmd(fd,"354","DATA\r\n");
        if( r < 0){
            mail->err_msg = "send CMD DATA err";
            return -1;
        }
        ///
    #define SEND_STR(str) r = write_complete(fd,(char*)str.c_str(),str.length(), 30 );\
                          if( r < 0){printf("write socket data error.\n");return -1;}
        ///header
        char date_str[100];time_t seconds=time(0);
        strftime(date_str, 100,
                 "%a, %d %b %y %H:%M:%S +0800",
                 localtime(&seconds));
        str  = "From: "+mail->mail_from+"\r\n";
        str += "To: " + all_to +"\r\n";
        str += "Subject: " + mail->subject + "\r\n";
        str += "Date: " ; str+=date_str ;str+= "\r\n";
        str += "X-Mailer: babyxiu2007\r\n";
        str += "X-Priority: 3\r\n";//普通优先级别
        str += "MIME-Version: 1.0\r\n";
        str += "Content-type: multipart/mixed; boundary=\"" ;
        str += boundary ; str += "\"\r\n";
        str += "\r\n";
        //
        SEND_STR(str);
        ///sub header
        str  = string("--") + boundary + "\r\n";
        str += "Content-Type: text/html; charset=GB2312\r\n";
        str += "Content-Transfer-Encoding: 8bit\r\n";
        str += "\r\n";

        SEND_STR(str);
        
        SEND_STR(mail->body);

        str = "\r\n\r\n";
        SEND_STR(str);
        ///attachments
        for( it = mail->attachments.begin(); it != mail->attachments.end(); ++it){
            const char* name = strrchr(it->c_str(),'/');
            if(!name)name = strrchr(it->c_str(),'\\');
            if(!name) name = it->c_str();else name +=1;
            str  = string("--") + boundary + "\r\n";
            str += "Content-Type: application/octet-stream; name=";
            str += name; str += "\r\n";
            
            str += "Content-Disposition: attachment; filename=";
            str += name; str += "\r\n";

            str += "Content-Transfer-Encoding: base64\r\n";
            str += "\r\n";
            ///
            char base64[ 512 ];
            unsigned char file[ 78 ];
            FILE* fp = fopen(it->c_str(),"rb");
            if(!fp)
                continue;
            r = write_complete(fd,(char*)str.c_str(),str.length(),20 );
            if( r < 0){
                fclose(fp);printf("write socket data error\n");
                mail->err_msg = "write socket data error.";
                return -1;
            }
            //
            while( !feof(fp) && !ferror(fp) ){
                r = fread(file,1, 78 ,fp);
                if( r <= 0 )
                    break;
                int len;
                base64_encode(file,r,base64,&len);strcpy(base64+len,"\r\n");
                r = write_complete(fd,base64,len +1,15);
                if( r< 0){
                    fclose(fp);printf("write socket data error\n");
                    mail->err_msg = "write socket data error.";
                    return -1;
                }
                ///
            }
            fclose(fp);
            ///
            str = "\r\n\r\n";
            SEND_STR( str );
        }
        /end
        str = "\r\n--";
        str += boundary ;
        str +="--\r\n.\r\n";

        r = smtp_cmd(fd,"250",str.c_str());
        if ( r< 0){
            mail->err_msg = "mail end error.";
            return  -1;
        }
        //
        return 0;
    }
    //

    int smtp_sendmail(struct mailex_t* mailex)
    {
        int fd =-1;
        if(!mailex)
            return -1;
        fd = smtp_login( mailex->mail_svrip.c_str(),mailex->mail_svrport,
            mailex->user.c_str(),mailex->passwd.c_str());
        if( fd < 0){
            mailex->err_msg = "login smtp error: " + mailex->mail_svrip + " - "+ mailex->user;
            return -1;
        }
        struct mail_t mail;
        mail.attachments = mailex->attachments;
        mail.body = mailex->body;
        mail.mail_from = mailex->mail_from;
        mail.rcpt_to = mailex->rcpt_to;
        mail.subject = mailex->subject;

        int r = smtp_sendmail(fd,&mail);

        smtp_bye( fd);

        mailex->err_msg = mail.err_msg;
        ///
        return r;
    }
    POP3

    int pop3_login(const char* str_ip,int port,
                   const char* user,const char* passwd)
    {
        int fd = -1;
        fd = simple_connect(str_ip,port,15);
        if( fd < 0){
            printf("Can't Connect [%s].\n",str_ip);
            return -1;
        }
        char buf[BUF_SIZE];
        int r = read_line( fd,buf,BUF_SIZE, 15);
        if( r < 0 || strncmp(buf,"+OK",3) != 0 )
            goto err;
        sprintf(buf,"USER %s\r\n",user);
        r = write_complete(fd,buf,strlen(buf),15);
        r = read_line(fd,buf,BUF_SIZE,15);
        if( r < 0 || strncmp(buf,"+OK",3) != 0)
            goto err;

        sprintf(buf,"PASS %s\r\n",passwd);
        r = write_complete(fd,buf,strlen(buf),15);
        r = read_line(fd,buf,BUF_SIZE,15);
        if( r < 0 || strncmp(buf,"+OK",3) != 0)
            goto err;

        return fd;
    err:
        closesocket( fd );
        return -1;
    }
    void pop3_bye(int fd)
    {
        char buf[1024];
        sprintf(buf,"QUIT \r\n");
        write_complete(fd,buf,strlen(buf),10);
        read_line(fd,buf,1024,15);
        ///
        closesocket(fd);
    }
    static
    int pop3_mail_count(int fd)
    {
        char buf[BUF_SIZE];
        sprintf(buf,"LIST \r\n");
        write_complete(fd,buf,strlen(buf),10);
        int off=0;
        do{
            int r = block_read(fd,buf+off, BUF_SIZE-off );
            if( r < 0){
                return 0;
            }
            off += r;
            if( off > BUF_SIZE -2 ){
                buf[off] ='\0';
                break;
            }
            buf[off] ='\0';
            if( strstr(buf,"\r\n.\r\n") )
                break;
        }while(true);
        int num =0;
        const char*p=strstr(buf,"\r\n");
        if(!p)return 0;
        while( p= strstr(p+2,"\r\n") ){
            num ++;
        }
        if( num > 0)--num;
        return num;
    }
    /
    static bool ilegal_char(char c)
    {
        const char* ilg ="\"*?<>:\\/|";
        if(strchr(ilg,c))
            return true;

        return false;
    }
    static void getSubject(char* buf,char* subject)
    {
        char tmp[300];memset(tmp,0,sizeof(tmp));
        ///
        const char* p=strstr(buf,"Subject:");
        if(!p){
            strcpy(subject,"Unknow-Title");return;
        }
        const char *sub=p+9;
        int i=0;
        for( i=0;sub[i];++i){
            char c=sub[i];
            if( c =='\r' || c == '\n')
                break;
            tmp[i] = c;
        //    if( ilegal_char( c ) )tmp[i]='#';
        }
        tmp[i] = '\0';
        char* hdr=tmp;
        i = 0;
        strcpy(subject,tmp);
        do{
            char* hh=strstr(hdr,"=?");
            if(!hh){
                strcpy(subject + i,hdr);
                break;
            }
            strncpy(subject + i,hdr,hh-hdr);
            i+=hh-hdr;
            ///
            char* tt=strstr(hh+2,"?=");
            if(!tt){
                strcpy(subject+i,hdr);
                break;
            }
            *tt = 0;
            char* pp=strchr(hh+2,'?');
            if(pp){
                pp=strchr(pp+1,'?');
            }
            if(!pp)pp=hh+2;
            else pp+=1;
            char buf[300];
            int n=base64_decode(pp,strlen(pp),buf);
            if( n < 0){
                strcpy(subject+i,pp); i+= strlen(pp);
            }
            else{
                strncpy(subject+i,buf,n); i+=n;
            }
            ///
            hdr = (char*)tt+2;
        }while(true);
        ///
        if( i!=0 )
            subject[i] = '\0';
        ///
        for(i=0;i<strlen(subject);++i){
            if(ilegal_char(subject[i])) subject[i] = '$';
        }

    }
    static void getDate(char* buf,char* date)
    {
        const char* p=strstr(buf,"Date:");
        if(!p){
            time_t t=time(0);strcpy(date,asctime(localtime(&t)));
            int len=strlen(date);
            if( len>= 0 && date[len-1]=='\n') date[len-1]=0;
            for(int i=0;i<strlen(date);++i)
                if(ilegal_char(date[i])) date[i] = '-';
            
            return ;
        }
        const char *d = p+6;
        int i=0;
        for( i=0;d[i];++i){
            if(d[i]=='\r' || d[i]=='\n')
                break;
            date[i] = d[i];
            if( ilegal_char( d[i] ) )date[i] = '-';
        }
        date[i] = '\0';
    }
    static void getFrom(char* buf,char* from)
    {
    }
    static void getBoundary(char* buf,char* boundary)
    {
        strcpy(boundary,"--");
        //
        const char* p=strstr(buf,"Content-Type:");
        if(!p){
            return;
        }
        const char dd[]="multipart/";
        if(strncasecmp(p+14,dd,sizeof(dd)-1 ) != 0){
            return;
        }
        const char bound[] ="boundary=";
        const char* bb=strchr(p+14+sizeof(dd),'=');
        if(!bb|| strncasecmp(bb-sizeof(bound)+2,bound,sizeof(bound)-1) != 0 ){
            return ;
        }
        bb += 1;while(*bb && (*bb=='\"'||*bb=='\t'||*bb==' '))bb++;
        int i=0;
        for( i=0;bb[i]&&bb[i]!='\"'&&bb[i]!='\r';++i){
            boundary[2+i]=bb[i];
        }
        boundary[i+2]='\0';
    }

    static char* recv_mail(int fd,int* psize)
    {
        char* buf=NULL;
        int size = 1024*512;
        buf = (char*)malloc(size + 1 );
        int read_sz = 0;
        while(true){
            int r = block_read(fd,buf + read_sz ,size-read_sz,10 );
            if( r < 0){
                free(buf);
                printf("read socket data error.\n");
                return NULL;
            }
            read_sz += r;
            buf[read_sz] = '\0';
            if( strstr(buf,"\r\n.\r\n") )
                break;
            if( read_sz >= size){
                size=size*2;
                char* bb=(char*)realloc(buf,size);
                buf = bb;
            }
            /
        }
        
        *psize = read_sz;
        return buf;
    }
    int pop3_getmails(int fd,const char* path,bool del_svrmail)
    {
        int num = pop3_mail_count(fd);
        if( num == 0){
            printf("No Mail.\n");
            return -1;
        }
        char buf[BUF_SIZE + 2 ];
        
        ///
        int off=0;
        int l_recvlen = 0;int l_len=0;char* lptr = buf;
        //

        
        for( int mail_i=1;mail_i<=num;++mail_i){
            string dir = path;dir += "/";
            //
            sprintf(buf,"RETR %d\r\n",mail_i);
            int r = write_complete(fd,buf,strlen(buf),10);
            recv mail
            printf("receving the [%d] mail - ",mail_i);

            int size;
            char* buffer = recv_mail(fd,&size);
            if(!buffer){
                return -1;
            }
            ///
            char subject[300]; getSubject(buffer,subject);
            char date[200];    getDate(buffer,date);
            char boundary[512]; getBoundary(buffer,boundary);
            
            printf("Subject: %s\n",subject);
            
            dir += subject;dir +=" - ";dir += date; dir +=".eml";
            FILE* fp = fopen(dir.c_str(),"wb");
            if(fp){
                fwrite(buffer,1,size,fp);
                fclose(fp);
            }else{
                printf("can't create [%s] for write mail.\n",dir.c_str());
                free(buffer);
                continue;
            }
            
            ///
            free(buffer);
            ///del mail
            if(del_svrmail){
                sprintf(buf,"DELE %d\r\n",mail_i);
                int r = write_complete(fd,buf,strlen(buf),10);
                r = read_line(fd,buf,BUF_SIZE,30);
                if( r < 0)
                    return -1;
                if(strncmp(buf,"+OK",3) != 0){
                    printf("Del the [%d] mail [%s] fail!\n",mail_i,subject);
                }else{
                    printf("Del the [%d] mail [%s] OK!\n",mail_i,subject);
                }
            }
        }
        return 0;
    }

    ///

    #if 0   //test

    //#define POP3
    #define SMTP

    int main(int argc,char** argv)
    {
        if(argc != 5 ){
            printf("wrong parameter!\n");
    //        return 0;
        }

    #ifdef WIN32
        WSADATA data;WSAStartup(0x0202,&data);
    #endif

    #ifdef POP3
        int fd = pop3_login(argv[1],110,argv[2],argv[3]);
        if( fd < 0){
            printf("can't login [%s]\n",argv[1]);
            return 0;
        }
        pop3_getmails(fd,argv[4] ,false );
        pop3_bye(fd);
    #endif //POP3

        
    #ifdef SMTP
        mailex_t mail;

        mail.mail_svrip = "mail.test.com";
        mail.mail_svrport = 25;
        mail.user = "fanxiushu"; mail.passwd ;//"1234506";

        mail.mail_from="fanxiushu@test.com";

        mail.rcpt_to.push_back("fanxiushu@test.com");


        mail.subject = "pig,范,猪头";
        mail.body ="this test mail";

        mail.attachments.push_back("c:\\1.jpg");
        mail.attachments.push_back("E:\\Fxs\\file_service\\exports\\file_service.exe");

        int r= smtp_sendmail(&mail);
        if( r < 0){
            printf("send mail fail.\n");
        }
    #endif //SMTP
        /
        ///
        return 0;
    }

    #endif

    ///


    展开全文
  • 用户接收邮件是通过该POP3 协议完成的 POP3通信方式与SMTP一样 使用标准命令与服务器进行数据交换 POP3协议还规定标准端口为110号端口 命令如表 命令 意义 QUIT 终止与服务器会话 STAT 提供信箱大小 ...
  • Pop3例子程序

    2012-10-10 16:22:35
    Pop3例子程序 C++
  • POP3会话过程与SMTP一样 必须首先连接服务器成功以后才能进行相关操作 连接服务器 OK USER lymlrl //验证用户名 OK PASS lwlwlw //验证密码 OK retr 1 //请求第一封邮件内容 OK 服务器将第一封邮件内容发送...
  • 邮件库 IMAP/STMP/POP3 Email Library C/C++

    热门讨论 2009-09-14 07:49:27
    一个支持IMAP、STMP、POP3的邮件库,可以在VC下使用!安装包里有程序库、例子和使用手册。
  • pop3

    2008-01-17 22:08:25
    pop3协议封装类pop3协议封装类pop3协议封装类
  • POP3邮件接收

    2017-12-14 22:56:47
    c++语言编写pop3邮件接收程序,用户图形化界面,清晰利于理解
  • 会话过程是一个交互式问答过程 用编程方法来实现 ... //省略部分代码 CString user="user lymlrl\r\n"; //构造命令信息 CString pass="pass lwlwlw\r\n"; CString retr="retr l\r\n";... char sendmsg[]...
  • POP是邮局协议(Post Office Protocol),使TCP/IP协议族中的一员,它是由RFC 1939...最新版本是POP3,全名是"Post Office Protocol - version 3". 一.POP的命令: 1.user username ------向服务器发送用户名; 2.pass passw
  • SMTP协议和POP3协议就不详细阐述了 ,网上一搜索会有一大把给你解释的。 下面直接贴代码: 首先写一个class Sock类,这个类的功能主要是创建套接字(即int sock),用套接字來连接邮箱服务器。类里面还带有send...
  • smtp pop3

    2011-07-16 23:05:25
    关于SMTP与POP3协议的研究与发现,供需要者阅读
  • POP3-服务器 基本的C ++ POP3服务器。 依赖关系和安装 为了构建项目,您将需要安装一些依赖项,这些依赖项可以在这里找到( 。 完成此操作后,您可以运行make并运行pop3server 。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,330
精华内容 3,332
关键字:

c++pop3

c++ 订阅