VC下使用JMail实现邮件收发

来源:互联网 发布:淘宝修容棒排行榜 编辑:程序博客网 时间:2024/05/19 00:09

最近需要写一个邮件发送与接收的模块。C++写这种东西还是比较纠结的,有以下几种办法:

1. 手写SMTP、POP3再加Winsock:太繁琐,写完后健壮性、扩展性都没法保证,写着练习还可以,商业用途就不合适了。

2. 用MS的MAPI(包括SMAPI):需要Outlook之类的支持,稳定性差(尤其是smapi,都淘汰了),不易学习。

3. 用一些命令行的邮件客户端,再写个C++的壳子:没找到好用的,windows版的msmtp、febootimail都不给力啊。

4. 如果单纯收发文本邮件,用telnet与邮箱服务器进行交互:直接用window的telnet服务,没法在C++里进行交互啊(反正我不会)。

5.用一些邮件组件,例如JMail:原本用了个免费版的JMail,啥功能都没有,就知道报异常。好在我们天朝上国盗版横行,搜了个专业版,瞬间闪亮。 给个链接:http://www.rayfile.com/files/c0554728-6bbe-11e0-9cb8-0015c55db73d/

 

////  邮件接收代码

bool recvMail()
{
    jmail::IMessagesPtr pMsgs;  // 邮件集合
    jmail::IMessagePtr pMsg;
    jmail::IPOP3Ptr pPOP3("JMail.POP3");
    pPOP3->Timeout = 30;  // 30S超时,默认为120s
    
    try
    {
        pPOP3->Connect("test_name","test_pass","pop.sina.com",110); // 连接pop服务器  端口110
        pMsgs = pPOP3->Messages;
        long mailNum = pMsgs->Count - 1; // 已下载邮件实际个数(0是未用的,故-1)
        // 遍历每封邮件
        for (long i=1;  i<=mailNum;  i++)
        {
            pMsg = pMsgs->Item[i];  // 提取第I封信件
            _bstr_t sender = pMsg->From;          // 发信人
            _bstr_t subject = pMsg->Subject;      // 发信主题
            _bstr_t body = pMsg->Body;            // 发信内容
            cout<<"Email No."<<i<<endl              // 输出邮件正文
                <<"Sender: "<<((char*)sender!=NULL ? sender : "NULL")<<endl
                <<"Subject: "<<((char*)subject!=NULL ? subject : "NULL")<<endl
                <<"Body: "<<((char*)body!=NULL ? body : "NULL")<<endl;
            jmail::IAttachmentsPtr atts = pMsg->Attachments; // 获取附件列表
            long attNum = atts->Count;
            cout<<"Attachment Num: "<<attNum<<endl;          // 输出并下载所有附件
            for(long j=0; j<attNum; j++)
            {
               cout<<"Att"<<j<<"   Name: "<<atts->Item[j]->Name<<" Size: "<<atts->Item[j]->Size<<endl;
               atts->Item[j]->SaveToFile(atts->Item[j]->Name); // 与已有文件同名会引起异常
            }
            cout<<"\n\n";
            pMsg.Release();    
        }
        pMsgs.Release();      // 释放资源、断开连接
        pPOP3->Disconnect();
    }
    catch(_com_error e)
    {
        cout<<"Error Info: "<<e.ErrorMessage()<<"\nError Description: "<<e.Description()<<"\n";
        return false;
    }
    return true;
}
////  邮件发送代码
bool sendMail()
{
    /// SMTP服务器设置
    const char* smtpServer = "smtp.sina.com";       // smpt服务器
    const char* username = "test_name";         // 用户名
    const char* password = "test_pass";               // 密码
    /// 发信内容设置
    const char* sender = "test_name@sina.com";        // 发件邮箱,不能虚假填写
    const char* senderName = "BlueStar";                // 显示的发件人名称,随意
    const char* subject = "A test mail from bluestar";  // 邮件主题
    const char* body = "The content of this mail\n";    // 邮件正文
    const char* attachFiles[] = {"atts\\p1.jpg", "atts\\p2.jpg"};   // 附件列表,相对、绝对路径 both ok
    /// 收信端设置
    const char* recipients[] = {"recver1@163.com", "recver2@yeah.net", "recver3@yeah.net"};  // 收件邮箱列表
    const char* recipientNames[] = {"rock", "bluestar", "whoown"};                        // 收信人名称
    
    /// 初始化JMail中Message对象
    jmail::IMessagePtr pMsg("JMail.message");
    
    pMsg->Priority = 3;          // 优先级设置,1-5逐次降低, 3为中级
    pMsg->Charset = "GB2312";    // 编码方式设置, 默认是iso-8859-1
    
    pMsg->From = sender;         // 发件人
    pMsg->FromName = senderName; // 发件人姓名
    int sz = sizeof(recipients) / sizeof(recipients[0]), i;  // 添加所有收件人
    for(i=0; i<sz; i++)
    {
        pMsg->AddRecipient(recipients[i], recipientNames[i], "");
    }
    pMsg->Subject = subject;     // 主题
    pMsg->Body = body;           // 正文
    pMsg->AppendText("You can add any words when you want\n");    // 可再添加一些正文
    sz = sizeof(attachFiles) / sizeof(attachFiles[0]);       // 添加所有附件
    for(i=0; i<sz; i++)
    {
        pMsg->AddAttachment(attachFiles[i], VARIANT_FALSE, ""); // 参数3为文件类型
    }
    
    /// 发送邮件
    try
    {
        pMsg->Send("test_name:test_pass@smtp.sina.com", VARIANT_FALSE);
    }
    catch(_com_error e)
    {
        cout<<"Error Info: "<<e.ErrorMessage()<<"\nError Description: "<<e.Description()<<"\n";
        return false;
    }
    return true;
}

 

