Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么SendMailMAPI将文件附件重命名为较短的附件?_Delphi_Email_Mapi - Fatal编程技术网

Delphi 为什么SendMailMAPI将文件附件重命名为较短的附件?

Delphi 为什么SendMailMAPI将文件附件重命名为较短的附件?,delphi,email,mapi,Delphi,Email,Mapi,我对Eudora使用以下电子邮件功能。由于某些原因,附件文件名被重命名为其他名称。如何确保附件文件名保持完整 function SendMailMAPI(const Subject, Body, FileName, SenderName, SenderEMail, RecepientName, RecepientEMail: String) : Integer; var message: TMapiMessage; lpSender, l

我对Eudora使用以下电子邮件功能。由于某些原因,附件文件名被重命名为其他名称。如何确保附件文件名保持完整

function SendMailMAPI(const Subject, Body, FileName, SenderName, SenderEMail, 
                  RecepientName, RecepientEMail: String) : Integer; 
var 
  message: TMapiMessage; 
  lpSender, 
  lpRecepient: TMapiRecipDesc; 
  FileAttach: TMapiFileDesc; 
  SM: TFNMapiSendMail; 
  MAPIModule: HModule; 
begin 
  FillChar(message, SizeOf(message), 0); 
  with message do 
  begin 
    if (Subject<>'') then 
    begin 
      lpszSubject := PChar(Subject) 
    end; 
    if (Body<>'') then 
    begin 
      lpszNoteText := PChar(Body) 
    end; 
    if (SenderEMail<>'') then 
    begin 
      lpSender.ulRecipClass := MAPI_ORIG; 
      if (SenderName='') then 
      begin 
        lpSender.lpszName := PChar(SenderEMail) 
      end 
      else 
      begin 
        lpSender.lpszName := PChar(SenderName) 
      end; 
      lpSender.lpszAddress := PChar('SMTP:'+SenderEMail); 
      lpSender.ulReserved := 0; 
      lpSender.ulEIDSize := 0; 
      lpSender.lpEntryID := nil; 
      lpOriginator := @lpSender; 
    end; 
    if (RecepientEMail<>'') then 
    begin 
      lpRecepient.ulRecipClass := MAPI_TO; 
      if (RecepientName='') then 
      begin 
        lpRecepient.lpszName := PChar(RecepientEMail) 
      end 
      else 
      begin 
        lpRecepient.lpszName := PChar(RecepientName) 
      end; 
      lpRecepient.lpszAddress := PChar('SMTP:'+RecepientEMail); 
      lpRecepient.ulReserved := 0; 
      lpRecepient.ulEIDSize := 0; 
      lpRecepient.lpEntryID := nil; 
      nRecipCount := 1; 
      lpRecips := @lpRecepient; 
    end 
    else 
    begin 
      lpRecips := nil 
    end; 
    if (FileName='') then 
    begin 
      nFileCount := 0; 
      lpFiles := nil; 
    end 
    else 
    begin 
      FillChar(FileAttach, SizeOf(FileAttach), 0); 
      FileAttach.nPosition := Cardinal($FFFFFFFF); 
      FileAttach.lpszPathName := PChar(FileName); 
      nFileCount := 1; 
      lpFiles := @FileAttach; 
    end; 
  end; 
  MAPIModule := LoadLibrary(PChar(MAPIDLL)); 
  if MAPIModule=0 then 
  begin 
    Result := -1 
  end 
  else 
  begin 
    try 
      @SM := GetProcAddress(MAPIModule, 'MAPISendMail'); 
      if @SM<>nil then 
      begin 
        Result := SM(0, Application.Handle, message, MAPI_DIALOG or 
                     MAPI_LOGON_UI, 0); 
      end 
      else 
      begin 
        Result := 1 
      end; 

    finally 
      FreeLibrary(MAPIModule); 
    end; 
  end; 
  if Result<>0 then 
  begin 
    MessageDlg('Error sending mail ('+IntToStr(Result)+').', mtError, [mbOk], 
               0) 
  end; 
