System.Net.Sockets.SocketException บนเซิร์ฟเวอร์ 2008R2

ฉันมีโปรแกรมที่ฉันต้องการใช้งานบนเซิร์ฟเวอร์ที่สามารถตรวจสอบเซิร์ฟเวอร์ต่างๆ บนเครือข่าย และส่งการแจ้งเตือนทางอีเมลเมื่อมีสถานการณ์บางอย่างที่เกี่ยวข้องกับเซิร์ฟเวอร์เหล่านั้นเกิดขึ้น

ขณะนี้ ฉันสามารถรันโปรแกรมนี้บนเครื่องของฉันได้ และสั่งให้มันปิดอีเมลได้ (โดยใช้ gmail SMTP) อย่างไรก็ตาม เมื่อฉันพยายามเรียกใช้บนเซิร์ฟเวอร์ผ่านทางพรอมต์คำสั่ง มันจะเกิดข้อยกเว้นต่อไปนี้:

Unhandled Exception: System.Net.Mail.SmtpException: Failure sending mail. --->
System.Net.WebException: Unable to connect to the remote server --->
System.Net.Sockets.SocketException: A connection attempt failed
because the connected party did not properly respond after a period of time,
or established connection failed because connected host has failed to respond
xxx.xxx.xxx.xxx:587

รหัสที่เกี่ยวข้องกับการส่งอีเมลนั้นค่อนข้างง่าย:

static void sendEmail(MailAddressCollection mailCollection, string emailSender,
                      string emailDisplayName, string emailPassword,
                      string subject, string body) {

    MailAddress fromAddress = new MailAddress(emailSender, emailDisplayName);

    SmtpClient smtpClient = new SmtpClient {
        Host = "smtp.gmail.com",
        Port = 587,
        EnableSsl = true,
        DeliveryMethod = SmtpDeliveryMethod.Network,
        UseDefaultCredentials = false,
        Credentials = new NetworkCredential(fromAddress.Address, emailPassword)
    };

    MailMessage message = new MailMessage {
        From = fromAddress,
        Subject = subject,
        Body = body
    };

    foreach (MailAddress mailAddress in mailCollection) {
        message.To.Add(mailAddress);
    }

    smtpClient.Send(message);

}

เซิร์ฟเวอร์ที่เป็นปัญหาคือกล่อง 2008R2 และไม่ได้เปิดใช้งาน Windows Firewall นอกจากนี้ พอร์ต 25 ยังเปิดอยู่อย่างแน่นอน เนื่องจากเซิร์ฟเวอร์นี้สามารถส่งอีเมลประเภทอื่นๆ ได้ (โดยเฉพาะอีเมลที่สร้างโดยเราเตอร์อีเมล Dynamics CRM)

อะไรอาจทำให้เกิดข้อผิดพลาดนี้


person nairware    schedule 22.08.2013    source แหล่งที่มา
comment
พอร์ต 25 เปิดอยู่แน่นอน แต่สคริปต์ใช้ smtp.gmail.com บนพอร์ต 587 ดังนั้นพอร์ต 587 เปิดอยู่หรือไม่   -  person Steven V    schedule 23.08.2013
comment
ฉันไม่แน่ใจว่าจะตรวจสอบอย่างไร แต่ฉันลอง netstat -a แล้วไม่เห็นพอร์ต 587 ในรายการ ฉันเห็นพอร์ต 25 แล้ว   -  person nairware    schedule 23.08.2013
comment
บนเซิร์ฟเวอร์ ลองใช้ telnet telnet smtp.gmail.com 587 และดูว่าคุณสามารถเชื่อมต่อได้หรือไม่   -  person Steven V    schedule 23.08.2013
comment
ฉันทำการทดสอบ telnet แล้วและมันก็ล้มเหลวเช่นกัน: การเชื่อมต่อกับ smtp.gmail.com...ไม่สามารถเปิดการเชื่อมต่อกับโฮสต์ บนพอร์ต 587: การเชื่อมต่อล้มเหลว   -  person nairware    schedule 23.08.2013
comment
ถ้าอย่างนั้นฉันเดาว่าพอร์ตขาออก 587 ถูกบล็อกที่ไฟร์วอลล์บางตัว คุณอยู่เบื้องหลังไฟร์วอลล์ขององค์กรหรือไม่? คุณบอกว่า Dynamic CRM สามารถส่งอีเมลได้ ทำไมคุณไม่ใช้การตั้งค่าเดียวกันกับ Dynamic CRM เพื่อส่งอีเมลของคุณล่ะ   -  person Steven V    schedule 23.08.2013
comment
ฉันจำเป็นต้องจำลองโปรแกรม/เครื่องมือตรวจสอบเดียวกันนี้ในสภาพแวดล้อมที่แตกต่างกันเช่นกัน ซึ่งไม่มีเราเตอร์อีเมล CRM เดียวกัน ดังนั้นฉันจึงพยายามใช้บางอย่างทั่วไปเช่น gmail ในโค้ดของฉัน สำหรับไฟร์วอลล์ เซิร์ฟเวอร์นี้โฮสต์อยู่กับผู้ให้บริการโฮสติ้งคลาวด์ทั่วไป ดังนั้นฉันจึงไม่รู้ว่าจะดูรายละเอียดเกี่ยวกับไฟร์วอลล์ประเภทใดก็ตามที่พวกเขาจะเรียกเก็บจากเราได้อย่างไร ไฟร์วอลล์ Windows ปิดอยู่   -  person nairware    schedule 23.08.2013


คำตอบ (1)


ปัญหานี้เกี่ยวข้องกับการที่ Gmail บล็อกที่อยู่ IP ของเซิร์ฟเวอร์ที่พยายามส่งอีเมล

เมื่อพยายามส่งอีเมลโดยใช้บัญชี Gmail ขั้นแรกให้ลองเข้าสู่ระบบ Gmail ด้วยตนเองบนเครื่องนั้นโดยเฉพาะตามที่อยู่ IP นั้นๆ โดยใช้เบราว์เซอร์ ในที่สุดฉันก็ต้องทำสิ่งนี้และผ่านกระบวนการตรวจสอบความถูกต้องว่าความพยายามในการส่งอีเมลจากเซิร์ฟเวอร์ของฉัน (ถูกสร้างขึ้นโดยทางโปรแกรม) นั้นถูกต้องตามกฎหมาย หากคุณไม่ทำตามขั้นตอนนี้เหมือนฉัน Gmail สามารถสันนิษฐานได้ว่าเซิร์ฟเวอร์ของคุณไม่ใช่ผู้ส่งอีเมลที่ถูกต้องตามกฎหมาย และสามารถถือว่าการรับส่งข้อมูลทั้งหมดจากที่อยู่ IP ของคุณไม่ถูกต้อง จนกว่าคุณจะตรวจสอบความถูกต้องของที่อยู่ IP นั้นอย่างเป็นทางการตามที่อธิบายไว้ข้างต้น

person nairware    schedule 14.02.2014