with NMSMTP1.PostMessage do begin fromname:=trim(txt_sendid.text); fromaddress:=trim(txt_sendmail.text); subject:=trim(txt_sub.text); body.Assign(memo1.lines); toaddress.Clear; ToBlindCarbonCopy.Clear; ToCarbonCopy.Clear; ToAddress:=changeStr(txt_address.text); end; NMSMTP1.UserID:='ID'; NMSMTP1.SendMail;function TForm1.changeStr(myStr: String): TstringList; var tmp:string; i:integer; begin changeStr:=TstringList.Create; i:=pos(';',myStr);//判断';'位置 while i>0 do //有';',表示批量邮件 begin tmp:=copy(myStr,1,i-1); changeStr.Add(tmp); delete(myStr,1,i); i:=pos(';',myStr); end; changeStr.Add(myStr); end;刚刚试过,成功
是不需要ESMTP认证的SMTP服务器吧!用IdSMTP组件吧。
function EncodeBASE64(Encoded: TMemoryStream ; Decoded: TMemoryStream): Integer; const _Code64: String[64] = ('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'); var I: LongInt; B: array[0..2279] of Byte; J, K, L, M, Quads: Integer; Stream: string[76]; EncLine: String; begin Encoded.Clear; Stream := ''; Quads := 0; {为提高效率,每2280字节流为一组进行编码} J := Decoded.Size div 2280; Decoded.Position := 0; {对前J*2280个字节流进行编码} for I := 1 to J do begin Decoded.Read(B, 2280); for M := 0 to 39 do begin for K := 0 to 18 do begin L:= 57*M + 3*K; Stream[Quads+1] := _Code64[(B[L] div 4)+1]; Stream[Quads+2] := _Code64[(B[L] mod 4)*16 + (B[L+1] div 16)+1]; Stream[Quads+3] := _Code64[(B[L+1] mod 16)*4 + (B[L+2] div 64)+1]; Stream[Quads+4] := _Code64[B[L+2] mod 64+1]; Inc(Quads, 4); if Quads = 76 then begin Stream[0] := #76; EncLine := Stream+#13#10; Encoded.Write(EncLine[1], Length(EncLine)); Quads := 0; end; end; end; end; {对以2280为模的余数字节流进行编码} J := (Decoded.Size mod 2280) div 3; for I := 1 to J do begin Decoded.Read(B, 3); Stream[Quads+1] := _Code64[(B[0] div 4)+1]; Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1]; Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + (B[2] div 64)+1]; Stream[Quads+4] := _Code64[B[2] mod 64+1]; Inc(Quads, 4); {每行76个字符} if Quads = 76 then begin Stream[0] := #76; EncLine := Stream+#13#10; Encoded.Write(EncLine[1], Length(EncLine)); Quads := 0; end; end; {“=”补位} if (Decoded.Size mod 3) = 2 then begin Decoded.Read(B, 2); Stream[Quads+1] := _Code64[(B[0] div 4)+1]; Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1]; Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + 1]; Stream[Quads+4] := '='; Inc(Quads, 4); end; if (Decoded.Size mod 3) = 1 then begin Decoded.Read(B, 1); Stream[Quads+1] := _Code64[(B[0] div 4)+1]; Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + 1]; Stream[Quads+3] := '='; Stream[Quads+4] := '='; Inc(Quads, 4); end; Stream[0] := Chr(Quads); if Quads > 0 then begin EncLine := Stream+#13#10; Encoded.Write(EncLine[1], Length(EncLine)); end; Result := Encoded.Size; end;{对参数Decoded字符串进行Base64编码,返回编码后的字符串} function EncodeString(Decoded:string):String; var mmTemp,mmDecoded:TMemoryStream; strTemp:TStrings; begin mmTemp := TMemoryStream.Create; mmDecoded:=TMemoryStream.Create; strTemp:=TStringList.Create; strTemp.Add(Decoded); strTemp.SaveToStream(mmTemp); mmTemp.Position := 0; {剔除mmTemp从strTemp中带来的字符#13#10} mmDecoded.CopyFrom(mmTemp,mmTemp.Size-2); {对mmDecoded进行Base64编码,由mmTemp返回编码后的结果} EncodeBASE64(mmTemp,mmDecoded); {获得Base64编码后的字符串} mmTemp.Position:=0; strTemp.LoadFromStream(mmTemp); {返回结果必须从strTemp[0]中获得,如果使用strTemp.Text会 带来不必要的字符#13#10} Result:=strTemp[0]; end; procedure TfrmAbout.NMSMTP1Connect(Sender: TObject); //var strUserName, strPassword: String; begin strUserName := EncodeString('CoolSlob'); strPassword := EncodeString('Password'); {进行认证,输入编码后的用户名、密码} nmsmtp1.Transaction('EHLO') ; nmsmtp1.Transaction('AUTH LOGIN'); nmsmtp1.Transaction(strUserName); nmsmtp1.Transaction(strPassword); StatusBar1.SimpleText := '连接成功'; end;
begin
fromname:=trim(txt_sendid.text);
fromaddress:=trim(txt_sendmail.text);
subject:=trim(txt_sub.text);
body.Assign(memo1.lines);
toaddress.Clear;
ToBlindCarbonCopy.Clear;
ToCarbonCopy.Clear;
ToAddress:=changeStr(txt_address.text);
end;
NMSMTP1.UserID:='ID';
NMSMTP1.SendMail;function TForm1.changeStr(myStr: String): TstringList;
var
tmp:string;
i:integer;
begin
changeStr:=TstringList.Create;
i:=pos(';',myStr);//判断';'位置
while i>0 do //有';',表示批量邮件
begin
tmp:=copy(myStr,1,i-1);
changeStr.Add(tmp);
delete(myStr,1,i);
i:=pos(';',myStr);
end;
changeStr.Add(myStr);
end;刚刚试过,成功
const
_Code64: String[64] =
('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
var
I: LongInt;
B: array[0..2279] of Byte;
J, K, L, M, Quads: Integer;
Stream: string[76];
EncLine: String;
begin
Encoded.Clear;
Stream := '';
Quads := 0;
{为提高效率,每2280字节流为一组进行编码}
J := Decoded.Size div 2280;
Decoded.Position := 0;
{对前J*2280个字节流进行编码}
for I := 1 to J do
begin
Decoded.Read(B, 2280);
for M := 0 to 39 do
begin
for K := 0 to 18 do
begin
L:= 57*M + 3*K;
Stream[Quads+1] := _Code64[(B[L] div 4)+1];
Stream[Quads+2] := _Code64[(B[L] mod 4)*16 + (B[L+1] div 16)+1];
Stream[Quads+3] := _Code64[(B[L+1] mod 16)*4 + (B[L+2] div 64)+1];
Stream[Quads+4] := _Code64[B[L+2] mod 64+1];
Inc(Quads, 4);
if Quads = 76 then
begin
Stream[0] := #76;
EncLine := Stream+#13#10;
Encoded.Write(EncLine[1], Length(EncLine));
Quads := 0;
end;
end;
end;
end; {对以2280为模的余数字节流进行编码}
J := (Decoded.Size mod 2280) div 3;
for I := 1 to J do
begin
Decoded.Read(B, 3);
Stream[Quads+1] := _Code64[(B[0] div 4)+1];
Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1];
Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + (B[2] div 64)+1];
Stream[Quads+4] := _Code64[B[2] mod 64+1];
Inc(Quads, 4);
{每行76个字符}
if Quads = 76 then
begin
Stream[0] := #76;
EncLine := Stream+#13#10;
Encoded.Write(EncLine[1], Length(EncLine));
Quads := 0;
end;
end;
{“=”补位}
if (Decoded.Size mod 3) = 2 then
begin
Decoded.Read(B, 2);
Stream[Quads+1] := _Code64[(B[0] div 4)+1];
Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + (B[1] div 16)+1];
Stream[Quads+3] := _Code64[(B[1] mod 16)*4 + 1];
Stream[Quads+4] := '=';
Inc(Quads, 4);
end; if (Decoded.Size mod 3) = 1 then
begin
Decoded.Read(B, 1);
Stream[Quads+1] := _Code64[(B[0] div 4)+1];
Stream[Quads+2] := _Code64[(B[0] mod 4)*16 + 1];
Stream[Quads+3] := '=';
Stream[Quads+4] := '=';
Inc(Quads, 4);
end; Stream[0] := Chr(Quads);
if Quads > 0 then
begin
EncLine := Stream+#13#10;
Encoded.Write(EncLine[1], Length(EncLine));
end; Result := Encoded.Size;
end;{对参数Decoded字符串进行Base64编码,返回编码后的字符串}
function EncodeString(Decoded:string):String;
var
mmTemp,mmDecoded:TMemoryStream;
strTemp:TStrings;
begin
mmTemp := TMemoryStream.Create;
mmDecoded:=TMemoryStream.Create;
strTemp:=TStringList.Create;
strTemp.Add(Decoded);
strTemp.SaveToStream(mmTemp);
mmTemp.Position := 0;
{剔除mmTemp从strTemp中带来的字符#13#10}
mmDecoded.CopyFrom(mmTemp,mmTemp.Size-2);
{对mmDecoded进行Base64编码,由mmTemp返回编码后的结果}
EncodeBASE64(mmTemp,mmDecoded);
{获得Base64编码后的字符串}
mmTemp.Position:=0;
strTemp.LoadFromStream(mmTemp);
{返回结果必须从strTemp[0]中获得,如果使用strTemp.Text会
带来不必要的字符#13#10}
Result:=strTemp[0];
end;
procedure TfrmAbout.NMSMTP1Connect(Sender: TObject);
//var strUserName, strPassword: String;
begin
strUserName := EncodeString('CoolSlob');
strPassword := EncodeString('Password');
{进行认证,输入编码后的用户名、密码}
nmsmtp1.Transaction('EHLO') ;
nmsmtp1.Transaction('AUTH LOGIN');
nmsmtp1.Transaction(strUserName);
nmsmtp1.Transaction(strPassword);
StatusBar1.SimpleText := '连接成功';
end;