邮件特快专递怎么实现?
我看到资料用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




