我做了一个多线程的发送email实现,但是在sendmail一步时出现错误,以下是部分代码,base64编码是我从网上找的,已编译测试过,没有问题。
1.创建了一个线程类TSendThread = class(TThread)
type
    TSendThread = class(TThread)
        procedure NMSMTPConnect();
    public        NMSMTP1: TNMSMTP;
        constructor Create(strTo: TStringList; strSubject: string; strBody: TStringList);
        procedure Execute; override;
        function EncodeString(Decoded:string):String;
        function EncodeBASE64(Encoded: TMemoryStream {TMailText};  
                              Decoded: TMemoryStream): Integer; //编码函数
        procedure sendLetter();
    end;
const
    mailuser:string = 'wjdragon76';
    mailpass:string = '*******';implementationconstructor TSendThread.Create(strTo: TStringList; strSubject: string; strBody: TStringList);
begin
        NMSMTP1 := TNMSMTP.Create(nil);
        NMSMTP1.Host := 'smtp.sina.com.cn';
        NMSMTP1.Port := 25;
        NMSMTP1.UserID := 'wjdragon76';
        NMSMTP1.PostMessage.ToAddress := strTo;
        NMSMTP1.PostMessage.Subject := strSubject;
        NMSMTP1.PostMessage.Body := strBody;        inherited Create(False);
        FreeOnTerminate := True;
end;procedure TSendThread.Execute;
begin
        sendletter;
end;procedure TSendThread.NMSMTPConnect;
var
        strUserName,strPassword:string;begin        {对用户名和密码进行Base64编码}
        strUserName:=EncodeString(mailuser);
        strPassword:=EncodeString(mailpass);
        {进行认证,输入编码后的用户名、密码}
        nmsmtp1.Transaction('auth login');
        nmsmtp1.Transaction(strUserName);
        nmsmtp1.Transaction(strPassword);
end;procedure TSendThread.sendLetter;begin
        if  NMSMTP1.Connected then
        begin
        NMSMTP1.Disconnect;
        end;
        NMSMTP1.Connect;
        while not NMSMTP1.Connected do
            NMSMTP1.Connect;        NMSMTPConnect;
        NMSMTP1.SendMail;
end;2.一个窗体
type
    TForm1 = class(TForm)
    Button1: TButton;
    procedure SendClick(Sender: TObject);
  private
    { Private declarations }  public
    { Public declarations }
    toMail : TStringList;
    sSubject: String;
    sContent: TStringList;  end;var
  Form1: TForm1;implementation{$R *.dfm}{ TForm1 }
procedure TForm1.SendClick(Sender: TObject);
var
    sendthread:TSendThread;begin
    toMail := TStringList.Create;
    toMail.Add('[email protected]');    sSubject := 'ok';    sContent := TStringList.Create;
    sContent.Add('this is my mail');
    sendthread := TSendThread.Create(toMail,sSubject,sContent);
end;
在运行到sendletter中的最后一步也就是sendmail时出现错误:
project sendmail.exe raised exception class Exception with message 'Incomplete Header'.Process stopped .Used Step or Run to continue
我弄不清楚问题出在何处?请大家赐教,谢谢

解决方案 »

  1.   

    sina的需要验证身份,才能发。。换个不要验证的stmp试试
      

  2.   

    身份的验证已经考虑了,不要验证的基本很少了,似乎没有了,我试过smtp.163.com和smtp.xinhuanet.com结果这次的错误出现在了sendletter中的第一个NMSMTP1.Connect;提示信息和以上的同样。
      

  3.   

    现在基本上大多数邮箱都需要身份验证
    而Delphi5的TNMSMTP控件没有验证信息,建议用Delphi7的TSMTP
      

  4.   

    这是我看到的别人的一篇文章
    转载
                首先 在indy clients 页上 摘取一个TidSMTP控件(就是那个蓝颜色的柜子啦),然后 在indy misc 页上 
                摘取一个TIdMessage控件(象一个信笺的东东)。呵呵,我们给他们取名为SMTP和IdMsgSend 。            然后开始自己的如下代码            procedure Tform1.SendAlarmEmail;
                begin
                if SMTPAuthority then //SMTPAuthority 是 表示这个SMTP服务器是否需要认证的boolean
                SMTP.AuthenticationType := atLogin
                else SMTP.AuthenticationType := atNone;
                SMTP.UserID := [email protected];//帐户
                SMTP.Password := **********;//密码
                {General setup}
                SMTP.Host := SMTP.263.net;
                SMTP.Port := 25;
                try
                SMTP.Connect;
                except
                Showmessage(‘连接SMTP服务器失败!‘);
                Exit;
                end;
                try
                with IdMsgSend do
                begin
                body.Clear;
                Body.Add(‘hello world‘);//内容
                From.Text := ‘[email protected]‘;
                Recipients.EMailAddresses :=‘[email protected]‘//收件人
                Subject:=‘老友,哈喽‘//主题
                end;
                SMTP.Send(IdMsgSend);
                finally
                SMTP.Disconnect;
                end;
                end;