邮件高手过来看看 急!!!

tbwork 架构师-技术总监  2009-07-14 04:19:39
我用的是BCB的fastnet开发的邮件工具
在发送的时候都正常,可是再用POP3协议控件接受的时候,发现
发送的英文主题和正文都能正常接收
可是一旦发送的是中文,主题会接受成GBK和base64编码的源码(未解码)如“=?GBK?B?...”,而正文则是英文大写小写和“=”号的混合乱码如“WaVud...==”。
我就纳闷了,假如这控件自身不提供解码功能的话,那么为什么发送英文的时候也是base64编码的就能正常的显示。而假如提供解码功能的话,为什么中文却不能解码呢?
我讲的很详细了,高手们一定要开说说,跪谢啦····
...全文
44 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tbwork 2009-07-16
同志把您做的indy的实例打包发给我看看··谢谢了···我的电子邮件地址:tttbbb222000@163.com
QQ:542561233
欢迎加入c++builder技术交流群:41410643 (QQ)
回复
tbwork 2009-07-16
其实我怀疑是fastnet太老了,很多协议或者编码规定已经不和以前同了,才会导致这样的错,不过如果是这样,应该有人提出来才是啊,怎么到今天还没有人发现呢
代码如下:按照书上做的,后来自己又加上了base64和QP的编码解码;发现不伦不类的问题:加上自己的解码后,发现中文可以接受了,但是英文却不可以了,火大了,而且带附件的中文正文也和附件一起编码了,根本无法隔开。或者单独取出,邮件的body包括了正文+附件编码,而attachment属性里又有附件。这一切让我摸不着头脑···
代码如下:

void __fastcall TForm3::Button1Click(TObject *Sender)
{
NMPOP31->AttachFilePath="Attachment\\";
NMPOP31->Host=Form2->Edit4->Text;
NMPOP31->Port=Form2->Edit5->Text.ToInt();
NMPOP31->ReportLevel=Status_Basic;
NMPOP31->TimeOut=60000;
NMPOP31->UserID=Form2->Edit6->Text;
NMPOP31->Password=Form2->Edit7->Text;
if(!NMPOP31->Connected)
NMPOP31->Connect();
Form3->Edit1->Text=IntToStr(NMPOP31->MailCount);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button2Click(TObject *Sender)
{
if(NMPOP31->Connected)
NMPOP31->List();
else
ShowMessage("必须先链接到服务器!");
}
//---------------------------------------------------------------------------
void __fastcall TForm3::NMPOP31List(int Msg, int Size)
{
if(Msg<1)
{
Memo1->Clear();
Memo1->Lines->Add("邮件序号/邮件大小(字节)");
}
else
{
Memo1->Lines->Add(IntToStr(Msg)+"/"+IntToStr(Size));
}
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31RetrieveEnd(TObject *Sender)
{
Form3->Cursor=crDefault;
StatusBar1->SimpleText="邮件收取完毕!";

}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31Connect(TObject *Sender)
{
StatusBar1->SimpleText="已经连接到服务器";
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31ConnectionFailed(TObject *Sender)
{
StatusBar1->SimpleText="连接服务器失败";
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31Disconnect(TObject *Sender)
{
StatusBar1->SimpleText="脱机工作";
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31Failure(TObject *Sender)
{
ShowMessage("操作失败");
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31HostResolved(TComponent *Sender)
{
StatusBar1->SimpleText="服务器地址解析成功";
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31InvalidHost(bool &Handled)
{
ShowMessage("无效的服务器名");
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31PacketRecvd(TObject *Sender)
{
StatusBar1->SimpleText="已接受"+IntToStr(NMPOP31->BytesRecvd)+"字节/共"+IntToStr(NMPOP31->BytesTotal)+"字节";
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31Reset(TObject *Sender)
{
ShowMessage("重置删除标志");
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31RetrieveStart(TObject *Sender)
{
Form3->Cursor=crHourGlass;
StatusBar1->SimpleText="开始接受邮件";
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31Status(TComponent *Sender,
AnsiString Status)
{
StatusBar1->SimpleText=Status;
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31Success(TObject *Sender)
{
StatusBar1->SimpleText="操作成功";
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31AuthenticationFailed(bool &Handled)
{
ShowMessage("密码错误!");
}
//---------------------------------------------------------------------------

void __fastcall TForm3::Button3Click(TObject *Sender)
{
if(NMPOP31->Connected)
{
NMPOP31->GetMailMessage(Edit4->Text.ToInt());
Edit2->Text=NMPOP31->MailMessage->From;
AnsiString subject=Decode(NMPOP31->MailMessage->Subject,3);
Edit5->Text=subject;
// Edit5->Text=NMPOP31->MailMessage->Subject;

Edit3->Text=AnsiString(NMPOP31->Summary->Bytes);
Edit6->Text=NMPOP31->MailMessage->MessageId;
Memo2->Clear();
Memo3->Clear();
Memo2->Lines->Assign(NMPOP31->MailMessage->Head);
AnsiString body=Decode(NMPOP31->MailMessage->Body->Text,3);
Memo3->Lines->Add(body);
if(NMPOP31->MailMessage->Attachments->Text!="")
ShowMessage("附件\n"+NMPOP31->MailMessage->Attachments->Text);
}
else
{
NMPOP31->Connect();
}
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31DecodeStart(AnsiString &FileName)
{
StatusBar1->SimpleText="开始解码";
}
//---------------------------------------------------------------------------

void __fastcall TForm3::NMPOP31DecodeEnd(TObject *Sender)
{
StatusBar1->SimpleText="解码完成";
}
//---------------------------------------------------------------------------

void __fastcall TForm3::Button4Click(TObject *Sender)
{
NMPOP31->DeleteMailMessage(Edit4->Text.ToInt());
}
//下面还有是自己写的编码解码代码,测试过了,正确,功能是把一段文子编码解码。
回复
科多兽 2009-07-15
你把相关的代码发上来看下.
回复
tbwork 2009-07-15
我现在想改都改不了了······项目里的监控模块使用internet里的控件做的,回到了我最新遇到的问题····哎···咋办呢·····
回复
xabcxyz 2009-07-15
没有用fastnet,我用indy没有问题
回复
相关推荐
发帖
VCL组件使用和开发
创建于2007-08-02

587

社区成员

C++ Builder VCL组件使用和开发
申请成为版主
帖子事件
创建了帖子
2009-07-14 04:19
社区公告
暂无公告