ตัวอย่างในบทความนี้อธิบายวิธีการส่งข้อความอีเมลจำนวนมากใน Delphi7 แบ่งปันกับทุกคนสำหรับการอ้างอิงของคุณ การวิเคราะห์เฉพาะมีดังนี้:
ในช่วงเวลานี้ ข้อมูลผู้สมัครและข้อมูลการสอบจะต้องถูกส่งไปยังผู้สมัครทุกคนที่ทำการสอบผ่านทางอีเมล หลังจากแก้ไขจุดบกพร่องหลายครั้ง ถือว่าประสบความสำเร็จแล้ว
แนวคิดทั่วไปคือ:
1. ติดตั้งเมลเซิร์ฟเวอร์เวอร์ชัน LAN และตั้งค่า DNS เพื่อให้เซิร์ฟเวอร์สามารถส่งอีเมลไปยังผู้ใช้นอกเครือข่ายได้ มีซอฟต์แวร์มากมายในพื้นที่นี้ เช่น WinWebMail ซึ่งดีและสามารถดาวน์โหลดได้จากทางการ เว็บไซต์;
2. การควบคุมที่จำเป็นต้องใช้: Indy10.0.15 ซึ่งสามารถดาวน์โหลดผ่านการค้นหา Baidu;
3. ตั้งค่าเซิร์ฟเวอร์อีเมลและข้อมูลบัญชีที่จะส่ง
คัดลอกรหัสดังต่อไปนี้: ฟังก์ชัน setEmailInfo:integer; //ค่าส่งคืน 0: การตั้งค่าอีเมลล้มเหลว 1: การตั้งค่าอีเมลสำเร็จ
var
เลือกStr:สตริง;
ผลลัพธ์นี้: จำนวนเต็ม;
เริ่ม
ผลลัพธ์นี้ := 0;
//ตั้งค่าบัญชี
IdSMTP1.AuthType := atNone; // หรือ atSASL;
IdSMTP1.Host := โฮสต์สตริง;
IdSMTP1.ชื่อผู้ใช้ := userNameString;
IdSMTP1.Password := passWordString;
พยายาม
IdSMTP1.เชื่อมต่อ;
ผลลัพธ์นี้ := 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 := ใบเสร็จรับเงินที่อยู่;
//ที่อยู่ตอบกลับซึ่งอาจแตกต่างจากที่อยู่ของผู้ส่งอีเมล
MsgKsbkxx.Recipients.EMailAddresses := sendtoAdd; // กำลังส่งที่อยู่?
MsgKsbkxx.Sender.Address := formAddress; //sendtoAdd; //ส่งอีเมลไปที่...
MsgKsbkxx.Subject := emailSubject; //Subject
MsgKsbkxx.Body.Assign(emailMemo.Lines); // เนื้อหาอีเมล
IdSMTP1.Send(MsgKsbkxx); //ส่งคำสั่งอีเมล
จบ;
5. เพียงตรวจสอบความถูกต้องของที่อยู่อีเมล
คัดลอกโค้ด โค้ดมีดังนี้: // แยกสตริง s ออกเป็นหลายๆ สตริงตามการแสดงตัวคั่นสตริง และจัดเก็บไว้ในรายการสตริง rs
ขั้นตอน SeparateTerms2(s:string;Separator:string;var rs:TStringList);
var
AStr: สตริง;
idx: จำนวนเต็ม;
ASubStr: สตริง;
เริ่ม
AStr := ตัดแต่ง;
ในขณะที่ Pos(Separator, AStr) > 0 ทำ
เริ่ม
idx := Pos (ตัวคั่น, AStr);
ASubStr := คัดลอก (AStr, 1, idx - 1);
rs.เพิ่ม(ASubStr);
AStr := คัดลอก(AStr, idx + 1, ความยาว(AStr));
จบ;
ถ้า AStr+'a' <> 'a' แล้ว rs.Add(AStr); //ถ้ามีสตริงเหลืออยู่ ให้เก็บไว้ในรายการสตริง
จบ;
//ตรวจสอบว่าสตริงเป็นไปตามมาตรฐานที่อยู่อีเมลหรือไม่
//แก้ไข: ส่งคืนตกลง ข้อผิดพลาดในการส่งคืนข้อผิดพลาด
ฟังก์ชั่น emailAddressYesOrNo (emailAddress:String):string;
var
getStrings:TStringList;
getYesOrNo:สตริง;
เริ่ม
getYesOrNo := 'ข้อผิดพลาด';
getStrings := TStringList.Create;
SeparateTerms2(ที่อยู่อีเมล,'@',getStrings);
ถ้า getStrings.Count=2 แล้ว
เริ่ม
getStrings.Clear;
SeparateTerms2(ที่อยู่อีเมล,'.',getStrings);
ถ้า getStrings.Count>1 ดังนั้น getYesOrNo := 'ok';
จบ;
getStrings.ฟรี;
ผลลัพธ์ := getYesOrNo;
จบ;
6. ส่งอีเมลจำนวนมาก
คัดลอกรหัสดังต่อไปนี้: ขั้นตอน bEmailKsxxClick;
var
AccordAmount,i,j,tag:จำนวนเต็ม;
ชื่อผู้ใช้อีเมล,formAddress,sendtoAdd,emailSubject,receiptRecipientAddress,selectStr:string;
เริ่ม
//ตรวจสอบว่ามีข้อมูลในตารางข้อมูลที่ต้องส่งทางอีเมลหรือไม่ และถ้ามี ให้ส่งเลย
ถ้า Bmb.RecordCount >0 แล้ว
AccordAmount := Bmb.RecordCount
อื่น
ออก;
-
//รับข้อมูลบัญชี ซึ่งโดยปกติจะจัดเก็บไว้ในตารางข้อมูลหรือไฟล์ INI
emailusername := userNameString; //ผู้ส่งอีเมล
formAddress := fromAddressString; //กำลังส่งอีเมล์
ใบเสร็จรับเงินผู้รับที่อยู่ := ใบเสร็จรับเงินผู้รับที่อยู่สตริง; //ตอบกลับที่อยู่อีเมล
emailSubject := emailSubjectString; // หัวเรื่องอีเมล
-
tag := 1; //Flag bit: หยุดเมื่อส่งข้อผิดพลาด
i:=1; //จำนวนอีเมลที่ส่งทั้งหมด
j:=0; //จำนวนบันทึกที่ประมวลผลเพื่อให้แถบความคืบหน้าค่อยๆ ก้าวหน้า
list1.Clear; //แสดงข้อมูลเกี่ยวกับนักเรียนที่ส่งอีเมลสำเร็จแล้ว
//ตรวจสอบว่าสามารถเชื่อมต่อกับกล่องจดหมายที่ตั้งไว้ได้หรือไม่ หากค่าส่งคืนเป็น 1 ให้รับเนื้อหาอีเมลและการตั้งค่าที่เกี่ยวข้องแล้วส่ง
ถ้า setEmailInfo = 1 แล้ว
เริ่ม
Pb.BlockSize := 1;
Pb.Max := AccordAmount ;
Formsjtj.รีเฟรช;
Bmb.เฟิร์ส;
พยายาม
ในขณะที่ (ไม่ใช่ tBmb.Eof) ทำ
เริ่ม
//ตรวจสอบว่าที่อยู่อีเมลว่างเปล่าและตรงตามข้อกำหนดของอีเมลหรือไม่ หากตรงตามเงื่อนไขทั้งสอง ให้ส่งอีเมลไปยังที่อยู่นั้น
ถ้า Bmb.FieldByName('s_emailAddress').AsString+'a' <> 'a' แล้ว
เริ่ม
//รับเนื้อหาของอีเมลที่ส่งไป
emailMemo.Clear;
-
//ตั้งค่าข้อมูลอีเมล หากมีข้อผิดพลาดในการส่งอีเมล ให้ออกโดยตรง
ถ้า tag=0 ให้ออก;
//ส่งอีเมล
sendtoAdd := trim(Bmb.FieldByName('s_emailAddress').AsString); //จำเป็นต้องส่งไปที่...กล่องจดหมาย
ถ้า emailAddressYesOrNo(sendtoAdd)= 'ok' จากนั้น //ตรวจสอบว่ารูปแบบอีเมลถูกต้องหรือไม่
เริ่ม
sendEmailOnce(ชื่อผู้ใช้อีเมล,formAddress,receiptRecipientAddress,sendtoAdd,emailSubject); //ส่งอีเมล
i := i+1; //ตัวนับบวก 1
list1.Items.Add(......); //ใส่ข้อมูลผู้สมัครที่ได้รับการส่งอีเมลเรียบร้อยแล้วในรายการ
จบ;
-
จบ;
// มันจะหยุดเป็นเวลา 2 วินาทีทุกครั้งที่มีการส่งอีเมล 50 ฉบับ
ถ้า (i mod 50) = 0 แล้วสลีป (2000);
dm_sjtj.ListBmb.ถัดไป;
Application.ProcessMessages; //ประมวลผลข้อมูลกระบวนการในลูป
//รีเฟรชตัวบ่งชี้ความคืบหน้า
เจ := เจ+1;
PB.ความคืบหน้า:=j;
PB.สเต็ปอิท;
PB.รีเฟรช;
จบ;
ในที่สุด
แท็ก := 0;
IdSMTP1.ตัดการเชื่อมต่อ;
จบ;
จบ;
showmessage('ส่งทั้งหมด'+intToStr(i-1)+' อีเมล');
จบ;
7.ประเด็นที่ต้องให้ความสนใจ
1 ประเทศไม่อนุญาตให้มีอีเมลขยะ
2 เนื่องจากอีเมลจำนวนมากถูกควบคุมโดยผู้ให้บริการอีเมลส่วนใหญ่ จึงมักจะมีความล่าช้าระหว่างอีเมลสองฉบับ ขอแนะนำให้ตั้งค่าเซิร์ฟเวอร์อีเมลของคุณเอง
3 เนื่องจากการควบคุม Indy มีเพียงสองโหมดเท่านั้น: atNone และ atSASL หลังจากตั้งค่าเมลเซิร์ฟเวอร์แล้ว คุณจะต้องตั้งค่าที่อยู่ IP และบัญชีที่ไม่ต้องการการตรวจสอบ
④ เนื่องจากที่อยู่อีเมลภายในไม่สามารถรับการตอบกลับทางอีเมลได้ ที่อยู่ตอบกลับและที่อยู่สำหรับส่งจึงมักถูกตั้งค่าให้แตกต่างกัน ปัญหาหนึ่งที่เกิดขึ้นในขณะนี้คือคุณไม่สามารถตอบกลับเมื่อเปิดอีเมลผ่านเบราว์เซอร์ แต่คุณสามารถรับการตอบกลับหลังจากได้รับอีเมลผ่าน Foxmail สิ่งนี้ต้องการความสนใจ
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Delphi ของทุกคน