O exemplo neste artigo descreve o método de envio de mensagens de e-mail em massa no Delphi7. Compartilhe com todos para sua referência. A análise específica é a seguinte:
Durante este período, as informações do candidato e do exame deverão ser enviadas a todos os candidatos que realizarem o exame por e-mail. Após muitas depurações, é considerado um sucesso.
A ideia geral é:
1. Instale uma versão LAN do servidor de e-mail e configure o DNS para que o servidor possa enviar e-mails para usuários fora da rede. Existem muitos softwares nesta área, como o WinWebMail, que é bom e pode ser baixado do site oficial. site;
2. Os controles que precisam ser utilizados: Indy10.0.15, que pode ser baixado através da pesquisa do Baidu;
3. Defina o servidor de e-mail e as informações da conta a serem enviadas
Copie o código da seguinte forma: function setEmailInfo:integer; //Valor de retorno 0: Falha na configuração do email 1: Configuração do email bem-sucedida;
var
selecioneStr:string;
este resultado: inteiro;
começar
este resultado := 0;
//Configura conta
IdSMTP1.AuthType := atNone; //ou atSASL;
IdSMTP1.Host:=hostString;
IdSMTP1.Nome de usuário:=userNameString;
IdSMTP1.Senha:=passWordString;
tentar
IdSMTP1.conectar;
este resultado := 1;
se não for IdSMTP1.Authenticate então
começar
showmessage('Falha na verificação da conta de e-mail! Verifique as configurações da conta SMTP!');
este resultado := 0;
fim
exceto
showmessage('Falha na conexão do servidor SMTP! Verifique se as configurações da conta SMTP e da rede estão normais!');
este resultado := 0;
fim
fim;
resultado :=esteresultado;
fim;
4. Envie uma mensagem por e-mail como uma função independente, sendo necessário controle de atraso no envio.
Copie o código da seguinte forma: procedimento sendEmailOnce(emailusername:string;
formAddress:string;receiptRecipientAddress:string;sendtoAdd:string;emailSubject:string);
começar
MsgKsbkxx.From.Name := emailusername; //Nome do remetente do e-mail
MsgKsbkxx.From.Address := formAddress; //Endereço do remetente do e-mail
MsgKsbkxx.ReceiptRecipient.Address := reciboRecipientAddress;
//Endereço de resposta, que pode ser diferente do endereço do remetente do e-mail
MsgKsbkxx.Recipients.EMailAddresses := sendtoAdd; //Endereço de envio?
MsgKsbkxx.Sender.Address := formAddress; //sendtoAdd; //Enviar e-mail para... endereço
MsgKsbkxx.Subject := emailSubject; //Assunto
MsgKsbkxx.Body.Assign(emailMemo.Lines); //Conteúdo do e-mail;
IdSMTP1.Send(MsgKsbkxx); //Enviar comando de e-mail
fim;
5. Basta determinar a legitimidade do endereço de e-mail
Copie o código. O código é o seguinte: // Separe a string s em várias strings de acordo com a representação do separador de strings e armazene-as na lista de strings rs.
procedimento SeparateTerms2(s:string;Separador:string;var rs:TStringList);
var
AStr: string;
idx: Inteiro;
ASubStr: string;
começar
AStr := Corte(s);
enquanto Pos(Separador, AStr) > 0 faça
começar
idx := Pos(Separador, AStr);
ASubStr := Copiar(AStr, 1, idx - 1);
rs.Add(ASubStr);
AStr := Copiar(AStr, idx + 1, Comprimento(AStr));
fim;
if AStr+'a' <> 'a' then rs.Add(AStr); //Se houver strings restantes, armazene-as na lista de strings
fim;
//Determina se uma string atende ao padrão de endereço de e-mail
//Correto: retorna ok, erro retorna erro
função emailAddressYesOrNo (emailAddress:String):string;
var
getStrings:TStringList;
getSimOuNão:string;
começar
getYesOrNo := 'erro';
getStrings := TStringList.Create;
SeparateTerms2(emailAddress,'@',getStrings);
se getStrings.Count=2 então
começar
getStrings.Clear;
SeparateTerms2(emailAddress,'.',getStrings);
se getStrings.Count>1 então getYesOrNo := 'ok';
fim;
getStrings.Free;
resultado := getYesOrNo;
fim;
6. Envie e-mails em massa
Copie o código da seguinte forma: procedimento bEmailKsxxClick;
var
AccordAmount,i,j,tag:inteiro;
emailusername,formAddress,sendtoAdd,emailSubject,receiptRecipientAddress,selectStr:string;
começar
//Determina se há dados na tabela de dados que precisam ser enviados por e-mail e, em caso afirmativo, envie-os
se Bmb.RecordCount >0 então
AccordAmount := Bmb.RecordCount
outro
saída;
//
//Obtém informações da conta, geralmente armazenadas em uma tabela de dados ou arquivo INI
emailusername := userNameString; //Remetente do email
formAddress := fromAddressString; //Enviando endereço de e-mail
reciboRecipientAddress := reciboRecipientAddressString; //Endereço de e-mail de resposta
emailSubject := emailSubjectString; //Assunto do email
//
tag := 1; //Flag bit: parar ao enviar erro
i:=1; //Número total de e-mails enviados
j:=0; //O número de registros processados para permitir que a barra de progresso avance gradualmente
list1.Clear; //Exibe informações sobre os alunos cujos e-mails foram enviados com sucesso
//Determina se ele pode ser conectado à caixa de correio definida. Se o valor de retorno for 1, obtenha o conteúdo do e-mail e as configurações relacionadas e envie-os.
se setEmailInfo = 1 então
começar
Pb.BlockSize := 1;
Pb.Max := AccordAmount ;
Formsjtj.Atualizar;
Bmb.Primeiro;
tentar
enquanto (não tBmb.Eof) faça
começar
//Determine se o endereço de e-mail está vazio e atende às especificações de e-mail. Se ambas as condições forem atendidas, envie um e-mail para o endereço.
se Bmb.FieldByName('s_emailAddress').AsString+'a' <> 'a' então
começar
//Obtém o conteúdo do email enviado
emailMemo.Clear;
............................
//Defina as informações do email. Se houver um erro no envio do email, saia diretamente.
se tag=0 então saia;
//Enviar e-mail
sendtoAdd := trim(Bmb.FieldByName('s_emailAddress').AsString //Precisa enviar para...caixa de correio);
if emailAddressYesOrNo(sendtoAdd)= 'ok' then //Verifica se o formato do email está correto
começar
sendEmailOnce(emailusername,formAddress,receiptRecipientAddress,sendtoAdd,emailSubject);
i := i+1; //contador mais 1
list1.Items.Add(......); //Coloque na lista as informações do candidato que recebeu e-mails enviados com sucesso
fim;
//
fim;
//Ele irá parar por 2 segundos toda vez que 50 e-mails forem enviados.
se (i mod 50) = 0 então dormir(2000);
dm_sjtj.ListBmb.next;
Application.ProcessMessages; //Processar informações do processo no loop
//Atualiza indicador de progresso
j := j+1;
PB.Progresso:=j;
PB.StepIt;
PB.Atualizar;
fim;
finalmente
etiqueta := 0;
IdSMTP1.Disconnect;
fim;
fim;
showmessage('Total enviado'+intToStr(i-1)+' emails.');
fim;
7. Questões que precisam de atenção
① E-mails de spam não são permitidos pelo país
② Como o e-mail em massa é controlado pela maioria dos provedores de e-mail, geralmente há um atraso entre dois e-mails. É recomendável configurar seu próprio servidor de e-mail.
③ Como o controle Indy possui apenas dois modos: atNone e atSASL, após configurar o servidor de e-mail, é necessário configurar um endereço IP e uma conta que não necessite de verificação;
④ Como os endereços de e-mail internos não podem obter respostas por e-mail, o endereço de resposta e o endereço de envio são frequentemente definidos como diferentes. Um problema que surge agora é que você não pode responder ao abrir um e-mail por meio de um navegador, mas pode obter uma resposta após receber um e-mail pelo Foxmail. Isso precisa de atenção.
Espero que este artigo seja útil para a programação Delphi de todos.