【问题标题】:Send an email with attachment Client Agnostic发送带有附件的电子邮件客户端不可知论
【发布时间】:2011-07-20 16:09:51
【问题描述】:

我目前编写了一个应用程序,可以生成 pdf 凭证和电子邮件给他们的潜在收件人。但是我使用的功能是依赖于客户端的(MS Outlook),我真的很想让这个电子邮件客户端不可知,因为我们有很多客户,并不是所有的客户都使用 Outlook。

我查看了一些选项,但在搜索中找不到任何似乎可以解决我的问题的内容。

有没有人知道一种使用客户 smtp 连接发送电子邮件的好方法,而不管客户端如何,并使用它发送附件而无需直接调用客户端来执行此操作?

【问题讨论】:

    标签: delphi delphi-2010


    【解决方案1】:

    或者您可以使用Synapse 库来使用 SMTP 发送邮件,最好是在其newest snapshot 中。

    这里是应该使用登录login 和密码password 将邮件从sender@from.comrecipient@to.com 发送到smtp.server.com 的附加c:\voucher.pdf 文件的代码。关于 TMimeMess 类中的其余函数,我会直接将您推荐给 the reference

    我希望这会起作用,因为我已经简化并本地化了我正在使用的更复杂的代码,但我无法验证它也无法编译。如果没有,让我们投反对票:)

    uses
      SMTPSend, MIMEPart, MIMEMess;
    
    procedure TForm.SendEmailClick(Sender: TObject);
    var
      MIMEText: TStrings;
      MIMEPart: TMimePart;
      MIMEMessage: TMimeMess;
    begin
      MIMEText := TStringList.Create;
      MIMEText.Add('Hello,');
      MIMEText.Add('here is the text of your e-mail message,');
      MIMEText.Add('if you want the HTML format, use AddPartHTML');
      MIMEText.Add('or e.g. AddPartHTMLFromFile if you have your');
      MIMEText.Add('HTML message content in a file.');
    
      MIMEMessage := TMimeMess.Create;
    
      with MIMEMessage do
      try
        Header.Date := Now;
        Header.From := 'sender@from.com';
        Header.ToList.Clear;
        Header.ToList.Add('recipient@to.com');
        Header.CcList.Clear;
        Header.Subject := 'E-mail subject';
        Header.XMailer := 'My mail client name';
    
        MIMEPart := AddPartMultipart('mixed', nil);
    
        AddPartText(MIMEText, MIMEPart);
        AddPartBinaryFromFile('c:\voucher.pdf', MIMEPart);
    
        EncodeMessage;
    
        if SendToRaw(Header.From,               // e-mail sender
                     Header.ToList.CommaText,   // comma delimited recipient list
                     'smtp.server.com',         // SMTP server
                     Lines,                     // MIME message data
                     'login',                   // server authentication
                     'password')                // server authentication
        then
          ShowMessage('E-mail has been successfuly sent :)')
        else
          ShowMessage('E-mail sending failed :(');
      finally
        Free;
        MIMEText.Free;
      end;
    end;
    


    更新:

    根据Downvoter step into the light 的好评论(伙计,请更改您的昵称,它不再酷了 :),如果您将所有收件人的列表发送给每个人,那将是非常糟糕的。使用突触you cannot 将密件抄送添加到消息头; MIMEMessage 中没有 Header.BCCList 属性。 相反,您可以在发送数据之前直接修改数据。

    // First, you will remove the line where you are adding a recipient to the list
    Header.ToList.Add('recipient@to.com');
    
    // the rest between you can keep as it is and after the message encoding
    EncodeMessage;
    
    // and before sending the mail you'll insert the line with BCCs
    Lines.Insert(1, 'Bcc: jane@invisiblecustomer.com, lisa@invisiblecustomer.com');
    
    if SendToRaw ...
    

    【讨论】:

    • 我要试一试这条路线。 cc不会是问题。该应用程序仅向一个收件人发送凭证。该程序生成 10-15 种不同的代金券,并将它们通过电子邮件发送给我们的客户客户。一个收件人在整个过程中。当前使用 Outlook 的实现就像一个魅力,但如前所述,并非所有人都在使用 Outlook。
    【解决方案2】:

    您可以使用Indy 作为您的 SMTP 客户端,独立于系统默认电子邮件客户端。这是发送不带附件的电子邮件的基本demo,还有关于发送带或不带附件的 HTML 或纯文本电子邮件的详细文章 herehere

    【讨论】:

    • 但这不会与用户的电子邮件客户端集成(即,他将无法跟踪已发送的电子邮件。)这不是一个简单的设计决定!
    • @Leonardo 当然它不会集成。如果这是您的要求,您可以尝试 MAPI - JclMapiJCL 中有 JclMapi 但话又说回来,并非所有电子邮件客户端都支持它。
    • @Leonardo:James 要求使用 SMTP,它是一种协议,而不是程序。 Indy 有一个TIdSMTP 组件直接访问 SMTP 协议,不需要其他电子邮件客户端,因为 TIdSMTP 客户端。如果他想跟踪已发送的电子邮件,他将不得不手动进行(例如通过 IMAP4 协议连接到他的电子邮件服务器 - 请参阅TIdIMAP4 组件 - 并将电子邮件上传到所需的文件夹)。
    • 同意,IMAP 更好,如果可用的话。
    • @Leonardo Herrera,应该以不那么粗糙的方式完成,例如:BCC
    【解决方案3】:

    如果您想与现有的电子邮件客户端集成(例如在电子邮件客户端的sentsent items 等文件夹中查看已发送的消息),您可以使用Simple MAPI。标题在 Delphi 中的 Mapi 单元中翻译(至少在 D2007 中)。

    但要小心检查实际客户端是否支持 Simple MAPI。

    【讨论】:

    • 链接的简单 MAPI 页面上的重要信息:The use of Simple MAPI is discouraged. It may be altered or unavailable in subsequent versions of Windows.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2013-04-03
    • 2010-11-09
    • 2016-08-18
    • 1970-01-01
    • 2021-05-23
    • 2012-07-07
    相关资源
    最近更新 更多