ใน ASP คุณสามารถส่งอีเมลง่ายๆ โดยการเรียกส่วนประกอบ CDONTS ใน ASP.Net ก็สามารถทำได้เช่นกัน ข้อแตกต่างก็คือใน .Net Framework ส่วนประกอบนี้ถูกห่อหุ้มไว้ในเนมสเปซ System.Web.Mail
โปรแกรมส่งอีเมลทั่วไปมีดังนี้:
<%@ นำเข้าเนมสเปซ = "System.Web.Mail" %>
<script runat="เซิร์ฟเวอร์">
MailMessage เมล = MailMessage ใหม่ ();
เมลจาก = " [email protected] ";
mail.To=" [email protected] ";
mail.BodyFormat=MailFormat.Text;
mail.Body="ทดสอบเมล smtp";
mail.Subject="ru โอเค?";
SmtpMail.SmtpServer = "localhost";
SmtpMail.Send(เมล);
</สคริปต์>
โดยปกติ ระบบจะเรียกเซิร์ฟเวอร์เสมือน SMTP เริ่มต้นที่มาพร้อมกับ IIS เพื่อส่งอีเมล อย่างไรก็ตาม เรามักพบข้อความแสดงข้อผิดพลาดนี้:
เซิร์ฟเวอร์ปฏิเสธที่อยู่ผู้รับหนึ่งรายการขึ้นไป การตอบกลับของเซิร์ฟเวอร์คือ: 550 5.7.1 ไม่สามารถส่งต่อสำหรับ [email protected]
สาเหตุของข้อผิดพลาดนี้ไม่เพียงแต่เป็นไปได้ที่ที่อยู่ผิดเท่านั้น มีอีกเหตุผลสำคัญคือ ตามที่กล่าวไว้ข้างต้น IIS ไม่มีฟังก์ชันอีเมลจริง แต่ใช้เฉพาะ "เซิร์ฟเวอร์เสมือน SMTP" เพื่อส่งต่ออีเมล ใน MSDN มีเคล็ดลับดังต่อไปนี้:
หากเซิร์ฟเวอร์ SMTP ในเครื่องของคุณ (รวมอยู่ใน Windows 2000 และ Windows Server 2003) อยู่หลังไฟร์วอลล์ที่บล็อกการรับส่งข้อมูล SMTP โดยตรง (ผ่านพอร์ต 25) คุณต้องค้นหาว่ามีสมาร์ทใดบ้าง โฮสต์ที่มีอยู่ในเครือข่ายสามารถใช้เพื่อส่งต่อข้อความ SMTP ที่ถูกกำหนดไว้สำหรับอินเทอร์เน็ต
สมาร์ทโฮสต์คือเซิร์ฟเวอร์ SMTP ที่ถ่ายทอดอีเมลขาออกที่ส่งโดยตรงไปยังอินเทอร์เน็ตจากเซิร์ฟเวอร์ SMTP ภายใน สมาร์ทโฮสต์ควรจะสามารถเชื่อมต่อกับทั้งเครือข่ายภายในและอินเทอร์เน็ตเพื่อทำหน้าที่เป็นเกตเวย์อีเมล
เปิดข้อจำกัดเซิร์ฟเวอร์เสมือน SMTP เริ่มต้น - คุณสมบัติ - การเข้าถึง - รีเลย์ คุณจะเห็นว่าฟังก์ชันการส่งต่อหรือรีเลย์นี้ถูกจำกัด ในรายการข้อจำกัด ให้เพิ่มที่อยู่ IP ของโฮสต์ที่จำเป็นต้องใช้เซิร์ฟเวอร์นี้เพื่อแก้ไขปัญหาที่กล่าวถึงข้างต้น
หากคุณไม่ได้ใช้เซิร์ฟเวอร์เสมือน SMTP ที่มาพร้อมกับ IIS แต่ใช้เซิร์ฟเวอร์เมลจริงอื่นๆ เช่น IMail, Exchange เป็นต้น คุณมักจะประสบปัญหาที่เซิร์ฟเวอร์ต้องการการรับรองความถูกต้องของผู้ส่ง (ESMTP) เมื่อใช้เซิร์ฟเวอร์ที่ต้องการการตรวจสอบตัวตนของผู้ส่ง จะเกิดข้อผิดพลาด:
เซิร์ฟเวอร์ปฏิเสธที่อยู่ผู้รับหนึ่งรายการขึ้นไป การตอบสนองของเซิร์ฟเวอร์คือ: 550 ไม่ใช่โฮสต์ในเครื่อง ckocoo.com ไม่ใช่เกตเวย์
ในอดีตฉันพบสิ่งนี้ใน ASP ไม่มีความเป็นไปได้ที่จะแก้ไขปัญหา เราสามารถใช้เฉพาะคอมโพเนนต์ CDO (คอมโพเนนต์หลักของ CDONTS) ได้โดยตรง:
conf.Fields[CdoConfiguration.cdoSMTPAuthenticate].Value=CdoProtocolsAuthentication.cdoBasic;
conf.Fields[CdoConfiguration.cdoSendUserName].Value = "บรูคส์";
conf.Fields[CdoConfiguration.cdoSendPassword].Value="XXXXXXX";
ใน .Net Framework 1.1 ข้อกำหนดนี้ได้รับการพิจารณาอย่างชัดเจนแล้ว คอลเลกชัน Fields ได้ถูกเพิ่มไปยังองค์ประกอบ MailMessage เพื่อเพิ่มข้อมูลระบุตัวตนของผู้ส่งในเซิร์ฟเวอร์อีเมล ESMTP ได้อย่างง่ายดาย ปัญหาการตรวจสอบ อย่างไรก็ตาม วิธีการนี้ใช้กับ .Net Framework 1.1 เท่านั้น ไม่ใช่เวอร์ชัน .Net Framework 1.0 ขั้นตอนการส่งอีเมลด้วยการรับรองความถูกต้องของผู้ส่งมีดังต่อไปนี้:
<%@ นำเข้าเนมสเปซ = "System.Web.Mail" %>
<script runat="เซิร์ฟเวอร์">
MailMessage เมล = MailMessage ใหม่ ();
เมลจาก = " [email protected] ";
mail.To=" [email protected] ";
mail.BodyFormat=MailFormat.Text;
mail.Body="ทดสอบเมล smtp";
mail.Subject="ru โอเค?";
mail.Fields.Add(" http://schemas.microsoft.com/cdo/configuration/smtpauthenticate ", "1"); // การตรวจสอบสิทธิ์ขั้นพื้นฐาน
mail.Fields.Add(" http://schemas.microsoft.com/cdo/configuration/sendusername ", "brookes"); // ตั้งชื่อผู้ใช้ของคุณที่นี่
mail.Fields.Add(" http://schemas.microsoft.com/cdo/configuration/sendpassword ", "walkor"); // ตั้งรหัสผ่านของคุณที่นี่
SmtpMail.SmtpServer="lsg.moon.net";
SmtpMail.Send(เมล);
</สคริปต์>
ด้วยวิธีนี้ คุณไม่จำเป็นต้องพึ่งพาส่วนประกอบของบุคคลที่สามอีกต่อไป เช่น Jmail และ EasyMail แต่เพียงใช้ SmtpMai เพื่อส่งอีเมลให้เสร็จสิ้น!