CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

邮件特快专递怎么实现?

楼主yy2001()2005-04-03 22:06:37 在 C++ Builder / 基础类 提问

我看到资料用IdDNSResolver可以实现,但例子都是DELPHI的,没太看懂,那位大侠能给个CBUILDER的,多谢了! 问题点数:100、回复次数:34Top

1 楼3996906(我只是建议,不提供最后的解决方法)回复于 2005-04-04 09:24:24 得分 0

??没听过?delphi的代码哪儿找?是什么意思?Top

2 楼yy2001()回复于 2005-04-04 09:35:33 得分 0

http://www.chinaaspx.com/club/topic_11_339.htmTop

3 楼constantine(飘遥的安吉儿)回复于 2005-04-04 09:50:45 得分 0

听过,没有发成功过  
  上面的代码编译不过无法改,太多错误了,  
  可能是我用的indy控件版本比较高,所以很多东西都没有了Top

4 楼yy2001()回复于 2005-04-04 09:54:32 得分 0

据说他的INDY版本是6的,太低了。  
  IdDNSResolver怎么用呢?我看了INDY9中的例子,也没太看懂。Top

5 楼constantine(飘遥的安吉儿)回复于 2005-04-04 14:19:23 得分 30

DNS->ClearVars();  
  DNS->Host   ="202.101.98.54";     //设定DNS   服务器的主机  
  DNS->DNSQDList->Clear();  
   
  DNS->DNSHeader->Qr   =   false;  
  DNS->DNSHeader->Opcode   =   cResQuery;  
  DNS->DNSHeader->RD   =   true;  
   
  DNS->DNSHeader->QDCount   =   1;  
  TQuestionItem   *   item   =   DNS->DNSQDList->Add();  
  item->QName   =   AQName;     //要查询的域名,也就是email的‘@’后面部分了  
  item->QType   =   cMX;  
  item->QClass   =   cIN;  
  DNS->ResolveDNS();  
  另外:  
  IdSMTP->host=DNS->DNSAnList->Items[0]->RData.MX.Exchange;  
  其他的应该没有什么问题了吧Top

6 楼yy2001()回复于 2005-04-04 15:32:01 得分 0

您的代码中INDY是几啊?我用的是9,ClearVars,DNSQDList等都没有啊?  
   
  还有个问题:  
  AQName;     //要查询的域名,也就是email的‘@’后面部分了  
  是我用来发邮件的邮箱的域名还有目的邮箱的域名啊?Top

7 楼constantine(飘遥的安吉儿)回复于 2005-04-04 15:56:11 得分 0

bcb6自带的,应该是8  
  是我用来发邮件的邮箱的域名还有目的邮箱的域名啊?  
  目的mail的Top

8 楼3996906(我只是建议,不提供最后的解决方法)回复于 2005-04-04 17:22:04 得分 50

