添加绑定到Evernote电子邮件地址的电子邮件的附件会使用Indy TIdSMTP组件失败HTML内容类型声明

时间:2012-06-05 03:33:49

标签: delphi smtp evernote indy-9

我有一个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;

1 个答案:

答案 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;