การปรับปรุงครั้งล่าสุด: 31.10.2015
SMTP (Simple Mail Transfer Protocol) ใช้เพื่อส่งจดหมายผ่านอินเทอร์เน็ต โปรโตคอลนี้ระบุวิธีที่เซิร์ฟเวอร์อีเมลโต้ตอบระหว่างการส่ง อีเมล.
เมื่อต้องการทำงานกับโปรโตคอล SMTP และส่งอีเมลใน .NET คลาส SmtpClient จากเนมสเปซ System.Net.Mail
คลาสนี้กำหนดคุณสมบัติจำนวนหนึ่งที่อนุญาตให้คุณปรับแต่งการส่ง:
โฮสต์: เซิร์ฟเวอร์ smtp ที่ส่งเมล ตัวอย่างเช่น smtp.yandex.ru
พอร์ต: พอร์ตที่ใช้โดยเซิร์ฟเวอร์ smp หากไม่ได้ระบุไว้ พอร์ต 25 จะถูกใช้เป็นค่าเริ่มต้น
ข้อมูลประจำตัว: ข้อมูลการตรวจสอบผู้ส่ง
EnableSsl: ระบุว่าจะใช้ โปรโตคอล SSLเมื่อส่ง
คลาสคีย์อื่นที่ใช้เมื่อส่งคือ MailMessage ชั้นนี้แสดงถึงข้อความที่ถูกส่ง คุณสมบัติของมันมีดังต่อไปนี้:
ไฟล์แนบ: มีไฟล์แนบอีเมลทั้งหมด
เนื้อความ: ข้อความของจดหมายโดยตรง
จาก: ที่อยู่ผู้ส่ง. แสดงถึงวัตถุ MailAddress
ถึง: ที่อยู่ของผู้รับ ยังแสดงถึงวัตถุ MailAddress
หัวเรื่อง: กำหนดหัวเรื่องของอีเมล
IsBodyHtml: ระบุว่าอีเมลแสดงเนื้อหาที่มีโค้ด html หรือไม่
ลองใช้คลาสเหล่านี้และส่งอีเมล:
ใช้ระบบ; ใช้ System.Net; ใช้ System.IO; ใช้ System.Threading.Tasks; ใช้ System.Net.Mail; เนมสเปซ NetConsoleApp ( โปรแกรมคลาส ( โมฆะคงที่ Main (สตริง args) ( // ผู้ส่ง - ตั้งค่าที่อยู่และชื่อที่แสดงในจดหมาย MailAddress จาก = MailAddress ใหม่ (" [ป้องกันอีเมล]", "Tom"); // เราส่ง MailAddress ไปให้ใคร = new MailAddress(" [ป้องกันอีเมล]"); // สร้างวัตถุข้อความ MailMessage m = MailMessage ใหม่ (จาก, ถึง); // หัวเรื่องเมล m.Subject = "ทดสอบ"; // ข้อความเมล m.Body = "
จดหมายทดสอบของไคลเอนต์ smtp
"; // ตัวอักษรแทน รหัส html m.IsBodyHtml = จริง; // ที่อยู่ของเซิร์ฟเวอร์ smtp และพอร์ตที่เราจะส่งจดหมาย SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587); // ล็อกอินและรหัสผ่าน smtp.Credentials = NetworkCredential ใหม่ (" [ป้องกันอีเมล]", "รหัสผ่านของฉัน"); smtp.EnableSsl = true; smtp.Send(m); Console.Read(); ) ) )ในการส่ง จะใช้เมธอด Send() ซึ่งส่งผ่านออบเจกต์ MailMessage
เรายังสามารถใช้การส่งเวอร์ชันอะซิงโครนัสด้วยวิธี SendMailAsync:
ใช้ระบบ; ใช้ System.Net; ใช้ System.IO; ใช้ System.Threading.Tasks; ใช้ System.Net.Mail; เนมสเปซ NetConsoleApp ( โปรแกรมคลาส ( โมฆะคงที่ Main (string args) ( SendEmailAsync (). GetAwaiter (); Console.Read (); ) งาน async แบบคงที่ส่วนตัว SendEmailAsync () ( MailAddress จาก = MailAddress ใหม่ (" [ป้องกันอีเมล]", "ทอม"); MailAddress ถึง = MailAddress ใหม่ (" [ป้องกันอีเมล]"); MailMessage m = MailMessage ใหม่ (จาก, ถึง); m.Subject = "ทดสอบ"; m.Body = "จดหมายทดสอบการทำงานของไคลเอ็นต์ Smtp 2"; SmtpClient smtp = new SmtpClient("smtp.gmail.com" , 587 ); smtp.Credentials = NetworkCredential ใหม่ (" [ป้องกันอีเมล]", "mypassword"); smtp.EnableSsl = true; wait smtp.SendMailAsync(m); Console.WriteLine("จดหมายที่ส่ง"); ) ) )
เพิ่มไฟล์แนบ
เราสามารถแนบไฟล์แนบไปกับอีเมลได้โดยใช้คุณสมบัติไฟล์แนบ สิ่งที่แนบมาแต่ละรายการแสดงถึงวัตถุ System.Net.Mail.Attachment:
MailAddress จาก = MailAddress ใหม่ (" [ป้องกันอีเมล]", "ทอม"); MailAddress ถึง = MailAddress ใหม่ (" [ป้องกันอีเมล]"); MailMessage m = MailMessage ใหม่ (จาก, ถึง); m.Attachments.Add (ไฟล์แนบใหม่ ("D://temlog.txt"));
ผบ.เรือ 14 ตุลาคม 2556 เวลา 19:29 นส่งอีเมลโดยทางโปรแกรมโดยใช้บริการต่างๆ
- .สุทธิ,
บ่อยครั้งที่คุณต้องจัดการกับการส่ง อีเมลจาก รหัสโปรแกรม. ไม่ต้องไปหาตัวอย่างที่ไหนไกล
บทความนี้เป็นคำใบ้และไม่ได้เปิดเผยอะไรใหม่ แต่ก่อนที่จะเขียน ฉันดูคล้ายกันบนอินเทอร์เน็ตและรู้สึกประหลาดใจมากที่เกือบทุกแห่งเสนอโซลูชันที่ใช้งานไม่ได้หรือล้าสมัย หรือเขียนโดยไม่รู้หนังสือ
สิ่งแรกที่คุณไม่ควรทำกับตัวอย่างเหล่านี้คือการใช้ System.Web.Mail ซึ่งเลิกใช้งานไปนานแล้ว และตั้งแต่นั้นเป็นต้นมา วิชวลสตูดิโอ 2010 ไม่สามารถเพิ่มห้องสมุด System.Web โดยไม่รู้ตัว เส้นทางเต็มเป็น DLL ที่สอดคล้องกัน
ขอเสนอให้ใช้ไลบรารี System.Net แทน
ใช้ System.Net; ใช้ System.Net.Mail;
ดังนั้น วิธีที่ง่ายที่สุด ที่สำคัญและใช้บ่อยที่สุดคือการส่งจดหมายจากคุณ เมลเซิร์ฟเวอร์ที่ไคลเอนต์ SMTP ได้รับการกำหนดค่า ตามที่คุณเข้าใจ เซิร์ฟเวอร์สามารถเป็นได้ทั้งเซิร์ฟเวอร์ที่แอปพลิเคชันทำงานอยู่หรือเซิร์ฟเวอร์ระยะไกลที่คุณมีสิทธิ์ส่งจดหมายโดยไม่ได้รับอนุญาตเพิ่มเติม
โค้ดตัวอย่างสำหรับการส่งอีเมลจากเครื่องโลคัล:
ใช้บริการอีเมลเช่น Gmail, Yandex, Mail.ru เป็นต้น ทุกอย่างเหมือนกัน เพิ่มเฉพาะพารามิเตอร์ที่มีการอนุญาตเท่านั้น
เซิร์ฟเวอร์ SMTP: smtp.gmail.com
ท่าเรือ: 587
โดยใช้ (MailMessage mm = new MailMessage("ชื่อ
เซิร์ฟเวอร์ SMTP: smtp.yandex.ru
พอร์ต: 25
โดยใช้ (MailMessage mm = new MailMessage("ชื่อ
เซิร์ฟเวอร์ SMTP: smtp.mail.ru
พอร์ต: 25
โดยใช้ (MailMessage mm = new MailMessage("ชื่อ
ถ้าคุณมี ตู้จดหมายบนบริการ mail.ru ลงท้ายด้วย inbox.ru, list.ru หรือ bk.ru จากนั้นที่อยู่ของเซิร์ฟเวอร์ SMTP (smtp.inbox.ru, smtp.list.ru และ smtp.bk.ru) จะเปลี่ยนตามไปด้วย
อย่างที่คุณเห็น ในการใช้บริการเมลอื่นในโปรแกรมของคุณ คุณจะต้องค้นหาที่อยู่และพอร์ตของเซิร์ฟเวอร์ SMTP รวมถึงกฎการให้สิทธิ์เท่านั้น
ต้องจำไว้ว่าบริการอีเมลของบุคคลที่สามเกือบทั้งหมดกำหนดจำนวนอีเมลที่ส่งในช่วงเวลาหนึ่ง
แท็ก: อีเมล, การส่งอีเมล, smtp
หนึ่งในฟังก์ชันที่ได้รับการร้องขอมากที่สุดในไซต์คือแบบฟอร์มใบสมัครหรือคำสั่งซื้อ ซึ่งเป็นข้อมูลที่ส่งไปยังอีเมลของเจ้าของไซต์ ตามกฎแล้ว แบบฟอร์มดังกล่าวเป็นแบบเรียบง่ายและประกอบด้วยสองหรือสามฟิลด์สำหรับการป้อนข้อมูล จะสร้างแบบฟอร์มการสั่งซื้อได้อย่างไร? สิ่งนี้จะต้องใช้ภาษามาร์กอัป HTML และภาษา การเขียนโปรแกรม PHP.
ภาษามาร์กอัป HTML นั้นเรียบง่าย คุณเพียงแค่ต้องหาวิธีการและตำแหน่งที่จะวางแท็กบางอย่าง ด้วยภาษาโปรแกรม PHP สิ่งต่าง ๆ จะซับซ้อนขึ้นเล็กน้อย
ไม่ใช่เรื่องยากสำหรับโปรแกรมเมอร์ในการสร้างแบบฟอร์มดังกล่าว แต่การดำเนินการบางอย่างอาจดูเหมือนยากสำหรับผู้เขียนโค้ด HTML
การสร้างแบบฟอร์มส่ง html
บรรทัดแรกจะอยู่ถัดไป
ตอนนี้เรามารวมเข้าด้วยกัน
ตอนนี้มาทำให้ฟิลด์ในแบบฟอร์มบังคับ เรามีรหัสต่อไปนี้:
สร้างไฟล์ที่รับข้อมูลจากแบบฟอร์ม HTML
นี่จะเป็นไฟล์ชื่อ send.php
ในไฟล์ ในขั้นตอนแรก คุณต้องรับข้อมูลจากอาร์เรย์โพสต์ ในการทำเช่นนี้ เราสร้างตัวแปรสองตัว:
$fio = $_POST["fio"];
$email = $_POST["อีเมล"];
ชื่อตัวแปรใน php นำหน้าด้วยเครื่องหมาย $ และเครื่องหมายอัฒภาคจะอยู่ท้ายแต่ละบรรทัด $_POST เป็นอาร์เรย์ที่ส่งผ่านข้อมูลจากแบบฟอร์ม ในรูปแบบ html มีการระบุวิธีการส่ง method="post" ดังนั้นจึงนำตัวแปรสองตัวมาจาก แบบฟอร์ม html. เพื่อวัตถุประสงค์ในการปกป้องไซต์ของคุณ คุณต้องส่งตัวแปรเหล่านี้ผ่านตัวกรองหลายตัว - ฟังก์ชัน php
ฟังก์ชันแรกจะแปลงอักขระทั้งหมดที่ผู้ใช้จะพยายามเพิ่มลงในแบบฟอร์ม:
ในกรณีนี้ ตัวแปรใหม่ใน php จะไม่ถูกสร้าง แต่จะใช้ตัวแปรที่มีอยู่ สิ่งที่ตัวกรองจะทำคือแปลงอักขระ "<" в "<". Также он поступить с другими символами, встречающимися в html коде.
ฟังก์ชันที่สองจะถอดรหัส URL หากผู้ใช้พยายามเพิ่มลงในแบบฟอร์ม
$fio = urldecode($fio);
$email = urldecode($อีเมล์);
ด้วยฟังก์ชันที่สาม เราจะลบช่องว่างออกจากจุดเริ่มต้นและจุดสิ้นสุดของสตริง หากมี:
$fio = ตัดแต่ง ($fio);
$email = ตัดแต่ง (อีเมล $);
มีฟังก์ชั่นอื่น ๆ ที่ให้คุณกรองตัวแปร php การใช้งานขึ้นอยู่กับว่าคุณกลัวว่าผู้โจมตีจะพยายามเพิ่มรหัสโปรแกรมไปยังรูปแบบการส่งข้อมูลไปยังเมล html นี้มากน้อยเพียงใด
ตรวจสอบข้อมูลที่ส่งผ่านจากรูปแบบ HTML ไปยังไฟล์ PHP
ในการตรวจสอบว่ารหัสนี้ใช้งานได้หรือไม่ หากมีการถ่ายโอนข้อมูล คุณสามารถแสดงข้อมูลนั้นบนหน้าจอโดยใช้ฟังก์ชันเสียงสะท้อน:
ก้อง $fio;
เสียงสะท้อน "
";
สะท้อนอีเมล $;
จำเป็นต้องใช้บรรทัดที่สองที่นี่เพื่อแยกเอาต์พุตของตัวแปร php ออกเป็นบรรทัดต่างๆ
ส่งข้อมูลที่ได้รับจากฟอร์ม HTML ไปยังเมลโดยใช้ PHP
ในการส่งข้อมูลไปยังเมล คุณต้องใช้ฟังก์ชันเมลใน PHP
mail("ไปยังที่อยู่ที่จะส่ง", "หัวเรื่องของจดหมาย", "ข้อความ (เนื้อความของจดหมาย)","จาก: จากอีเมลที่ส่งจดหมาย \r\n");
ตัวอย่างเช่น คุณต้องส่งข้อมูลไปยังอีเมลของเจ้าของหรือผู้จัดการไซต์ [ป้องกันอีเมล]
หัวเรื่องของอีเมลควรชัดเจน และข้อความของอีเมลควรมีสิ่งที่ผู้ใช้ระบุไว้ในรูปแบบ HTML
จดหมาย (" [ป้องกันอีเมล]", "แอปพลิเคชันจากไซต์", "ชื่อ:".$fio". อีเมล: ".$email ," จาก: [ป้องกันอีเมล]\r\n");
คุณต้องเพิ่มเงื่อนไขที่จะตรวจสอบว่าแบบฟอร์มถูกส่งโดยใช้ PHP ไปยังที่อยู่อีเมลที่ระบุหรือไม่
ถ้า (จดหมาย (" [ป้องกันอีเมล]", "สั่งซื้อจากเว็บไซต์", "ชื่อ:".$fio". อีเมล: ".$email ," จาก: [ป้องกันอีเมล]\r\n"))
{
echo "ส่งข้อความสำเร็จ";
) อื่น (
}
ดังนั้นโค้ดโปรแกรมของไฟล์ send.php ซึ่งจะส่งข้อมูลฟอร์ม HTML ไปยังเมลจะมีลักษณะดังนี้:
$fio = $_POST["fio"];
$email = $_POST["อีเมล"];
$fio = htmlพิเศษchars($fio);
$email = htmlพิเศษchars($email);
$fio = urldecode($fio);
$email = urldecode($อีเมล์);
$fio = ตัดแต่ง ($fio);
$email = ตัดแต่ง (อีเมล $);
//เสียงสะท้อน $fio;
//เสียงสะท้อน"
";
//echo $อีเมล;
ถ้า (จดหมาย (" [ป้องกันอีเมล]", "แอปพลิเคชันจากไซต์", "ชื่อ:".$fio". อีเมล: ".$email ," จาก: [ป้องกันอีเมล]\r\n"))
( echo "ส่งข้อความสำเร็จ";
) อื่น (
echo "เกิดข้อผิดพลาดขณะส่งข้อความ";
}?>
สามบรรทัดเพื่อตรวจสอบว่าข้อมูลถูกส่งไปยังไฟล์หรือไม่ หากจำเป็น สามารถลบออกได้ เนื่องจากจำเป็นสำหรับการดีบักเท่านั้น
วางรหัสการส่งแบบฟอร์ม HTML และ PHP ในไฟล์เดียว
ในความคิดเห็นต่อบทความนี้ มีหลายคนถามถึงวิธีทำให้ทั้งฟอร์ม HTML และโค้ด PHP ในการส่งข้อมูลไปยังเมลอยู่ในไฟล์เดียว ไม่ใช่สองไฟล์
ในการดำเนินการนี้ คุณต้องวางรหัส HTML ของแบบฟอร์มในไฟล์ send.php และเพิ่มเงื่อนไขที่จะตรวจสอบการมีอยู่ของตัวแปรในอาร์เรย์ POST (อาร์เรย์นี้ถูกส่งมาจากแบบฟอร์ม) นั่นคือหากไม่มีตัวแปรในอาร์เรย์ คุณต้องแสดงฟอร์มให้ผู้ใช้เห็น มิฉะนั้น คุณต้องรับข้อมูลจากอาร์เรย์และส่งไปยังผู้รับ
มาดูวิธีการเปลี่ยนโค้ด PHP ในไฟล์ send.php:
//ตรวจสอบว่ามีตัวแปรอยู่ในอาร์เรย์ POST หรือไม่
if(!isset($_POST["fio"]) และ !isset($_POST["email"]))(
?> ) อื่น (
//แสดงแบบฟอร์ม
$fio = $_POST["fio"];
$email = $_POST["อีเมล"];
$fio = htmlพิเศษchars($fio);
$email = htmlพิเศษchars($email);
$fio = urldecode($fio);
$email = urldecode($อีเมล์);
$fio = ตัดแต่ง ($fio);
$email = ตัดแต่ง (อีเมล $);
ถ้า (จดหมาย (" [ป้องกันอีเมล]", "แอปพลิเคชันจากไซต์", "ชื่อ:".$fio". อีเมล: ".$email ," จาก: [ป้องกันอีเมล]\r\n"))(
echo "ส่งข้อความสำเร็จ";
) อื่น (
echo "เกิดข้อผิดพลาดขณะส่งข้อความ";
}
}
?>
เราตรวจสอบการมีอยู่ของตัวแปรในอาร์เรย์ POST ด้วยฟังก์ชัน PHP isset() เครื่องหมายอัศเจรีย์หน้าฟังก์ชันนี้ในเงื่อนไขหมายถึงการปฏิเสธ นั่นคือหากไม่มีตัวแปรเราต้องแสดงแบบฟอร์มของเรา ถ้าฉันไม่ใส่เครื่องหมายอัศเจรีย์ เงื่อนไขก็จะหมายถึง - "ถ้ามีแล้ว แสดงแบบฟอร์ม" และนี่เป็นสิ่งที่ผิดในกรณีของเรา คุณสามารถเปลี่ยนชื่อเป็น index.php ได้ หากคุณเปลี่ยนชื่อไฟล์อย่าลืมเปลี่ยนชื่อไฟล์และในบรรทัด