El ejemplo de este artículo describe el método de envío de mensajes de correo electrónico masivos en Delphi7. Compártelo con todos para tu referencia. El análisis específico es el siguiente:
Durante este período, la información del candidato y la información del examen deben enviarse a todos los candidatos que toman el examen por correo electrónico. Después de muchas depuraciones, se considera un éxito, lo envío para su referencia:
La idea general es:
1. Instale una versión LAN del servidor de correo y configure DNS para que el servidor pueda enviar correos electrónicos a usuarios fuera de la red. Hay muchos programas en esta área, como WinWebMail, que es bueno y se puede descargar del sitio oficial. sitio web;
2. Los controles que deben utilizarse: Indy10.0.15, que se puede descargar a través de la búsqueda de Baidu;
3. Configure el servidor de correo electrónico y la información de la cuenta que se enviará.
Copie el código de la siguiente manera: function setEmailInfo:integer; //Valor de retorno 0: la configuración del correo electrónico falló 1: la configuración del correo electrónico se realizó correctamente;
var
seleccionarStr:cadena;
este resultado: entero;
comenzar
este resultado: = 0;
//Configurar cuenta
IdSMTP1.AuthType := en Ninguno; //o enSASL;
IdSMTP1.Host:= cadenahost;
IdSMTP1.Nombre de usuario := cadenaNombreUsuario;
IdSMTP1.Contraseña := cadenaPalabraPalabra;
intentar
IdSMTP1.conectar;
este resultado: = 1;
si no es IdSMTP1.Authenticate entonces
comenzar
showmessage('¡Error al enviar la verificación de la cuenta de correo electrónico! ¡Compruebe la configuración de la cuenta SMTP!');
este resultado: = 0;
fin
excepto
showmessage('¡Error en la conexión del servidor SMTP! ¡Compruebe si la configuración de la cuenta SMTP y la red son normales!');
este resultado: = 0;
fin
fin;
resultado := este resultado;
fin;
4. Enviar un mensaje por correo electrónico como función independiente y se requiere control de demora al enviar.
Copie el código de la siguiente manera: procedimiento sendEmailOnce(emailusername:string;
formAddress:string;receiptRecipientAddress:string;sendtoAdd:string;emailSubject:string);
comenzar
MsgKsbkxx.From.Name := emailusername; //Nombre del remitente del correo electrónico
MsgKsbkxx.From.Address := formAddress; //Dirección del remitente del correo electrónico
MsgKsbkxx.ReceiptRecipient.Address := reciboRecipientAddress;
//Dirección de respuesta, que puede ser diferente de la dirección del remitente del correo electrónico
MsgKsbkxx.Recipients.EMailAddresses:= sendtoAdd; //¿Dirección de envío?
MsgKsbkxx.Sender.Address := formAddress; //sendtoAdd //Enviar correo electrónico a... dirección
MsgKsbkxx.Subject := emailSubject //Asunto
MsgKsbkxx.Body.Assign(emailMemo.Lines); //Contenido del correo electrónico;
IdSMTP1.Send(MsgKsbkxx); //Enviar comando de correo electrónico
fin;
5. Simplemente determine la legitimidad de la dirección de correo electrónico.
Copie el código. El código es el siguiente: // Separe la cadena s en varias cadenas de acuerdo con la representación del Separador de cadenas y guárdelas en la lista de cadenas rs.
procedimiento SepareTerms2(s:string;Separator:string;var rs:TStringList);
var
AStr: cadena;
idx: número entero;
ASubStr: cadena;
comenzar
AStr := Recorte(s);
mientras Pos(Separador, AStr) > 0 hacer
comenzar
idx := Pos(Separador, AStr);
ASubStr := Copiar(AStr, 1, idx - 1);
rs.Add(ASubStr);
AStr := Copiar(AStr, idx + 1, Longitud(AStr));
fin;
si AStr+'a' <> 'a' entonces rs.Add(AStr); //Si quedan cadenas, guárdelas en la lista de cadenas
fin;
//Determinar si una cadena cumple con el estándar de dirección de correo electrónico
//Correcto: devolver ok, error devolver error
función dirección de correo electrónico Sí o No (dirección de correo electrónico: Cadena): cadena;
var
getStrings:TStringList;
getSíOrNo:cadena;
comenzar
getSíONo := 'error';
getStrings := TStringList.Create;
SepareTerms2(dirección de correo electrónico,'@',getStrings);
si getStrings.Count=2 entonces
comenzar
getStrings.Claro;
SepareTerms2(dirección de correo electrónico,'.',getStrings);
si getStrings.Count>1 entonces getYesOrNo := 'ok';
fin;
getStrings.Gratis;
resultado := getSíONo;
fin;
6. Envíe correos electrónicos en lotes
Copie el código de la siguiente manera: procedimiento bEmailKsxxClick;
var
AcuerdoMonto,i,j,tag:integer;
nombre de usuario de correo electrónico, dirección del formulario, enviar a Agregar, asunto del correo electrónico, dirección del destinatario del recibo, selectStr: cadena;
comenzar
// Determina si hay datos en la tabla de datos que deben enviarse por correo electrónico y, de ser así, envíalos
si Bmb.RecordCount >0 entonces
MontoDeAcuerdo := Bmb.RecordCount
demás
salida;
//
//Obtener información de la cuenta, generalmente almacenada en una tabla de datos o archivo INI
emailusername := userNameString; //Remitente del correo electrónico
formAddress := fromAddressString //Enviando dirección de correo electrónico
reciboRecipientAddress := reciboRecipientAddressString //Dirección de correo electrónico de respuesta
emailSubject := emailSubjectString //Asunto del correo electrónico
//
tag := 1; //Bit de bandera: detener al enviar error
i:=1; //Número total de correos electrónicos enviados
j:=0; //El número de registros procesados para permitir que la barra de progreso avance gradualmente
list1.Clear; //Mostrar información sobre los estudiantes cuyos correos electrónicos se han enviado correctamente
//Determine si se puede conectar al buzón configurado. Si el valor de retorno es 1, obtenga el contenido del correo electrónico y la configuración relacionada y envíelo.
si setEmailInfo = 1 entonces
comenzar
Pb.BlockSize:= 1;
Pb.Max := MontoAcuerdo ;
Formulariosjtj.Refresh;
Bmb.Primero;
intentar
mientras (no tBmb.Eof) hacer
comenzar
//Determine si la dirección de correo electrónico está vacía y cumple con las especificaciones de correo electrónico. Si se cumplen ambas condiciones, envíe un correo electrónico a la dirección.
si Bmb.FieldByName('s_emailAddress').AsString+'a' <> 'a' entonces
comenzar
//Obtener el contenido del correo electrónico enviado
emailMemo.Clear;
............................
//Establezca la información del correo electrónico. Si hay un error al enviar el correo electrónico, salga directamente.
si etiqueta = 0, entonces salga;
//Enviar correo electrónico
sendtoAdd := trim(Bmb.FieldByName('s_emailAddress').AsString //Necesita enviar a...buzón);
si emailAddressYesOrNo(sendtoAdd)= 'ok' entonces //Comprueba si el formato del correo electrónico es correcto
comenzar
sendEmailOnce(emailusername,formAddress,receiptRecipientAddress,sendtoAdd,emailSubject //Enviar correo electrónico);
i := i+1; //contador más 1
list1.Items.Add(......); //Coloque la información del candidato a los correos electrónicos enviados exitosamente en la lista
fin;
//
fin;
//Se detiene durante 2 segundos cada vez que se envían 50 correos electrónicos.
si (i mod 50) = 0 entonces dormir(2000);
dm_sjtj.ListBmb.siguiente;
Application.ProcessMessages; //Procesar la información del proceso en el bucle
//Actualizar indicador de progreso
j := j+1;
PB.Progreso:=j;
PB.StepIt;
PB.Actualizar;
fin;
finalmente
etiqueta:= 0;
IdSMTP1.Desconectar;
fin;
fin;
showmessage('Total enviado'+intToStr(i-1)+' correos electrónicos.');
fin;
7. Cuestiones que necesitan atención
① El país no permite los correos electrónicos no deseados.
② Dado que la mayoría de los proveedores de correo electrónico controlan el correo electrónico masivo, a menudo hay un retraso entre dos correos electrónicos. Se recomienda configurar su propio servidor de correo electrónico.
③ Dado que el control Indy solo tiene dos modos: atNone y atSASL, después de configurar el servidor de correo, debe configurar una dirección IP y una cuenta que no requieran verificación;
④ Dado que las direcciones de correo electrónico internas no pueden obtener respuestas por correo electrónico, la dirección de respuesta y la dirección de envío a menudo se configuran para que sean diferentes. Un problema que surge ahora es que no puedes responder al abrir un correo electrónico a través de un navegador, pero puedes obtener una respuesta después de recibir un correo electrónico a través de Foxmail. Esto necesita atención.
Espero que este artículo sea útil para la programación Delphi de todos.