发送带有附件的电子邮件(客户端无关)

7

我目前有一个应用程序,可以生成pdf礼品券并将其发送给其收件人。然而,我使用的功能是依赖于客户端(MS Outlook)的,我真的很想让这个电子邮件客户端不再与特定客户端相关,因为我们有很多客户,并且并不是所有客户都使用Outlook。

我已经查看了一些选项,但在搜索中并没有找到能够解决我的问题的内容。

是否有人知道一种好的方式,可以使用客户的smtp连接发送电子邮件,而无论客户使用哪个电子邮件客户端,并附带附件,而不必直接调用客户端来完成它?

3个回答

6

或者您可以使用Synapse库来使用SMTP发送邮件,最好使用其最新快照

以下是代码,应该将附加的c:\voucher.pdf文件从sender@from.com发送到recipient@to.com,并通过登录login和密码password将其发送到smtp.server.com。关于TMimeMess类中的其他函数,我建议您直接参考参考文献

我希望这可以工作,因为我已经简化并本地化了我正在使用的更复杂的代码,我无法验证它也无法编译。如果不行,请给我们投反对票:)

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的友好评论(伙计,请改一下你的昵称,它不再酷了:),如果将所有收件人的列表发送给每个人,那么情况会变得非常糟糕。使用synapse,您无法添加BCC到消息头中;在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。 - James West

1

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


2
@Leonardo 当然它不能集成。如果这是一个要求,你可以尝试MAPI - 在JCL中有JclMapi,但并不是所有的电子邮件客户端都能正确支持它。 - Ondrej Kelle
4
@Leonardo:James要求SMTP,这是一种协议,而不是程序。Indy有一个称为TIdSMTP的组件,可直接访问SMTP协议,无需其他电子邮件客户端,因为TIdSMTP 就是 客户端。如果他想跟踪已发送的电子邮件,他将不得不手动执行(例如通过IMAP4协议连接到他的电子邮件服务器 - 请参阅TIdIMAP4组件 - 并将电子邮件上传到所需的文件夹中)。 - Remy Lebeau
同意,如果可用的话,IMAP 更好。 - Ondrej Kelle
这种方法的一个缺点是,在公司/大学环境中使用代理/防火墙将需要用户干预,而像 ZoneAlarm 这样的反恶意软件应用程序将积极阻止它,直到用户将其加入白名单。 - Chris Thornton
1
@Leonardo Herrera,应该用更加优雅的方式完成,例如:BCC。 - Premature Optimization
显示剩余2条评论

0

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

但是请注意检查实际客户端是否支持简单MAPI。


关于链接的Simple MAPI页面的重要信息:不建议使用Simple MAPI。它可能会在后续版本的Windows中被更改或不可用。 - mjn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接