Пример в этой статье описывает метод массовой отправки сообщений электронной почты в Delphi7. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
В течение этого периода информация о кандидате и информация об экзамене должны быть отправлены всем кандидатам, сдающим экзамен, по электронной почте. После многих отладок я отправляю его для справки:
Общая идея такова:
1. Установите LAN-версию почтового сервера и настройте DNS, чтобы сервер мог отправлять электронные письма пользователям за пределами сети. В этой области существует множество программ, таких как WinWebMail, которые хороши и могут быть загружены с официального сайта. веб-сайт;
2. Элементы управления, которые необходимо использовать: Indy10.0.15, который можно скачать через поиск Baidu;
3. Установите сервер электронной почты и информацию об учетной записи для отправки.
Скопируйте код следующим образом: function setEmailInfo:integer //Возвращаемое значение 0: настройка электронной почты не удалась 1: настройка электронной почты прошла успешно;
вар
выберитеStr: строка;
этот результат: целое число;
начинать
этот результат: = 0;
//Настраиваем учетную запись
IdSMTP1.AuthType := atNone //или atSASL;
IdSMTP1.Host:= HostString;
IdSMTP1.Имя пользователя: = строка имени_пользователя;
IdSMTP1.Пароль := passWordString;
пытаться
ИдSMTP1.connect;
этот результат: = 1;
если не IdSMTP1.Authenticate, то
начинать
showmessage('Не удалось отправить подтверждение учетной записи по электронной почте! Пожалуйста, проверьте настройки учетной записи SMTP!');
этот результат: = 0;
конец
кроме
showmessage('Не удалось подключиться к SMTP-серверу! Проверьте, в порядке ли настройки учетной записи SMTP и сети!');
этот результат: = 0;
конец
конец;
результат: = этот результат;
конец;
4. Отправка сообщения по электронной почте как самостоятельная функция, при отправке требуется контроль задержки.
Скопируйте код следующим образом: процедура sendEmailOnce(emailusername:string;
formAddress:string;receiptRecipientAddress:string;sendtoAdd:string;emailSubject:string);
начинать
MsgKsbkxx.From.Name := emailusername //Имя отправителя электронного письма;
MsgKsbkxx.From.Address := formAddress //Адрес отправителя электронной почты;
MsgKsbkxx.ReceiptRecipient.Address := адрес полученияRecipientAddress;
//Адрес ответа, который может отличаться от адреса отправителя письма
MsgKsbkxx.Recipients.EMailAddresses := sendtoAdd; //Адрес отправки?
MsgKsbkxx.Sender.Address := formAddress; //sendtoAdd //Отправить электронное письмо на... адрес;
MsgKsbkxx.Subject := emailSubject; //Тема;
MsgKsbkxx.Body.Assign(emailMemo.Lines); //Содержимое электронного письма
IdSMTP1.Send(MsgKsbkxx); //Отправить команду электронной почты
конец;
5. Просто определите легитимность адреса электронной почты.
Скопируйте код. Код выглядит следующим образом: // Разделите строку s на несколько строк в соответствии с представлением разделителя строк и сохраните их в списке строк rs.
процедура SeparateTerms2(s:string;Separator:string;var rs:TStringList);
вар
АСтр: строка;
идентификатор: целое число;
ASubStr: строка;
начинать
AStr := Обрезать(я);
в то время как Pos(Separator, AStr) > 0 делать
начинать
idx := Pos(Разделитель, AStr);
ASubStr := Копировать(AStr, 1, idx - 1);
rs.Add(ASubStr);
AStr := Копировать(AST, idx + 1, Длина(AStr));
конец;
if AStr+'a' <> 'a' then rs.Add(AStr); //Если остались строки, сохраним их в списке строк.
конец;
//Определяем, соответствует ли строка стандарту адреса электронной почты
//Правильно: возвращаем ok, ошибка возвращаем ошибку
функция emailAddressДаOrNo (emailAddress:String):string;
вар
getStrings: TStringList;
получитьДаОрНет:строка;
начинать
getДаОрНет := 'ошибка';
getStrings: = TStringList.Create;
SeparateTerms2(emailAddress,'@',getStrings);
если getStrings.Count=2, то
начинать
getStrings.Clear;
SeparateTerms2(emailAddress,'.',getStrings);
если getStrings.Count>1, то get YesOrNo := 'ok';
конец;
getStrings.Free;
результат: = getДаОрНет;
конец;
6. Отправляйте электронные письма оптом
Скопируйте код следующим образом: процедура bEmailKsxxClick;
вар
AccordAmount,i,j,tag:integer;
emailusername, formAddress, sendtoAdd, emailSubject, receiptRecipientAddress, selectStr:string;
начинать
//Определяем, есть ли в таблице данных данные, которые необходимо отправить по электронной почте, и если да, отправляем их
если Bmb.RecordCount >0, то
AccordAmount := Bmb.RecordCount
еще
Выход;
//
//Получаем информацию об аккаунте, обычно хранящуюся в таблице данных или INI-файле
emailusername := userNameString //Отправитель электронной почты;
formAddress := fromAddressString //Отправка адреса электронной почты;
квитанцияRecipientAddress := квитанцияRecipientAddressString //Ответный адрес электронной почты;
emailSubject := emailSubjectString //Тема письма;
//
tag := 1; //Бит флага: остановка при отправке ошибки
i:=1; //Общее количество отправленных писем
j:=0; //Количество записей, обрабатываемых для постепенного продвижения индикатора выполнения
list1.Clear //Отображение информации об учениках, чьи электронные письма были успешно отправлены;
//Определяем, можно ли подключиться к установленному почтовому ящику. Если возвращаемое значение равно 1, получаем содержимое электронного письма и соответствующие настройки и отправляем их.
если setEmailInfo = 1, то
начинать
Pb.BlockSize := 1;
Pb.Max := Сумма Согласия ;
Formsjtj.Обновить;
Бмб.Первый;
пытаться
пока (не tBmb.Eof) делаю
начинать
//Определите, пуст ли адрес электронной почты и соответствует ли он спецификациям электронной почты. Если оба условия соблюдены, отправьте электронное письмо на этот адрес.
если Bmb.FieldByName('s_emailAddress').AsString+'a' <> 'a' тогда
начинать
//Получаем содержимое отправленного письма
электронная почтаMemo.Clear;
............................
//Установим информацию об электронной почте. Если при отправке электронного письма возникла ошибка, выходим напрямую.
если тег=0, то выйти;
//Отправить письмо
sendtoAdd := Trim(Bmb.FieldByName('s_emailAddress').AsString //Необходимо отправить в... почтовый ящик);
if emailAddress YesOrNo(sendtoAdd)= 'ok' then //Проверяем правильность формата электронной почты
начинать
sendEmailOnce(emailusername,formAddress,receiptRecipientAddress,sendtoAdd,emailSubject); //Отправить электронное письмо;
я := я+1; //счетчик плюс 1;
list1.Items.Add(......); //Помещаем информацию о кандидате, который был успешно отправлен по электронной почте, в список
конец;
//
конец;
//Он останавливается на 2 секунды каждый раз, когда отправляется 50 писем.
если (i mod 50) = 0, то Sleep(2000);
dm_sjtj.ListBmb.next;
Application.ProcessMessages //Обработка информации о процессе в цикле;
//Обновляем индикатор прогресса
j := j+1;
ПБ.Прогресс:=j;
ПБ.StepIt;
PB.Обновить;
конец;
окончательно
тег := 0;
ИдSMTP1.Отключить;
конец;
конец;
showmessage('Всего отправленных'+intToStr(i-1)+' электронных писем.');
конец;
7. Проблемы, требующие внимания
① Спам-рассылки запрещены в стране.
② Поскольку массовая рассылка электронной почты контролируется большинством поставщиков услуг электронной почты, между двумя электронными письмами часто возникает задержка. Рекомендуется настроить собственный почтовый сервер.
③ Поскольку элемент управления Indy имеет только два режима: atNone и atSASL, после настройки почтового сервера необходимо настроить IP-адрес и учетную запись, не требующие проверки;
④ Поскольку внутренние адреса электронной почты не могут получать ответы по электронной почте, адрес ответа и адрес отправки часто устанавливаются разными. Одна из проблем, которая возникает сейчас, заключается в том, что вы не можете ответить при открытии электронного письма через браузер, но вы можете получить ответ после получения электронного письма через Foxmail. Это требует внимания.
Я надеюсь, что эта статья будет полезна каждому программисту на Delphi.