首页 | 源码下载 | 编程控件 | 书籍教程 | 应用方案 | 设计素材 | 项目交易 | 开发文档 | 商业源码 | 我的帐号
登陆我的帐号
帐 号:
密 码:
我还不是会员,需要注册!

截止2004年12月16日
本站源码总量(商业源码除外)RAR压缩为 4,206,733 KB。其中免费源码为 1,124,495 KB,会员源码为 3,082,238 KB
C/C++ 129,555 KB
Delphi 1,258,381 KB
Java 120,937 KB
.Net 36,886 KB
PowerBuilder 954,525 KB
Visual Basic 923,454 KB
ASP 259,795 KB
JSP 4,987 KB
其他 94,723 KB

本站是中国频道、中资源、时代互联顶级代理:注册国际域名70元,国内域名130元,各类ASP、PHP、JSP空间8折优惠!
本站承担各类网站制作开发及方案策划,项目经验丰富,欢迎洽谈!

网站动态
关于下载速度慢的问题解答
想免费下载源码吗?
还有众多资源恭候大家免费…
道歉!
关于资源更新的说明
关于下载错误的原因!
源码资源网新版网站投入运…

当前位置:源码资源网首页 > 开发文档首页 > Delphi >直接用WinSock API 发E-mail

直接用WinSock API 发E-mail
人气:10 文字大小:     作者:



unit SMTP_Connections;


//------------------------------------------
//定义单元
//---------------------------------------------
interface


uses
Classes, StdCtrls;


const
WinSock = ’wsock32.dll’;
Internet = 2;
Stream = 1;
fIoNbRead = $4004667F;
WinSMTP = $0001;
LinuxSMTP = $0002;


type


TWSAData = packed record
wVersion: Word;
wHighVersion: Word;
szDescription: array[0..256] of Char;
szSystemStatus: array[0..128] of Char;
iMaxSockets: Word;
iMaxUdpDg: Word;
lpVendorInfo: PChar;
end;
PHost = ^THost;
THost = packed record
Name: PChar;
aliases: ^PChar;
addrtype: Smallint;
Length: Smallint;
addr: ^Pointer;
end;


TSockAddr = packed record
Family: Word;
Port: Word;
Addr: Longint;
Zeros: array[0..7] of Byte;
end;


function WSAStartup Version:word; Var Data:TwsaData):integer; stdcall; far; external winsock;
function socket Family,Kind,Protocol:integer):integer; stdcall; far; external winsock;
function shutdown Socket,How:Integer):integer; stdcall; far; external winsock;
function closesocket socket:Integer):integer; stdcall; far; external winsock;
function WSACleanup:integer; stdcall; far; external winsock;
function bind Socket:Integer; Var SockAddr:TSockAddr; AddrLen:integer):integer; stdcall; far; external winsock;
function listen socket,flags:Integer):integer; stdcall; far; external winsock;
function connect socket:Integer; Var SockAddr:TSockAddr; AddrLen:integer):integer; stdcall; far; external winsock;
function accept socket:Integer; Var SockAddr:TSockAddr; Var AddrLen:Integer):integer; stdcall; far; external winsock;
function WSAGetLastError:integer; stdcall; far; external winsock;
function recv socket:integer; data:pchar; datalen,flags:integer):integer; stdcall; far; external winsock;
function send socket:integer; var data; datalen,flags:integer):integer; stdcall; far; external winsock;
function gethostbyname HostName:PChar):PHost; stdcall; far; external winsock;
function WSAIsBlocking:boolean; stdcall; far; external winsock;
function WSACancelBlockingCall:integer; stdcall; far; external winsock;
function ioctlsocket socket:integer; cmd: Longint; var arg: longint): Integer; stdcall; far; external winsock;
function gethostname name:pchar; size:integer):integer; stdcall; far; external winsock;


procedure _authSendMail MailServer,uname,upass,mFrom,mFromName,mToName,Subject:string;mto,mbody:TStringList);
function ConnectServer mhost:string;mport:integer):integer;
function ConnectServerwin mhost:string;mport:integer):integer;
function DisConnectServer:integer;
function Stat: string;
function SendCommand Command: String): string;
function SendData Command: String): string;
function SendCommandWin Command: String): string;
function ReadCommand: string;
function encryptB64 s:string):string;


var
mconnHandle: Integer;
mFin, mFOut: Textfile;
EofSock: Boolean;
mactive: Boolean;
mSMTPErrCode: Integer;
mSMTPErrText: string;
mMemo: TMemo;


implementation


uses
SysUtils, Sockets, IdBaseComponent,
IdCoder, IdCoder3to4, IdCoderMIME, IniFiles,Unit1;


var
mClient: TTcpClient;


