Delphi 使用Indy组件的最大消息长度
我正在尝试使用delphi代码发送消息Delphi 使用Indy组件的最大消息长度,delphi,indy,indy-9,Delphi,Indy,Indy 9,我正在尝试使用delphi代码发送消息TIdMessage。该消息由两部分组成:text/plain和text/html。 我有一个html页面作为模板和一些需要插入到模板中的大文本(在标记为#######文本的特殊位置)。合并模板和文本后,我得到新邮件的正文。然后我发送此消息(使用TIdMessage和tidmtp),但结果消息只包含文本的第二部分。文本有40000多个字符。 当我发送没有html tmplate(只有大文本)的消息时,一切都正常 如何设置消息的长度 我试图设置FIdMessa
TIdMessage
。该消息由两部分组成:text/plain
和text/html
。
我有一个html页面作为模板和一些需要插入到模板中的大文本(在标记为#######文本的特殊位置)。合并模板和文本后,我得到新邮件的正文。然后我发送此消息(使用TIdMessage
和tidmtp
),但结果消息只包含文本的第二部分。文本有40000多个字符。
当我发送没有html tmplate(只有大文本)的消息时,一切都正常
如何设置消息的长度
我试图设置FIdMessage.contentTransferencode:='quoted printable'和fidstp.MsgLineLength:=MAXWORD代码>但这对我没有帮助
提前感谢。
以下是一些代码:
var
FSMTP: TIdSMTP;
FIdMessage: TIdMessage;
idx: integer;
i: Integer;
FIdText: TIdText;
begin
FSMTP := TIdSMTP.Create( nil );
FIdMessage := TIdMessage.Create( nil );
try
try
FIdMessage.ExtraHeaders.Clear;
FIdMessage.MessageParts.Clear;
// Attachments
for idx := 0 to Attachments.Count - 1 do
TIdAttachment.Create( FIdMessage.MessageParts,
TEmailAttachment( Attachments.Items[ idx ] ).FLocalTemplateName );
FIdMessage.From.Text := FFrom;
FIdMessage.Recipients.EMailAddresses := FTo;
FIdMessage.Subject := FSubject;
if (FHtmlTemplateFilePath <> '') then
begin
FIdMessage.ContentType := 'multiparts/related; type="text/html"';
AddAttachements(FIdMessage); // procedure that added Attachments
FIdText := TIdText.Create(FIdMessage.MessageParts, nil);
FIdText.Body.Text := 'Please view a html version of this email';
FIdText.ContentType := 'text/plain';
FIdText := TIdText.Create(FIdMessage.MessageParts, nil);
FIdText.Body.Text := FBody;
FIdText.ContentType := 'text/html';
end
else
begin
FIdMessage.Body.Text := FBody;
end;
FIdMessage.CCList.Clear;
FIdMessage.ReceiptRecipient.Text := '';
FSMTP.AuthenticationType := FSMTPAuthenticationType;
FSMTP.UserID := FSMTPUserID;
FSMTP.Password := FSMTPPassword;
FSMTP.Host := FSMTPHost;
FSMTP.Port := FSMTPPort;
FSMTP.MsgLineLength := MAXWORD;
RepeatRetryCount := FSMTPRepeatRetryCount;
FSMTP.Connect;
try
FSMTP.Send( FIdMessage );
finally
FSMTP.Disconnect;
end;
except
end;
finally
FSMTP.Free;
FIdMessage.Free;
end;
end;
procedure AddAttachements(AIdMessage: TidMessage);
var
LCid: Integer;
LFileName, LFileExt, LSearchFolder: String;
LSearchResult: TSearchRec;
Attachment: TIdAttachment;
begin
FHtmlCids.Clear;
LSearchFolder := ExtractFilePath(FHtmlTemplateFilePath)+ChangeFileExt(ExtractFileName(FHtmlTemplateFilePath),'');
if (FindFirst(LSearchFolder + '_*', faDirectory, LSearchResult)=0) or
(FindFirst(LSearchFolder + '.*', faDirectory, LSearchResult)=0)
then
LSearchFolder := LSearchResult.Name;
FindClose(LSearchResult);
if FindFirst(ExtractFilePath(FHtmlTemplateFilePath)+LSearchFolder+'\*.*', faAnyFile - faDirectory, LSearchResult)=0 then
begin
repeat
Attachment := TIdAttachment.Create(AIdMessage.MessageParts, ExtractFilePath(FHtmlTemplateFilePath)+ LSearchFolder + '\' + LSearchResult.Name);
LCid := Random(MaxInt);
Attachment.ExtraHeaders.Values['Content-ID'] := IntToStr(LCid);
LFileName := ExtractFileName(LSearchResult.Name);
LFileExt := ExtractFileExt(LSearchResult.Name);
if UpperCase(LFileExt) = '.XML' then
Attachment.ContentType := 'text/xml'
else if UpperCase(LFileExt) = '.PNG' then
Attachment.ContentType := 'image/png'
else if UpperCase(LFileExt) = '.THMX' then
Attachment.ContentType := 'application/vnd.ms-officetheme'
else if UpperCase(LFileExt) = '.JPG' then
Attachment.ContentType := 'image/jpeg'
else if UpperCase(LFileExt) = '.GIF' then
Attachment.ContentType := 'image/gif'
else if UpperCase(LFileExt) = '.SVG' then
Attachment.ContentType := 'image/svg+xml'
else if UpperCase(LFileExt) = '.TIF' then
Attachment.ContentType := 'image/tiff'
else if UpperCase(LFileExt) = '.TIFF' then
Attachment.ContentType := 'image/tiff'
else if UpperCase(LFileExt) = '.ICO' then
Attachment.ContentType := 'image/vnd.microsoft.icon'
else if UpperCase(LFileExt) = '.BMP' then
Attachment.ContentType := 'image/bmp'
else if UpperCase(LFileExt) = '.CSS' then
Attachment.ContentType := 'text/css'
else if UpperCase(LFileExt) = '.JS' then
Attachment.ContentType := 'application/javascript'
else if UpperCase(LFileExt) = '.JPEG' then
Attachment.ContentType := 'image/jpeg'
else if UpperCase(LFileExt) = '.WMZ' then
Attachment.ContentType := 'application/x-ms-wmz'
else raise Exception.CreateFmt('Unknown file type "%s"', [LFileExt]);
FHtmlCids.AddObject(LSearchFolder+'/'+LFileName, TObject(LCid));
FHtmlCids.AddObject(UrlEncode(LSearchFolder+'/'+LFileName), TObject(LCid));
until FindNext(LSearchResult)<>0;
FindClose(LSearchResult);
end;
FHtmlCids.Sort;
end;
var
FSMTP:tidstp;
FIdMessage:TIdMessage;
idx:整数;
i:整数;
FIdText:TIdText;
开始
FSMTP:=tidstp.Create(nil);
FIdMessage:=TIdMessage.Create(无);
尝试
尝试
FIdMessage.ExtraHeaders.Clear;
FIdMessage.MessageParts.Clear;
//附件
对于idx:=0到附件。计数-1 do
TIdAttachment.Create(FIdMessage.MessageParts,
TEmailAttachment(Attachments.Items[idx]).FLocalTemplateName);
FIdMessage.From.Text:=FFrom;
FIdMessage.Recipients.EMailAddresses:=FTo;
FIdMessage.Subject:=FSubject;
如果(FHtmlTemplateFilePath“”),则
开始
FIdMessage.ContentType:='多部分/相关;type=“text/html”;
添加附件(FIdMessage);//添加附件的过程
FIdText:=TIdText.Create(FIdMessage.MessageParts,nil);
FIdText.Body.Text:=“请查看此电子邮件的html版本”;
FIdText.ContentType:=“文本/普通”;
FIdText:=TIdText.Create(FIdMessage.MessageParts,nil);
FIdText.Body.Text:=FBody;
FIdText.ContentType:='text/html';
结束
其他的
开始
FIdMessage.Body.Text:=FBody;
结束;
FIdMessage.CCList.Clear;
FIdMessage.ReceiptRecipient.Text:='';
FSMTP.AuthenticationType:=FSMTPAuthenticationType;
FSMTP.UserID:=FSMTPUserID;
FSMTP.Password:=FSMTPPassword;
FSMTP.Host:=FSMTPHost;
FSMTP.Port:=FSMTPPort;
FSMTP.MsgLineLength:=MAXWORD;
RepeatRetryCount:=FSMTPrefeatureCount;
连接;
尝试
FSMTP.Send(FIdMessage);
最后
断开连接;
结束;
除了
结束;
最后
免费;
免费;
结束;
结束;
程序添加附件(AIdMessage:TidMessage);
变量
LCid:整数;
LFileName、LFileExt、LSearchFolder:String;
LSearchResult:TSearchRec;
附件:TID附件;
开始
FHtmlCids.Clear;
LSearchFolder:=ExtractFilePath(FHtmlTemplateFilePath)+ChangeFileExt(ExtractFileName(FHtmlTemplateFilePath),“”;
如果(FindFirst(LSearchFolder+'*',faDirectory,LSearchResult)=0)或
(FindFirst(LSearchFolder+'.*',faDirectory,LSearchResult)=0)
然后
LSearchFolder:=LSearchResult.Name;
FindClose(LSearchResult);
如果FindFirst(ExtractFilePath(FHtmlTemplateFilePath)+LSearchFolder+'\*.*',faAnyFile-faDirectory,LSearchResult)=0,则
开始
重复
附件:=TIdAttachment.Create(AIdMessage.MessageParts,ExtractFilePath(FHtmlTemplateFilePath)+LSearchFolder+'\'+LSearchResult.Name);
LCid:=随机(最大值);
附件.ExtraHeaders.Values['Content-ID']:=IntToStr(LCid);
LFileName:=ExtractFileName(LSearchResult.Name);
lfilext:=ExtractFileExt(LSearchResult.Name);
如果大写(lfilext)=“.XML”,则
Attachment.ContentType:=“文本/xml”
否则,如果大写字母(LFileExt)=“.PNG”,则
附件.ContentType:=“图像/png”
否则,如果大写字母(LFileExt)='.THMX',则
附件.ContentType:=“应用程序/vnd.ms officetheme”
否则,如果大写字母(LFileExt)='.JPG',则
附件.ContentType:=“图像/jpeg”
否则,如果大写字母(LFileExt)='.GIF',则
Attachment.ContentType:=“图像/gif”
否则,如果大写字母(LFileExt)='.SVG',则
Attachment.ContentType:=“图像/svg+xml”
否则,如果大写字母(LFileExt)='.TIF',则
附件.ContentType:=“图像/tiff”
否则,如果大写字母(LFileExt)='.TIFF',则
附件.ContentType:=“图像/tiff”
否则,如果大写字母(LFileExt)='.ICO',则
Attachment.ContentType:=“image/vnd.microsoft.icon”
否则,如果大写字母(LFileExt)=“.BMP”,则
Attachment.ContentType:=“图像/bmp”
否则,如果大写字母(LFileExt)='.CSS',则
Attachment.ContentType:=“文本/css”
否则,如果大写字母(LFileExt)='.JS',则
Attachment.ContentType:=“应用程序/javascript”
否则,如果大写字母(LFileExt)=“.JPEG”,则
附件.ContentType:=“图像/jpeg”
否则,如果大写字母(LFileExt)='.WMZ',则
附件.ContentType:=“应用程序/x-ms-wmz”
else引发异常。CreateFmt('未知文件类型“%s”,[lfilext]);
FHtmlCids.AddObject(LSearchFolder+'/'+LFileName,TObject(LCid));
AddObject(UrlEncode(LSearchFolder+'/'+LFileName),TObject(LCid));
直到FindNext(LSearchResult)0;
FindClose(LSearchResult);
结束;
FHtmlCids.Sort;
结束;
TIdMessage
不限制文本长度。还有别的事情。我的猜测是,您根本没有正确填写TIdMessage
。您没有显示AddAttachments()
代码,但是在TIdText
对象之前添加了TIdAttachment
对象,这是错误的,尤其是对于您正在使用的ContentType
。我建议您阅读Indy网站上的以下博客文章,了解HTML电子邮件的正确结构
<html>
....
<body>
some large text <br> in one line. This text have more 40,000 characrets.....
</body>
</html>
<html>
....
<body>
some large text <br>
in one line. This text have more 40,000 characrets.....
</body>
</html>