Delphi 为什么SendMailMAPI将文件附件重命名为较短的附件?
我对Eudora使用以下电子邮件功能。由于某些原因,附件文件名被重命名为其他名称。如何确保附件文件名保持完整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
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中的值放在堆栈的某个地方,并且只在方法的末尾被清除。但把它放到一个变量中确实更好