procedure _authSendMail MailServer, uname, upass, mFrom, mFromName,
mToName, Subject: string; mto, mbody: TStringList);
var
tmpstr: string;
cnt: Integer;
mstrlist: TStrings;
RecipientCount: Integer;
begin
if ConnectServerWin Mailserver, 25) = 250 then
begin
Sendcommandwin ’AUTH LOGIN ’);
SendcommandWin encryptB64 uname));
SendcommandWin encryptB64 upass));
SendcommandWin ’MAIL FROM: ’ + mfrom);
for cnt := 0 to mto.Count - 1 do
SendcommandWin ’RCPT TO: ’ + mto[cnt]);
Sendcommandwin ’DATA’);
SendData ’Subject: ’ + Subject);
SendData ’From: "’ + mFromName + ’" <’ + mfrom + ’>’);
SendData ’To: ’ + mToName);
SendData ’Mime-Version: 1.0’);
SendData ’Content-Type: multipart/related; boundary="Esales-Order";’);
SendData ’ type="text/html"’);
SendData ’’);
SendData ’--Esales-Order’);
SendData ’Content-Type: text/html;’);
SendData ’ charset="iso-8859-9"’);
SendData ’Content-Transfer-Encoding: QUOTED-PRINTABLE’);
SendData ’’);
for cnt := 0 to mbody.Count - 1 do
SendData mbody[cnt]);
Senddata ’’);
SendData ’--Esales-Order--’);
Senddata ’ ’);
mSMTPErrText := SendCommand crlf + ’.’ + crlf);
try
mSMTPErrCode := StrToInt Copy mSMTPErrText, 1, 3));
except
end;
SendData ’QUIT’);
DisConnectServer;
end;
end;


function Stat: string;
var
s: string;
begin
s := ReadCommand;
Result := s;
end;


function EchoCommand Command: string): string;
begin
SendCommand Command);
Result := ReadCommand;
end;


function ReadCommand: string;
var
tmp: string;
begin
repeat
ReadLn mfin, tmp);
if Assigned mmemo) then
mmemo.Lines.Add tmp);
until  Length tmp) < 4) or  tmp[4] <> ’-’);
Result := tmp
end;


function SendData Command: string): string;
begin
Writeln mfout, Command);
end;


function SendCommand Command: string): string;
begin
Writeln mfout, Command);
Result := stat;
end;


function SendCommandWin Command: string): string;
begin
Writeln mfout, Command + #13);
Result := stat;
end;


function FillBlank Source: string; number: Integer): string;
var
a: Integer;
begin
Result := ’’;
for a := Length trim Source)) to number do
Result := Result + ’ ’;
end;


function IpToLong ip: string): Longint;
var
x, i: Byte;
ipx: array[0..3] of Byte;
v: Integer;
begin
Result := 0;
Longint ipx) := 0;
i := 0;
for x := 1 to Length ip) do
if ip[x] = ’.’ then
begin
Inc i);
if i = 4 then Exit;
end
else
begin
if not  ip[x] in [’0’..’9’]) then Exit;
v := ipx[i] * 10 + Ord ip[x]) - Ord ’0’);
if v > 255 then Exit;
ipx[i] := v;
end;
Result := Longint ipx);
end;


function HostToLong AHost: string): Longint;
var
Host: PHost;
begin
Result := IpToLong AHost);
if Result = 0 then
begin
Host := GetHostByName PChar AHost));
if Host <> nil then Result := Longint Host^.Addr^^);
end;
end;


function LongToIp Long: Longint): string;
var
ipx: array[0..3] of Byte;
i: Byte;
begin
Longint ipx) := long;
Result := ’’;
for i := 0 to 3 do Result := Result + IntToStr ipx[i]) + ’.’;
SetLength Result, Length Result) - 1);
end;


procedure Disconnect Socket: Integer);
begin
ShutDown Socket, 1);
CloseSocket Socket);
end;


function CallServer Server: string; Port: Word): Integer;
var
SockAddr: TSockAddr;
begin
Result := socket Internet, Stream, 0);
if Result = -1 then Exit;
FillChar SockAddr, SizeOf SockAddr), 0);
SockAddr.Family := Internet;
SockAddr.Port := swap Port);
SockAddr.Addr := HostToLong Server);
if Connect Result, SockAddr, SizeOf SockAddr)) <> 0 then
begin
Disconnect Result);
Result := -1;
end;
end;


function OutputSock var F: TTextRec): Integer; far;
begin
if F.BufPos <> 0 then
begin
Send F.Handle, F.BufPtr^, F.BufPos, 0);
F.BufPos := 0;
end;
Result := 0;
end;


function InputSock var F: TTextRec): Integer; far;
var
Size: Longint;
begin
F.BufEnd := 0;
F.BufPos := 0;
Result := 0;
repeat
if  IoctlSocket F.Handle, fIoNbRead, Size) < 0) then
begin
EofSock := True;
Exit;
end;
until  Size >= 0);
F.BufEnd := Recv F.Handle, F.BufPtr, F.BufSize, 0);
EofSock :=  F.Bufend = 0);
end;


