2015-06-20 154 views
0

我正在为数字营销制作电子邮件系统,并且使用Indy10更改发件人姓名时遇到问题,它始终采用帐户中注册的标准名称。我想改变这个名字。当使用TIdSmtp发送电子邮件时更改发件人

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; 
+2

请给出你的实际代码,并用一个例子来澄清你正在努力完成的事情。 'TIdMessage'具有'From'和'Sender'属性,'TIdSMTP'已经重载'Send()'方法,如果你想使用一个不同于'TIdMessage'中指定的发送者的' 。 –

+0

@RemyLebeau我改变了这个帖子,ai想要以下内容,例如在hotmail中,第一列和名称,第二个主题,我想在那里更改名称,例如让公司向inves注册名称电子邮件 –

+1

我看到您为发件人设置了与收件人地址相同的电子邮件地址,可能是因为您的SMTP服务器不允许这样做。 – whosrdaddy

回答

2

主要的问题我这段代码看到的是,你要分配相同的值(edtDestinatario.Text)到TIdMessage.From.AddressTIdMessage.Recipients.EMailAddressesTIdMessage.BccList.EMailAddresses性能。您不应该这样做(除了向您发送测试电子邮件时)。您需要将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命令中指定的发送者比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; 
相关问题