【问题标题】:Change sender when sending email with TIdSmtp使用 TIdSmtp 发送电子邮件时更改发件人
【发布时间】:2015-06-20 16:17:19
【问题描述】:

我正在制作一个用于数字营销的电子邮件系统,但在使用 Indy10 更改发件人姓名时遇到问题,它始终采用帐户中注册的标准名称。我想更改此名称。

var
  IdBody: TIdText;

begin
 with IDSMTP do
  begin
   if Connected then
    Disconnect();
   Host := edtSMTP.Text;
   Password := edtSenha.Text;
   Port := sePorta.Value;
   Username := edtRemetente.Text;
   with IdSSLIOHandlerSocketOpenSSL.SSLOptions do
    begin
     SSLVersions := [];
     if cbxSSLV2.Checked then
      SSLVersions := [sslvSSLv2];
     if cbxSSLV23.Checked then
      SSLVersions := SSLVersions + [sslvSSLv23];
     if cbxSSLV3.Checked then
      SSLVersions := SSLVersions + [sslvSSLv3];
     if cbxTLSV1.Checked then
      SSLVersions := SSLVersions + [sslvTLSv1];
     if cbxTLSV11.Checked then
      SSLVersions := SSLVersions + [sslvTLSv1_1];
     if cbxTLSV12.Checked then
      SSLVersions := SSLVersions + [sslvTLSv1_2];
    end;

   case cbxAutenticacao.ItemIndex of
     1:  UseTLS := utNoTLSSupport;
     2:  UseTLS := utUseImplicitTLS;
     3:  UseTLS := utUseRequireTLS;
     4:  UseTLS := utUseExplicitTLS;
   end;

   Connect;
   Authenticate;
   with IdMessage do
    begin
     MessageParts.Clear;
     Subject := edtAssunto.Text;
     MessageParts.Clear;
     IdBody := TIdText.Create(MessageParts);
     try
      IdBody.ContentType := 'text/html';
      IdBody.Body.Text := mEngenharia.Text;
      if edtAnexo.Text <> '' then
       begin
        if FileExists(edtAnexo.Text) then
         TIdAttachmentFile.Create(MessageParts, TFileName(edtAnexo.Text));
       end;
      From.Address := edtDestinatario.Text;
      Recipients.EMailAddresses := edtDestinatario.Text;
      BccList.EMailAddresses := edtDestinatario.Text;
      Send(IdMessage);
      ShowMessage('Email enviado com sucesso!');
     finally
      FreeAndNil(IdBody);
     end;
    end;
  end;
end;

【问题讨论】:

  • 请展示您的实际代码,并通过一个示例准确说明您要完成的工作。 TIdMessage 具有 FromSender 属性,并且 TIdSMTP 重载了采用可选 AFrom 参数的 Send() 方法,如果您想使用与 TIdMessage 中指定的不同的发件人。
  • @RemyLebeau 我更改了帖子,ai 想要以下内容,例如在 hotmail 中,第一列和名称,第二个主题,我想在那里更改名称,把公司例如投资在电子邮件中注册的名称
  • 我看到你给发件人设置了与收件人地址相同的电子邮件地址,可能是你的 SMTP 服务器不允许这样做。
  • 使用假地址?这是垃圾邮件发送者的标志。
  • 恐怕这行不通,您的电子邮件将被标记为垃圾邮件。我觉得这里有语言障碍,你需要在这里解释更多你想要达到的目标..

标签: delphi email delphi-xe7 indy10


【解决方案1】:

我在这段代码中看到的主要问题是您为TIdMessage.From.AddressTIdMessage.Recipients.EMailAddressesTIdMessage.BccList.EMailAddresses 属性分配了相同的值(edtDestinatario.Text)。您不应该这样做(除非向您自己发送测试电子邮件)。您需要将TIdMessage.From 属性设置为发送电子邮件的人的姓名/地址,并且TIdMessage.RecipientsTIdMessage.BccList 包含相同的地址列表是没有意义的,因为这些收件人将收到重复的地址电子邮件。

如果发送电子邮件的人的地址与您用来发送电子邮件的 SMTP 帐户的所有者不同,您需要设置TIdMessage.Sender.Address 属性,或可选的AFrom TIdSMTP.Send() 方法的参数,到帐户所有者的真实地址。当TIdSMTP 向服务器发送MAIL FROM 命令时,它必须指定电子邮件的实际发件人,然后 SMTP 服务器对其进行验证以确保它被允许发送电子邮件(即使您已经事先通过服务器进行了身份验证)。在该命令中,TIdSMTP 指定 AFrom 地址(如果提供),否则指定 TIdMessage.Sender.Address(如果提供),否则指定 TIdMessage.From.Address 地址。

MAIL FROM 命令中指定的发件人的处理方式与TIdMessage 生成的FromSender 电子邮件标头不同。事实上,TIdMessage 生成的实际电子邮件数据按原样发送给每个收件人,就 SMTP 服务器而言,它只是任意数据。除了插入额外的标头用于跟踪和路由目的之外,服务器不应该乱用它。因此,无论您分配给TIdMessage.FromTIdMessage.Sender 属性的Name,这都是收件人将看到的名称。

with IdMessage do
begin
  Clear;
  try
    Subject := edtAssunto.Text;
    if FileExists(edtAnexo.Text) then
    begin
      ContextType := 'multipart/mixed';
      IdBody := TIdText.Create(MessageParts);
      IdBody.ContentType := 'text/html';
      IdBody.Body.Text := mEngenharia.Text;
      TIdAttachmentFile.Create(MessageParts, edtAnexo.Text);
    end else
    begin
      ContentType := 'text/html';
      Body.Text := mEngenharia.Text;
    end;
    From.Address := ...;
    From.Name := ...;
    Sender.Address := ...; // if different than From.Address
    Recipients.EMailAddresses := edtDestinatario.Text;
    Send(IdMessage);
  finally
    Clear;
  end;
  ShowMessage('Email enviado com sucesso!');
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2017-06-11
    • 2015-01-30
    相关资源
    最近更新 更多