function CloseSock var F: TTextRec): Integer; far;
begin
Disconnect F.Handle);
F.Handle := -1;
Result := 0;
end;


function OpenSock var F: TTextRec): Integer; far;
begin
if F.Mode = fmInput then
begin
EofSock := False;
F.BufPos := 0;
F.BufEnd := 0;
F.InOutFunc := @InputSock;
F.FlushFunc := nil;
end
else
begin
F.Mode := fmOutput;
F.InOutFunc := @OutputSock;
F.FlushFunc := @OutputSock;
end;
F.CloseFunc := @CloseSock;
Result := 0;
end;


procedure AssignCrtSock Socket:integer; Var Input,Output:TextFile);
begin
with TTextRec Input) do
begin
Handle := Socket;
Mode := fmClosed;
BufSize := SizeOf Buffer);
BufPtr := @Buffer;
OpenFunc := @OpenSock;
end;
with TTextRec Output) do
begin
Handle := Socket;
Mode := fmClosed;
BufSize := SizeOf Buffer);
BufPtr := @Buffer;
OpenFunc := @OpenSock;
end;
Reset Input);
Rewrite Output);
end;


function ConnectServer mhost: string; mport: Integer): Integer;
var
tmp: string;
begin
mClient := TTcpClient.Create nil);
mClient.RemoteHost := mhost;
mClient.RemotePort := IntToStr mport);
mClient.Connect;
mconnhandle := callserver mhost, mport);
if  mconnHandle<>-1) then
begin
AssignCrtSock mconnHandle, mFin, MFout);
tmp := stat;
tmp := SendCommand ’HELO bellona.com.tr’);
if Copy tmp, 1, 3) = ’250’ then
begin
Result := StrToInt Copy tmp, 1, 3));
end;
end;
end;


function ConnectServerWin mhost: string; mport: Integer): Integer;
var
tmp: string;
begin
mClient := TTcpClient.Create nil);
mClient.RemoteHost := mhost;
mClient.RemotePort := IntToStr mport);
mClient.Connect;
mconnhandle := callserver mhost, mport);
if  mconnHandle<>-1) then
begin
AssignCrtSock mconnHandle, mFin, MFout);
tmp := stat;
tmp := SendCommandWin ’HELO bellona.com.tr’);
if Copy tmp, 1, 3) = ’250’ then
begin
Result := StrToInt Copy tmp, 1, 3));
end;
end;
end;


function DisConnectServer: Integer;
begin
closesocket mconnhandle);
mClient.Disconnect;
mclient.Free;
end;


function encryptB64 s: string): string;
var
hash1: TIdEncoderMIME;
p: string;
begin
if s <> ’’ then
begin
hash1 := TIdEncoderMIME.Create nil);
p := hash1.Encode s);
hash1.Free;
end;
Result := p;
end;


end.


//------------------------------------------
// 怎么使用定义好得相关单元
//---------------------------------------------
unit Unit1;


interface


uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;


type
TForm1 = class TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;


implementation


{$R *.dfm}


uses
SMTP_Connections;


procedure TForm1.Button1Click Sender: TObject);
var
mto, mbody: TStringList;
MailServer, uname, upass, mFrom, mFromName,
mToName, Subject: string;
begin
mMemo := Memo1; // 定义相关发送服务器
//..........................
MailServer := ’mail.163.com’;
uname := ’username’;
upass := ’password’;
mFrom := ’[email protected];
mFromName := ’forename surname’;
mToName := ’’;
Subject := ’Your Subject’;
//..........................
mto := TStringList.Create;
mbody := TStringList.Create;
try
mto.Add ’[email protected]’);
mbody.Add ’测试邮件’);
//发送.................
_authSendMail MailServer, uname, upass, mFrom, mFromName, mToName, Subject, mto, mbody);
//..........................
finally
mto.Free;
mbody.Free;
end;
end;


end.




 

文章出处:   发表时间:2004-11-17 22:49:24

1条数据记录,分1页显示 上一页 < [1] > 下一页
相关文章  
[源码下载] · comicq源代码
[书籍教程] · VC++ 6.0数据库系统开发实例导航
[书籍教程] · Delphi 7数据库编程学习捷径
[书籍教程] · Delphi百例精解
[书籍教程] · DELPHI综合开发文档

相关评论  
 当前没有评论!
请登陆后再来发表评论!
当前位置:源码资源网首页 > 开发文档首页 > 直接用WinSock API 发E-mail
会员升级 | 广告服务 | 网站开发 | 联系我们 | 网站动态 | 客户反馈

CodeRes.com 保留所有权利 2004
本站所有资源仅供学习参考,版权归原作者所有,如侵犯了您的权益请与我们联系