函数SendMailMAPI(常量主题、正文、文件名、SenderName、SenderEMail、, RecepientName,RecepientMail:String):整数; 变量 消息:TMapiMessage; lpSender, lpRecepient:TMapiRecipDesc; FileAttach:TMapiFileDesc; SM:TFNMapiSendMail; MAPIModule:HModule; 开始 FillChar(消息,SizeOf(消息),0); 有消息吗 开始 如果(主题“”),则 开始 lpszSubject:=PChar(Subject) 结束; 如果(正文“”),则 开始 lpszNoteText:=PChar(正文) 结束; 如果(SenderEMail“”),则 开始 lpSender.ulRecipClass:=MAPI_ORIG; 如果(SenderName=“”),则 开始 lpSender.lpszName:=PChar(SenderEMail) 结束 其他的 开始 lpSender.lpszName:=PChar(SenderName) 结束; lpSender.lpszAddress:=PChar('SMTP:'+SenderEMail); lpSender.ulReserved:=0; lpSender.ulEIDSize:=0; lpSender.lpEntryID:=nil; lpSender:=@lpSender; 结束; 如果(接收邮件“”),则 开始 lpRecepient.ulRecipClass:=MAPI_TO; 如果(RecepientName=''),则 开始 lpRecepient.lpszName:=PChar(RecepientEMail) 结束 其他的 开始 lpRecepient.lpszName:=PChar(RecepientName) 结束; lpRecepient.lpszAddress:=PChar('SMTP:'+RecepientEMail); lpRecepient.ulReserved:=0; lpRecepient.ulEIDSize:=0; lpRecepient.lpEntryID:=nil; nRecipCount:=1; lpRecips:=@lpRecepient; 结束 其他的 开始 lpRecips:=nil 结束; 如果(文件名=“”),则 开始 nFileCount:=0; lpFiles:=nil; 结束 其他的 开始 FillChar(FileAttach,SizeOf(FileAttach),0); FileAttach.nPosition:=基数($ffffffffff); FileAttach.lpszPathName:=PChar(文件名); nFileCount:=1; lpFiles:=@FileAttach; 结束; 结束; MAPIModule:=加载库(PChar(MAPIDLL)); 如果MAPIModule=0,则 开始 结果:=-1 结束 其他的 开始 尝试 @SM:=GetProcAddress(MAPIModule,'MAPISendMail'); 如果@SMnil那么 开始 结果:=SM(0,应用程序句柄,消息,MAPI_对话框或 MAPI\u登录\u UI,0); 结束 其他的 开始 结果:=1 结束; 最后 免费图书馆(MAPI模块); 结束; 结束; 如果结果是 开始 MessageDlg('Error sending mail('+IntToStr(Result)+')。,mtError,[mbOk], 0) 结束;
您必须将
FileAttach.lpszFileName
设置为希望收件人看到的名称。如果您不这样做,像“C:\Document And Settings\MyUser\Local Settings\Temp\Hello.pdf”这样的附件对收件人来说就像“C\uuu DOCUME~1\umyuser\u LOCALS~1\utemp\uhello.pdf”(每个电子邮件客户端可能不同)

因此,将FileAttach.lpszPathName设置为仅包含文件名:

begin 
  FillChar(FileAttach, SizeOf(FileAttach), 0); 
  FileAttach.nPosition := Cardinal($FFFFFFFF); 
  FileAttach.lpszPathName := PChar(FileName); 
  FileAttach.lpszFileName := PChar(ExtractFileName(FileName)); //add this
  nFileCount := 1; 
  lpFiles := @FileAttach; 
end;

收件人现在将看到名为“Hello.pdf”的附件,而不是“C_uudocume~1_umyuser\u LOCALS~1_utemp\u Hello.pdf”。

您必须将
FileAttach.lpszFileName
设置为希望收件人看到的名称。如果您不这样做,像“C:\Document And Settings\MyUser\Local Settings\Temp\Hello.pdf”这样的附件对收件人来说就像“C\uuu DOCUME~1\umyuser\u LOCALS~1\utemp\uhello.pdf”(每个电子邮件客户端可能不同)

因此,将FileAttach.lpszPathName设置为仅包含文件名:

begin 
  FillChar(FileAttach, SizeOf(FileAttach), 0); 
  FileAttach.nPosition := Cardinal($FFFFFFFF); 
  FileAttach.lpszPathName := PChar(FileName); 
  FileAttach.lpszFileName := PChar(ExtractFileName(FileName)); //add this
  nFileCount := 1; 
  lpFiles := @FileAttach; 
end;

收件人现在将看到一个名为“Hello.pdf”的附件,而不是“C_uuudocume~1_umyuser\u LOCALS~1_utemp\u Hello.pdf”。

谢谢,这没有影响任何内容,这可能是对EUDORA使用的限制吗?这是随机取的名字。汤姆,要确定这是否是尤多拉的错,请通过另一个客户端发送电子邮件。它是否仍然具有相同的附件名称?我将使用Wireshark确认您的程序发送到SMTP服务器的确切内容。如果Wireshark显示了正确的文件名,而多个不同的客户端收到了错误的文件名,那么您将被SMTP、POP或IMAP服务器中途更改名称,或者可能是客户端上的病毒扫描代理。the_Fox的示例是为lpszFileName值分配一个临时指针。当MAPI看到该值时,指针将不再有效。首先将ExtractFileName()的结果赋给一个字符串变量,然后在赋给lpszFileName时将其赋给PChar()。@Remy Lebeau:我实际上尝试了一下,看看它是否无效,但是ExtractFileName中的值放在堆栈的某个地方,并且只在方法的末尾被清除。但是把它放在一个变量中确实更好。感谢这并没有影响任何事情,这会是EUDORA被使用的一个限制吗?这是随机取的名字。汤姆,要确定这是否是尤多拉的错,请通过另一个客户端发送电子邮件。它是否仍然具有相同的附件名称?我将使用Wireshark确认您的程序发送到SMTP服务器的确切内容。如果Wireshark显示了正确的文件名,而多个不同的客户端收到了错误的文件名,那么您将被SMTP、POP或IMAP服务器中途更改名称,或者可能是客户端上的病毒扫描代理。the_Fox的示例是为lpszFileName值分配一个临时指针。当MAPI看到该值时,指针将不再有效。首先将ExtractFileName()的结果赋给一个字符串变量,然后在赋给lpszFileName时将其赋给PChar()。@Remy Lebeau:我实际上尝试了一下,看看它是否无效,但是ExtractFileName中的值放在堆栈的某个地方,并且只在方法的末尾被清除。但把它放到一个变量中确实更好