如何才能绕过SMTP邮件服务器的UserID认证进行邮件发送?(在线)
我写了个自动发送邮件的软件,他妈的!想不到光有对方的邮箱地址还不行!
还要知道对方的SMTP邮件服务器地址和用户登陆密码!!!!那还有什么用呀!
不知Outlook是怎么处理的??????????
那位大侠能告知一二呀?????????不胜感激!!!!!!!!!!!!!
我写了个自动发送邮件的软件,他妈的!想不到光有对方的邮箱地址还不行!
还要知道对方的SMTP邮件服务器地址和用户登陆密码!!!!那还有什么用呀!
不知Outlook是怎么处理的??????????
那位大侠能告知一二呀?????????不胜感激!!!!!!!!!!!!!
自己的密码和用户名写在那?????
我是发送到别人的邮箱里!不是自己的邮箱啊。
outlook中的帐号属性中有服务器这个属性,将其中的外发邮件服务器中我的服务器要求身份验证选中,设置登录方式:在帐号名和密码中输入邮箱的用户名和密码即可。
还是不懂,你用过TNMSMTP组件没有?我就是用这个控件写的程序!
要求填入:对方的SMTP邮件服务器地址和用户登陆密码!!!!
那位大侠知道:TNMsMTP怎么使用?我用了,但只能发到自己的邮箱里!!!
procedure TfrmMain.NMSMTP1Connect(Sender: TObject);
var
strUserName, strPassword: String;
begin
strUserName := EncodeString('邮件服务器用户名称');
strPassword := EncodeString('邮件服务器用户密码'); {进行认证,输入编码后的用户名、密码} nmsmtp1.Transaction('EHLO') ;
nmsmtp1.Transaction('AUTH LOGIN');
nmsmtp1.Transaction(strUserName);
nmsmtp1.Transaction(strPassword);end;{对参数TMemoryStrema中的字节流进行Base64编码,编码后的结果
保存在Encoded中,函数返回编码长度}
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;
//当SendMessage之后删除PostMessage中的内容
//NMSMTP1.ClearParams := true;
//主题类型
//NMSMTP1.SubType := mtPlain;
//编码格式
//NMSMTP1.EncodeType := uuMime;
//NMSMTP1.EncodeType := uuCode; //发件人地址
NMSMTP1.PostMessage.FromAddress := GetEmailOption('管理员邮件地址');
//发件人
NMSMTP1.PostMessage.FromName := GetEmailOption('邮件服务器用户名称');
//发送地址
NMSMTP1.PostMessage.ToAddress.Text := sMobile;
{
//抄送和暗送
NMSMTP1.PostMessage.ToCarbonCopy.Text := Memo3.Text;
NMSMTP1.PostMessage.ToBlindCarbonCopy.Text := Memo2.Text;
}
//邮件内容
lstContent := TStringList.Create;
lstContent.Add('--------------Email by xiatian');
lstContent.Add('Content-Type: text/plain; charset=gb2312');
lstContent.Add('Content-Transfer-Encoding: 8bit');
{注意:空行是邮件格式所必需的!}
lstContent.Add(''); lstBody := TStringList.Create;
MySplitString(sContent, #$D + #$A, lstBody);
for i := 0 to lstBody.Count - 1 do
lstContent.Add(lstBody.Strings[i]); lstContent.Add(''); NMSMTP1.PostMessage.Body.Text := lstContent.Text;
lstBody.Free;
lstContent.Free;
//附件
//NMSMTP1.PostMessage.Attachments.Text := ListBox1.Items.Text;
//主题
NMSMTP1.PostMessage.Subject := GetEmailOption('邮件标题');
//
//NMSMTP1.PostMessage.LocalProgram := Edit6.Text;
//日期
NMSMTP1.PostMessage.Date := DateToStr(Date);
//回复人
NMSMTP1.PostMessage.ReplyTo := GetEmailOption('管理员邮件地址');
try
NMSMTP1.SendMail;
except
on e: Exception do
begin
memLog.Lines.Add('交易代码:【' + sTradeCode + '】,预约流水号:【' + sID + '】,' + e.Message);
end;
end;
我的smtp:smtp.sina.com.cn
对方的:[email protected]
这样能否发送出去!
????????
太感谢你了!
忘了说一句,在onSendStart事件中还要加一段代码才可以的procedure TfrmMain.NMSMTP1SendStart(Sender: TObject);
begin
{在邮件发送开始时修改邮件的消息头,标明邮件为多部分组成}
NMSMTP1.FinalHeader.Values['Content-Type'] := ''
+ 'multipart/related; boundary="------------Email by xiatian"';而这段代码中的字符串需要与填写邮件内容头部内容对应(邮件编码格式需要) lstContent.Add('--------------Email by xiatian');
lstContent.Add('Content-Type: text/plain; charset=gb2312');
lstContent.Add('Content-Transfer-Encoding: 8bit');
{注意:空行是邮件格式所必需的!}
lstContent.Add('');
接下来在在lstContent中添加邮件主题内容,这个头部格式只能发送普通文本文件,而不是html文件end;
procedure TfrmMain.NMSMTP1SendStart(Sender: TObject);
begin
{在邮件发送开始时修改邮件的消息头,标明邮件为多部分组成}
NMSMTP1.FinalHeader.Values['Content-Type'] := ''
+ 'multipart/related; boundary="------------Email by xiatian"';
end;
NMSMTP1.PostMessage.ToAddress.Text := [email protected];
不可以吗?
我再试试!一定会成功的!
http://www.china-pub.com/computers/emook/wzq/056/info.htm