晕,原来就是这个,这个说过了,smtp服务器能发现了屏蔽你的  
   
  //---------------------------------------------------------------------------  
   
  #include   <vcl.h>  
  #pragma   hdrstop  
   
  #include   "_Smtp.h"  
  //---------------------------------------------------------------------------  
  #pragma   package(smart_init)  
  #pragma   resource   "*.dfm"  
  TDataModule2   *DataModule2;  
  //---------------------------------------------------------------------------  
  __fastcall   TDataModule2::TDataModule2(TComponent*   Owner)  
                  :   TDataModule(Owner)  
  {  
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TDataModule2::GetToAddIP(AnsiString   dns)  
  {  
                  //TODO:   Add   your   source   code   here  
                  DNS->ClearVars();   //清除前一次查询所返回的信息  
                  DNS->Host   =   "202.106.0.20";     //设定DNS服务器的主机  
                  DNS->DNSQDList->Clear();     //消空上次查询信息  
                  //下面开始构造需要向服务器发送的查询信息  
                  DNS->DNSHeader->Qr   =   false;   //false表示这是一个查询请求  
                  DNS->DNSHeader->Opcode   =   cResQuery;   //表示这是一个标准模式的查询  
                  DNS->DNSHeader->RD   =   true;     //表示可以递归查询,即这个DNS服务器没查到,则自动跳到下一个服务器查询  
                  DNS->DNSHeader->QDCount   =   1;     //指出查询的数量  
                  TQuestionItem   *   item   =   DNS->DNSQDList->Add();  
                  item->QName   =   dns;     //欲查询的域名  
                  item->QType   =   cMX;     //表示查询一个邮件交换记录  
                  item->QClass   =   cIN;   //表示查询用于Internet  
                  DNS->ResolveDNS();     //向服务器发出查询请求  
  }  
   
  void   __fastcall   TDataModule2::SendMail(AnsiString   ToMailAddress,AnsiString   Text)  
  {  
                  //TODO:   Add   your   source   code   here  
                  try{  
                                  int   pos   =   ToMailAddress.Pos("@");  
                                  AnsiString   ToName;  
                                  ToName   =   ToMailAddress.SubString(0,pos   -   1);  
   
                                  //下面根据用户信息,填充欲发送的邮件的信息体。  
                                  AnsiString   strBody=   Text;  
   
                                  MSG->Body->Text   =   strBody   ;   //邮件正文  
                                  AnsiString     temp;  
   
                                  temp   =   "Form@Address.com";  
                                  MSG->From->Address   =   temp.c_str();     //发信人地址  
                                  MSG->Recipients->EMailAddresses   =   ToMailAddress.c_str();     //收信人地址  
   
                                  MSG->Subject   =   "Subject";   //主题  
                                  this->GetToAddIP(ToMailAddress.SubString(pos   +   1   ,   ToMailAddress.Length()   -   pos));     //通过对方邮件地址查询对方邮件服务器主机  
                                  SMTP->Host   =   DNS->DNSAnList->Items[0]->RData.MX.Exchange;   //设定主机地址为对方邮件服务器的主机。注意,返回的是一个列表,表示有多个主机,这里取第一个主机  
                                  SMTP->Connect();  
                                  try{  
                                                  SMTP->Send(MSG);     //发送邮件  
                                  }  
                                  __finally{  
                                                  SMTP->Disconnect();  
                                  }  
                  }  
                  catch(...)  
                  {  
                  }  
  }Top

9 楼3996906(我只是建议,不提供最后的解决方法)回复于 2005-04-04 17:23:37 得分 0

//---------------------------------------------------------------------------  
   
  #ifndef   _SmtpH  
  #define   _SmtpH  
  //---------------------------------------------------------------------------  
  #include   <Classes.hpp>  
  #include   <Controls.hpp>  
  #include   <StdCtrls.hpp>  
  #include   <Forms.hpp>  
  #include   <IdBaseComponent.hpp>  
  #include   <IdComponent.hpp>  
  #include   <IdDNSResolver.hpp>  
  #include   <IdMessageClient.hpp>  
  #include   <IdSMTP.hpp>  
  #include   <IdTCPClient.hpp>  
  #include   <IdTCPConnection.hpp>  
  #include   <IdUDPBase.hpp>  
  #include   <IdUDPClient.hpp>  
  #include   <IdMessage.hpp>  
  //---------------------------------------------------------------------------  
  class   TDataModule2   :   public   TDataModule  
  {  
  __published: //   IDE-managed   Components  
                  TIdDNSResolver   *DNS;  
                  TIdSMTP   *SMTP;  
                  TIdMessage   *MSG;  
  private:  
                  void   __fastcall   GetToAddIP(AnsiString   dns); //   User   declarations  
  public: //   User   declarations  
                  __fastcall   TDataModule2(TComponent*   Owner);  
                  void   __fastcall   SendMail(AnsiString   ToMailAddress,AnsiString   Text);  
  };  
  //---------------------------------------------------------------------------  
  extern   PACKAGE   TDataModule2   *DataModule2;  
  //---------------------------------------------------------------------------  
  #endif  
   
  是说这个吗?我这个用的bcb自己带的id8,当时做到dll里面去了,所以是个TDataModuleTop

10 楼NetSpider9804040(网络蛛蛛)回复于 2005-04-04 17:42:00 得分 0

顺道看看,凑个热闹!Top

11 楼Friecin(雪客)回复于 2005-04-04 18:09:43 得分 20

 
  怎样使用C++   Builder   6   制作邮件特快专递程序  
  谢煜波  
  网名:潇寒  
  OICQ:13916830  
  Email:   xiaohanemail@163.com  
  Email:   xieyuboemail@163.com  
  http://soft.binghua.com  
  本文为原创文,转载请注明出处、作者。若对文章内容有什么疑问,或要做改动,请与作者联系。未经许可,请勿用于商业用途。  
   
          说起邮件特快专递,大家也许都不默生,比如大名鼎鼎的Foxmail就自带有这个特快专递程序,不过遗憾的是,它一次只能发一封邮件。其实大家很容易想到,如果做一个循环,是很容易实现特快专递的群发的,但为什么Foxmail没有做呢?这个我也不知道。不过,有了C++   Builder   6,我们要实现这个功能也是非常容易的。现在,我们就一起来看一下,怎样制作这样一个特快专递程序。  
          要制作这样一个特快专递程序,我们用到了C++   Builder   6   所带的最新的Internet访问套件--Indy套件,主要使用到了TIdDNSResolver、TIdMessage、TIdSMTP这三个控件。从名称中我们可能猜到,TIdDNSResolver用来获得DNS解析,TIdMessage用来组织所要传送的邮件信息,而TIdSMTP这个控件支持SMTP协议,我们使用它来传送邮件。  
          下面一步,我们构建界面,如下图所示:(其中TIdMessage位于控件栏Indy   Misc页面,其余两个组件位于Indy   Clients页面)  
     
  下面,我们开始编写代码,以实现功能(注意:为突出主要问题,笔者默让一切输入均合法,故未加正确校验。)下面是完整的代码,并有详细注  
  //---------------------------------------------------------------------------  
   
  #include   <vcl.h>  
  #pragma   hdrstop  
   
  #include   "Unit1.h"  
  //---------------------------------------------------------------------------  
  #pragma   package(smart_init)  
  #pragma   resource   "*.dfm"  
  TForm1   *Form1;  
  //---------------------------------------------------------------------------  
  __fastcall   TForm1::TForm1(TComponent*   Owner)  
      :   TForm(Owner)  
  {  
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TForm1::GetToAddIP(AnsiString   dns)  
  {  
      DNS->ClearVars();   //清除前一次查询所返回的信息  
      DNS->Host   =   "202.118.224.101";     //设定DNS服务器的主机  
   
      DNS->DNSQDList->Clear();     //消空上次查询信息  
   
      //下面开始构造需要向服务器发送的查询信息  
      DNS->DNSHeader->Qr   =   false;   //false表示这是一个查询请求  
      DNS->DNSHeader->Opcode   =   cResQuery;   //表示这是一个标准模式的查询  
      DNS->DNSHeader->RD   =   true;     //表示可以递归查询,即这个DNS服务器没查到,则自动跳到下一个服务器查询  
      DNS->DNSHeader->QDCount   =   1;     //指出查询的数量  
   
   
   
      TQuestionItem   *   item   =   DNS->DNSQDList->Add();  
      item->QName   =   dns;     //欲查询的域名  
      item->QType   =   cMX;     //表示查询一个邮件交换记录  
      item->QClass   =   cIN;   //表示查询用于Internet  
   
      DNS->ResolveDNS();     //向服务器发出查询请求  
  }  
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
      //下面根据用户信息,填充欲发送的邮件的信息体。  
      MSG->Body->Text   =   Memo1->Text   ;   //邮件正文  
      MSG->From->Address   =   FromAdd->Text   ;     //发信人地址  
      MSG->Recipients->EMailAddresses   =   ToAdd->Text;     //收信人地址  
      MSG->Subject   =   "冰花邮件特快专递   演示!";   //主题  
   
      int   pos   =   ToAdd->Text.Pos("@");  
      GetToAddIP(ToAdd->Text.SubString(pos   +   1   ,   ToAdd->Text.Length()   -   pos));     //通过对方邮件地址查询对方邮件服务器主机  
   
      SMTP->Host   =   DNS->DNSAnList->Items[0]->RData.MX.Exchange;   //设定主机地址为对方邮件服务器的主机。注意,返回的是一个列表,表示有多个主机,这里取第一个主机  
      SMTP->Connect();  
      try{  
          SMTP->Send(MSG);     //发送邮件  
      }  
      __finally{  
          SMTP->Disconnect();  
      }  
      ShowMessage("完成!");  
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TForm1::SMTPStatus(TObject   *axSender,  
              const   TIdStatus   axStatus,   const   AnsiString   asStatusText)  
  {  
      StatusBar->Panels->Items[0]->Text   =   asStatusText;      
  }  
  //---------------------------------------------------------------------------  
   
  上面的程序很简单,也就不多做解释了,下面另外谈点注意:  
  1.                 你取回来的邮件服务器可能有多个,它是一个列表,而且通过DNS->DNSAnList->Items[0]->RData.MX.Preference;你可以获得对应的服务器的优先级,这样你就可以选择优先级高,或者在一个服务器忙时,换用另一个服务器进行处理。这一点,好像Foxmail也没有这样做,因为小可有时用特快专递时发不出去,原因就在于对方服务器忙。  
  2.                 TIdMessage可以带有很多其它信息,如"抄送地址"、"暗送地址"、"回复地址"等,你可以读读帮助,以写出功能更强大的邮件特快专递程序!(呵呵,写好之后,别忘让小可用用啊!^_^)  
  3.                 通过类似的方式,你也可以写一般的发信程序,只是不再需要DNS解析了。  
   
  本程序在C++   Builder   6下调式通过,源程序大家可以去,http://mysnowwave.8u8.com/source/bh_fast_email_source_bcb6.rar下载。  
   
  Top

12 楼3996906(我只是建议,不提供最后的解决方法)回复于 2005-04-04 18:14:42 得分 0

哈哈,偶就是抄这个大侠的才做好的~~~~~~~~~~~~但是没想到叫特快专递Top

13 楼yy2001()回复于 2005-04-05 10:02:57 得分 0

多谢各位大侠的指点,我按你们的改了,用的INDY8,可以发送出去,但我发现发送几个后就报:  
  'Connection   Closed   Gracefully'  
  怎么回事呢?  
  Top

14 楼3996906(我只是建议,不提供最后的解决方法)回复于 2005-04-05 10:30:41 得分 0

咦~~~~~~~~~~~~~我怎么没这个问题呢?这个是谁报的呢?  
   
  跟附件什么,暗送什么,抄送什么有关系吗?Top

15 楼constantine(飘遥的安吉儿)回复于 2005-04-05 10:35:04 得分 0

呵呵,我发都发不出去,连接不上Top

16 楼yy2001()回复于 2005-04-05 10:35:22 得分 0

暗送,抄送都没有,就是一个收件人,不带附件的我也试了,也是这个错误。Top

17 楼constantine(飘遥的安吉儿)回复于 2005-04-05 10:45:38 得分 0

我晕,测试了一下,tom就可以,hotmial,sina这些都不能发Top

18 楼3996906(我只是建议,不提供最后的解决方法)回复于 2005-04-05 10:51:01 得分 0

hotmail的连outlook都不让,sina的给屏蔽了  
   
  163的可以,还有很多可以,yahoo好象不行~~~~~~~~~~~~  
   
  但是偶发为什么木错呢?~~~~~~~~~~~~~哭Top

19 楼yy2001()回复于 2005-04-05 10:55:07 得分 0

3996906(以后再说):  
  你的是单发还是群发啊?Top

20 楼3996906(我只是建议,不提供最后的解决方法)回复于 2005-04-05 11:20:13 得分 0

我可以连着发好些不出问题的,我发过10个的,用循环,用的也是单发Top

21 楼3996906(我只是建议,不提供最后的解决方法)回复于 2005-04-05 11:24:39 得分 0

for(int   i   =   ListView1->Items->Count   -1;i   >=   0;i--)  
                  {  
                                  Screen->Cursor   =crHourGlass;  
                  if(ListView1->Items->Item[i]->Checked)  
                                  {  
                                                  SendMail(ListView1->Items->Item[i]->SubItems->Strings[0],this->Edit1->Text.c_str());  
                                  }  
                                  Screen->Cursor   =     crDefault;  
                  }Top

22 楼yy2001()回复于 2005-04-05 12:13:26 得分 0

3996906(以后再说):  
  你的成功率高吗?我的很低啊?Top

23 楼yy2001()回复于 2005-04-05 12:27:32 得分 0

我试了一些,sina,hotmail,sohu,163.net这些都不行,我试的好象就163.com,126行,呵呵,那这有什么用啊?Top

24 楼constantine(飘遥的安吉儿)回复于 2005-04-05 12:28:23 得分 0

我用tom都可以,没有出现问题,每次都成功Top

25 楼constantine(飘遥的安吉儿)回复于 2005-04-05 12:32:28 得分 0

是没有什么用,不差这点时间,以前用foxmail也是这样Top

26 楼yy2001()回复于 2005-04-05 12:48:53 得分 0

哎,可我是想实现一个群发的功能,这也不行啊。Top

27 楼3996906(我只是建议,不提供最后的解决方法)回复于 2005-04-05 13:18:39 得分 0

我的大概能到50%,他们说这种方法20%就不错了,你这是发垃圾邮件Top

28 楼yy2001()回复于 2005-04-05 13:25:15 得分 0

不是,我在做毕业设计,想做个邮件群发的,给学校用。Top

29 楼constantine(飘遥的安吉儿)回复于 2005-04-05 13:35:20 得分 0

群发:  
  在你另一个贴,不是给了你一个参考代码了吗,delphi的,  
  给学校用:现在不是有这样的软件吗!Top

30 楼yy2001()回复于 2005-04-05 13:49:08 得分 0

那个下不了啊。  
  呵呵,要学生自己做的,好的话学校留用。Top

31 楼3996906(我只是建议,不提供最后的解决方法)回复于 2005-04-05 14:33:39 得分 0

这个是最好的方法了,但是是垃圾邮件的原理,所以你想清楚了Top

32 楼constantine(飘遥的安吉儿)回复于 2005-04-05 15:20:39 得分 0

盒子的东西一般都可以下的,我都下过Top

33 楼yy2001()回复于 2005-04-05 20:58:28 得分 0

是说DELPHI盒子的是垃圾邮件的原理吗?  
  Top

34 楼yy2001()回复于 2005-04-05 21:01:19 得分 0

constantine(飘遥的安吉儿):  
  你能下吗?给我一份好吗?  
  我下来后解不了。  
   
  垃圾邮件的原理?  
  是什么呢?Top

相关问题

  • 有谁知道Foxmail中的特快专递是怎么实现的?
  • 用Delphi编写邮件特快专递程序
  • 怎么做个个人发信服务器? 就是类似foxmail的特快专递那样的
  • Delphi的安装程序好难做?特快专递
  • 关于foxmail特快专递的问题,分数不是问题
  • 怎么用C++实现邮件发送~
  • 怎么编程实现登入到邮件服务器
  • 在邮件发送系统中,多附件怎么实现???
  • VB里怎么实现象邮件中带附件的功能?
  • 怎么样做能实现一个邮件服务器啊?

关键词

  • c++ builder
  • 查询
  • 邮件
  • 主机
  • 服务器
  • 域名
  • 代码
  • 邮件服务器
  • 垃圾邮件
  • dnsheader

得分解答快速导航

  • 帖主:yy2001
  • constantine
  • 3996906
  • Friecin

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo