繁体   English   中英

使用TIdSmtp发送电子邮件时更改发件人

[英]Change sender when sending email with TIdSmtp

我正在制作一个用于数字营销的电子邮件系统,但是在使用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;

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

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

即在指定的发送者MAIL FROM命令被处理不同于FromSender的电子邮件标题TIdMessage生成。 实际上, TIdMessage生成的实际电子邮件数据按原样发送给每个收件人,就SMTP服务器而言,它只是任意数据。 除了插入用于跟踪和路由目的的其他标头之外,服务器不应弄乱它。 所以,无论Name分配给TIdMessage.FromTIdMessage.Sender特性,那就是收件人将看到的名称。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM