我有一个Delphi 6应用程序生成电子邮件,我发送到我的Evernote电子邮件地址,这是一个特殊的电子邮件地址,用于通过电子邮件发送文件,以便它们自动存储到我的Evernote帐户中。 / p>
我已成功创建HTML文档,并使用Indy 9.x TIdSMTP 组件将它们发送到我的Evernote电子邮件地址。我将内容类型设置为' text / html '。它可以正常运行,因为我没有向电子邮件添加任何附件。只要我添加附件,有关生成的电子邮件的内容就会使Evernote Web界面将电子邮件解释为原始HTML 。换句话说,我在文档显示区域看到原始HTML,好像我在浏览器中完成了“view-source”,而不是看到呈现的网页。我添加的电子邮件附件是AVI文件和WAV文件,如果重要的话。当我添加附件时,它们都会在Evernote网页显示区域的电子邮件底部正确显示。
重复一遍,只要我不添加附件,文档就会在Evernote Web界面中显示为漂亮的网页。如果我添加附件,我会看到原始HTML。任何人都可以建议我可以尝试解决这个问题吗?我附上了用于将生成的文档发送到下面的Evernote电子邮件地址的代码。名为 body 的变量包含完全格式化的HTML文档。
更新:我将电子邮件发送到非Evernote电子邮件地址,以便查看原始电子邮件。我发现添加附件使TIdSMTP将其生成的多部分电子邮件的第一部分的Content-Type更改为“text / plain”,尽管我在代码中将其设置为“text / html”我创建了这条消息。我将看看Indy的来源,看看我是否能弄清楚出了什么问题。
function easySendEmail(
theIdSmtp : TIdSmtp;
destEMailAddress : string;
subject : string;
body : string;
emailServerSettings : TEmailServerSettingsRecord;
aryAttachmentFilenames : TDynamicStringArray;
connectTimeOut_ms : integer;
bUseEHLO : boolean;
authLoginType : TAuthenticationType): boolean;
var
IdMsg: TIdMessage;
aryAttachments: TDynamicIdAttachmentArray;
i: integer;
begin
aryAttachments := nil;
IdMsg := nil;
destEMailAddress := Trim(destEMailAddress);
if destEMailAddress = '' then
raise Exception.Create('(TframeEmailServerSettings.easySendEmail) The destination E-mail address is empty.');
subject := Trim(subject);
if subject = '' then
raise Exception.Create('(TframeEmailServerSettings.easySendEmail) The subject line is empty.');
body := Trim(body);
if body = '' then
raise Exception.Create('(TframeEmailServerSettings.easySendEmail) The message body is empty.');
try
with emailServerSettings do
begin
// Build a test message and send it.
IdMsg := TIdMessage.Create(nil);
IdMsg.Recipients.EMailAddresses := destEMailAddress;
{
Most SMTP servers require the sending E-mail address as the
user name for the authentication. However, if we
encounter one that doesn't work this way then re-using
the authentication user name as the From address
will not work.
}
IdMsg.From.Name := APPLICATION_NAME_EVERMAIL;
IdMsg.From.Address := user_name;
IdMsg.Subject := subject;
IdMsg.Body.Text := body;
IdMsg.ContentType := 'text/html';
// IdMsg.ContentType := 'text/plain';
theIdSmtp.Host := host;
theIdSmtp.Username := user_name;
theIdSmtp.Password := password;
theIdSmtp.Port := port_number;
// Use EHLO method.
theIdSmtp.UseEhlo := true;
// Login method of authentication.
theIdSmtp.AuthenticationType := atLogin;
// Add the attachments.
// >>> If I comment out the code below the document shows
// up as a rendered web page in the Evernote web interface.
// If I uncomment it and therefore add attachments, the
// document shows up as raw HTML.
{
if Length(aryAttachmentFilenames) > 0 then
begin
SetLength(aryAttachments, Length(aryAttachmentFilenames));
for i := Low(aryAttachmentFilenames) to High(aryAttachmentFilenames) do
// Add each attachment.
aryAttachments[i] := TIdAttachment.Create(IdMsg.MessageParts, aryAttachmentFilenames[i]);
end; // if Length(aryAttachmentFilenames) > 0 then
}
// Connect to the desired SMTP server. N second time-out.
theIdSmtp.Connect(connectTimeOut_ms);
// Send it.
theIdSmtp.Send(IdMsg);
// If we got here than the test succeeded. Set the flag
// indicating the current settings are valid.
Result := true;
end; // with mergeEditsWithOriginal do
finally
theIdSmtp.Disconnect;
if Assigned(IdMsg) then
IdMsg.Free;
end; // try
end;
答案 0 :(得分:6)
当附件存在时,您的代码未正确设置TIdMessage
。试试这个:
function easySendEmail(
theIdSmtp : TIdSmtp;
destEMailAddress : string;
theSubject : string;
theBody : string;
emailServerSettings : TEmailServerSettingsRecord;
aryAttachmentFilenames : TDynamicStringArray;
connectTimeOut_ms : integer;
bUseEHLO : boolean;
authLoginType : TAuthenticationType): boolean;
var
IdMsg: TIdMessage;
i: integer;
begin
destEMailAddress := Trim(destEMailAddress);
if destEMailAddress = '' then
raise Exception.Create('(TframeEmailServerSettings.easySendEmail) The destination E-mail address is empty.');
theSubject := Trim(theSubject);
if theSubject = '' then
raise Exception.Create('(TframeEmailServerSettings.easySendEmail) The subject line is empty.');
theBody := Trim(theBody);
if theBody = '' then
raise Exception.Create('(TframeEmailServerSettings.easySendEmail) The message body is empty.');
IdMsg := TIdMessage.Create(nil);
try
with emailServerSettings do
begin
// Build a test message and send it.
IdMsg.Recipients.EMailAddresses := destEMailAddress;
{
Most SMTP servers require the sending E-mail address as the
user name for the authentication. However, if we
encounter one that doesn't work this way then re-using
the authentication user name as the From address
will not work.
}
IdMsg.From.Name := APPLICATION_NAME_EVERMAIL;
IdMsg.From.Address := user_name;
IdMsg.Subject := theSubject;
// Add the attachments.
if Length(aryAttachmentFilenames) > 0 then
begin
with TIdText.Create(IdMsg.MessageParts, nil) do
begin
Body.Text := 'An HTML viewer is required to see this message';
ContentType := 'text/plain';
end;
with TIdText.Create(IdMsg.MessageParts, nil) do
begin
Body.Text := theBody;
ContentType := 'text/html';
end;
// Add each attachment.
for i := Low(aryAttachmentFilenames) to High(aryAttachmentFilenames) do
TIdAttachment.Create(IdMsg.MessageParts, aryAttachmentFilenames[i]);
IdMsg.ContentType := 'multipart/mixed';
end else
begin
IdMsg.Body.Text := theBody;
IdMsg.ContentType := 'text/html';
end; // if Length(aryAttachmentFilenames) > 0 then
theIdSmtp.Host := host;
theIdSmtp.Username := user_name;
theIdSmtp.Password := password;
theIdSmtp.Port := port_number;
// Use EHLO method.
theIdSmtp.UseEhlo := true;
// Login method of authentication.
theIdSmtp.AuthenticationType := atLogin;
// Connect to the desired SMTP server. N second time-out.
theIdSmtp.Connect(connectTimeOut_ms);
try
// Send it.
theIdSmtp.Send(IdMsg);
// If we got here than the test succeeded. Set the flag
// indicating the current settings are valid.
Result := true;
finally
theIdSmtp.Disconnect;
end;
end; // with emailServerSettings do
finally
IdMsg.Free;
end; // try
end;