感谢几个关于JMail的博客地址:

http://www.vckbase.com/document/viewdoc/?id=684

http://tech.ddvip.com/2006-04/11440901403238.html

http://xiaoyueweiguang.blog.163.com/blog/static/1172675562011020105840807/

JMail的官方文档链接:

http://www.dimac.net/default2.asp?M=Products/MenuCOM.asp&P=Products/w3JMail/start.htm


一篇关于多线程下使用JMail 的帖子:

http://topic.csdn.net/u/20081006/10/13a5cee3-c7a6-4aae-9aa3-8d6ca285bd61.html

简单而言:CoInitialize(NULL)和CoUninitialize() 的作用域是基于线程的,所以必须在每个线程中都作COM初始化。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 uplay下载游戏速度0k怎么办 缓刑期间被别人打成轻伤怎么办 缓刑期间被别人打了怎么办 有缓刑被别人打怎么办 检察院不予立案怎么办公安局取保 监外执行过了又犯罪怎么办 监视居住期间再次犯罪怎么办 前妻有贷款跑了怎么办 未成年犯有缓刑罪继续犯罪怎么办 英朗出现检修esc怎么办 照相时奖状拿反了怎么办 wps文档加密后忘记密码怎么办 wps表格文件密码忘记了怎么办 wps表格密码忘记了怎么办 发布的文案缩成一行怎么办 创维电视都是VIP怎么办 挂电视距离太远怎么办 电视离沙发太近怎么办 苹果6更新11.1卡怎么办 苹果升级变卡了怎么办 迅雷被资源举报无法加速怎么办 迅雷的敏感资源无法加速怎么办 迅雷下载敏感资源无法加速怎么办 换手机微信账户怎么办 拉链拉不合没有蜡怎么办 长杆烟斗头松动怎么办? 大王卡没流量了怎么办 晚上电视想看野外生存怎么办 假离婚后真离婚怎么办 苹果手机在车上不能充电怎么办 遥控钥匙打不开车门怎么办 苹果访问限制密码忘记了怎么办 苹果手机忘记访问限制密码怎么办 苹果忘记访问限制密码怎么办 苹果限制访问密码忘了怎么办 东奥会计书盗版怎么办 合同封印少盖一页怎么办 玩单机游戏屏幕输入不支持怎么办 汽车不小心陷进泥潭怎么办 招商银行信用卡激活电话换了怎么办 冲鼻子是耳朵进水了怎么办