而当我设置了Sender.Address,它就提示
You are not authorized to send mail as <MAIL FROM:<[email protected]>>,authentication is required.

解决方案 »

  1.   

    更正,应该是设置了From才出的错,到底是From是必须的还是Sender
      

  2.   

    以下代码我在上午刚测试过,可以。害我昨天一天和今天半个上午的时间,昨晚都没睡好系统自带的几个SMTP根本不行,验证没用。DEMO也没有验证模块。找了好几个,都是收费的控件
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Psock, NMsmtp, StdCtrls, Buttons;type
      TForm1 = class(TForm)
        NMSMTP1: TNMSMTP;
        BitBtn1: TBitBtn;
        TxtTo: TEdit;
        Label1: TLabel;
        TxtFrom: TEdit;
        Label2: TLabel;
        txtSmtpServer: TEdit;
        Label3: TLabel;
        txtPort: TEdit;
        Label4: TLabel;
        memContents: TMemo;
        txtSubject: TEdit;
        Label5: TLabel;
        procedure BitBtn1Click(Sender: TObject);
        procedure NMSMTP1Connect(Sender: TObject);
        procedure NMSMTP1SendStart(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;  function EncodeString(Decoded:string):String;
      function EncodeBASE64(Encoded: TMemoryStream {TMailText}; Decoded: TMemoryStream): Integer; //编码函数implementation{$R *.dfm}{对参数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;procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      mmSwfFile,mmEncoded:TMemoryStream;
      iResult : Integer;
      strsTemp : TStrings;
      strContents : TStringList;
      i : Integer;
    begin
      {设置SMTP服务器地址、端口}
      NMSMTP1.Host := txtSmtpServer.Text;
      NMSMTP1.UserID := '你的帐号';
      NMSMTP1.Port:=StrToInt(txtPort.Text);
      {断开原来的连接,保证TForm1.NMSMTP1Connect中服务器认证的执行}
      if NMSMTP1.Connected then NMSMTP1.Disconnect;  {连接服务器}
      NMSMTP1.Connect;
      {创建流}
      mmSwfFile := TMemoryStream.Create;
      mmEncoded := TMemoryStream.Create;
      {加载文件至流mmSwfFile}
      mmSwfFile.LoadFromFile('C:\HIMEM.SYS');
      {对mmSwfFile进行Base64编码,mmEncoded为编码后内容}
      iResult := EncodeBASE64(mmEncoded,mmSwfFile);
      strsTemp := TStringList.Create;
      mmEncoded.Position:=0;
      strsTemp.LoadFromStream(mmEncoded);
      {----生成邮件内容----}
      strContents:=TStringList.Create;
      strContents.Add('--------------SwfEmail by JDH');
      strContents.Add('Content-Type: text/html; charset=gb2312');
      strContents.Add('Content-Transfer-Encoding: 8bit');
      {注意:空行是邮件格式所必需的!}
      strContents.Add('');
      strContents.Add('<HTML><HEAD><TITLE>SWFEMAIL</TITLE></HEAD>');
      strContents.Add('<BODY><font color=red>');
      {添加邮件正文内容}
      for i:=0 to memContents.Lines.Count-1 do
        strContents.Add(memContents.Lines[i] + '');
      strContents.Add('</font></BODY ></HTML>');{添加SWF文件相关内容}
    {strContents.Add('< object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0">');
    strContents.Add('< param name=movie value="cid:jdh_swfemail@001" >');
    strContents.Add('< param name=quality value=high >');
    strContents.Add('< embed src="cid:jdh_swfemail@001" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" >');
    strContents.Add('< /embed>< /object >< /BODY >< /HTML >');
    strContents.Add('');
    strContents.Add('--------------SwfEmail by JDH');
    strContents.Add('Content-Type: image/swf');
    strContents.Add('Content-ID: < jdh_swfemail@001 >');
    strContents.Add('Content-Transfer-Encoding: base64');
    strContents.Add('Content-Disposition: inline; filename="'+ExtractFileName('C:\Himem.sys')+'"' );
    strContents.Add('');
    strContents.Add(strsTemp.Text);
    strContents.Add('');}
    {----生成邮件内容结束----}
    {设置邮件发送信息}
    NMSMTP1.PostMessage.FromAddress := txtFrom.Text;
    NMSMTP1.PostMessage.FromName := txtFrom.Text;
    NMSMTP1.PostMessage.ToAddress.Text := txtTo.Text;
    NMSMTP1.PostMessage.Body.Text := strContents.Text;
    NMSMTP1.PostMessage.Subject := txtSubject.Text;
    {发送电子邮件}
    NMSMTP1.SendMail;
    ShowMessage('邮件发送成功!');
    end;procedure TForm1.NMSMTP1Connect(Sender: TObject);
    var
    strUserName,strPassword:string;
    begin
      {如果SMTP服务器需要认证,则进行认证}
      {对用户名和密码进行Base64编码}
      strUserName:=EncodeString('邮箱用户名');
      strPassword:=EncodeString('邮箱密码');
      {进行认证,输入编码后的用户名、密码}
      nmsmtp1.Transaction('auth login');
      nmsmtp1.Transaction(strUserName);
      nmsmtp1.Transaction(strPassword);
    end;procedure TForm1.NMSMTP1SendStart(Sender: TObject);
    begin
    {在邮件发送开始时修改邮件的消息头,标明邮件为多部分组成}
    NMSMTP1.FinalHeader.Values['Content-Type'] := 'multipart/related; boundary="------------SwfEmail by JDH"';
    end;end.
      

  3.   

    关键是认证,有好多代码不要的,他发的是HTML格式,并带了附件。把关键代码抽出来就可以用了,我现在不急用,所以没整理
      

  4.   

    其实idSMTP可以设定帐号密码,服务器需要验证也没问题的.但NMSMTP和SakSMTP就没有这两个属性了.如果用SakSMTP呢??也是无法验证而且没有Transaction函数...有用这个控件的发件例子吗??谢谢.我的e-mail:[email protected]