2009-07-04 28 views
10

मैं इस पर एक whlie के लिए कोशिश कर रहा है, और अब तक बुरी तरह विफल रहा है। मेरा सबसे हालिया प्रयास इस स्टैक कोड से यहां उठाया गया था: Sending email through Gmail SMTP server with C#, लेकिन मैंने स्टैक और अन्य जगहों पर यहां मिले सभी वाक्यविन्यासों को आजमाया है। मेरे कोड वर्तमान में है:जीएमएल एसएमटीपी सी # के माध्यम से सभी बंदरगाहों पर नेट त्रुटियां

var client = new SmtpClient("smtp.gmail.com", 587) 
{ 
    Credentials = new NetworkCredential("[email protected]", "mypass"), 
    EnableSsl = true 
}; 

client.Send("[email protected]","[email protected]","Test", "test message"); 

कि कोड चल रहा है मुझे एक तत्काल अपवाद "विफलता मेल भेजने" एक innerexeption "दूरस्थ सर्वर से कनेक्ट करने में असमर्थ" है कि देता है।

यदि मैं बंदरगाह 465 (जीमेल दस्तावेज़ सुझाव के रूप में) में बदलता हूं, तो मुझे हर बार टाइमआउट मिलता है।

मैंने पढ़ा है कि 465 उपयोग करने के लिए एक अच्छा बंदरगाह नहीं है, इसलिए मैं सोच रहा हूं कि सौदा w/587 मुझे कनेक्ट करने में विफलता दे रहा है। मेरा उपयोगकर्ता और पास सही हैं। मैंने पढ़ा है कि मुझे अपने जीमेल खाते पर पीओपी सेवा सेटअप करना है, इसलिए मैंने ऐसा किया। असफलता से।

मैं मूल रूप से यह मेरा ब्रांडेड जीमेल खाते के लिए काम करने की कोशिश कर रहा था, लेकिन एक ही समस्या हो रही w/कि मैं सोचा जा रहा w/मेरी नियमित Gmail खाते आसान होगा ... के बाद अब तक वह नहीं है मामला।

+0

क्या आप एक मानक ईमेल क्लाइंट से जुड़ सकते हैं? यदि नहीं, तो यह आपके साथ फ़ायरवॉल में एक समस्या हो सकती है। क्या आपने अपने खाते में पीओपी एक्सेस सक्षम किया था? – MiffTheFox

+0

हाँ, मैं कर सकता हूं, और हाँ मैंने किया। – Paul

उत्तर

14

मैं अपने कोड की कोशिश की, और यह पोर्ट 587 के साथ prefectly काम करता है, लेकिन नहीं 465

के साथ आग की दीवार जांच की है? कमांड लाइन "टेलनेट smtp.gmail.com 587" से आज़माएं यदि आपको "220 mx.google.com ईएसएमटीपी ...." वापस मिलता है, तो पोर्ट खुला है। यदि नहीं, तो यह कुछ ऐसा है जो आप कॉल करते हैं।

डैनियल

+0

धन्यवाद, यह बिल्कुल था। मैंने पोर्ट को 587 के माध्यम से बंद करने के लिए अपने फ़ायरवॉल में नियम लगाया था, और मेरे ईमेल क्लाइंट को इसका उपयोग करने में कोई समस्या नहीं थी, लेकिन मेरा ए/वी मेरे कंसोल टेस्ट ऐप पर शक कर रहा था, क्योंकि यह सोच रहा था कि यह एक कीड़ा प्रक्षेपित करने की कोशिश कर रहा था। – Paul

+0

हैलो, मैंने टेलनेट में इस परीक्षण की कोशिश की, यह काम किया (मुझे 220 एमएक्स.google.com ईएसएमटीपी मिला), लेकिन जब मैं .net 2.0 ऐप का उपयोग करके मेल भेजने का प्रयास करता हूं, तो मुझे लगता है कि 'सर्वर सुरक्षित कनेक्शन का समर्थन नहीं करता है।' क्या आप जानते हैं जैसा कि उल्लेख किया गया है – Smith

9

मैं कार्यान्वित एक ईमेल क्लाइंट कुछ समय है कि दोनों 587 और 465 पर Gmail बात कर सकते हैं वापस ...

पोर्ट 25 सामान्य एन्क्रिप्ट नहीं किए गए पॉप बंदरगाह है; जीमेल पर उपलब्ध नहीं है।

अन्य दो बंदरगाहों में एन्क्रिप्शन है; 587 टीएलएस का उपयोग करता है, 465 एसएसएल का उपयोग करता है।

587 का उपयोग करने के लिए आपको SmtpClient.EnableSsl = true सेट करना चाहिए।

465 SmtpClient के साथ काम नहीं करेगा, यह इसके बदले बहिष्कृत वर्ग SmtpMail के साथ काम करेगा।

+0

समस्या का कारण क्या है, मेरे पास पहले से ही सक्षम एसएसएल = सत्य था, मेरा कोड देखें। – Paul

+0

@ user133243 जानकारी के लिए धन्यवाद – prabhakaran

1

आपका निजी नेटवर्क के फ़ायरवॉल बंदरगाहों अवरुद्ध 587 और 465 आप डिफ़ॉल्ट पोर्ट 25 का उपयोग करें या फ़ायरवॉल

15

मैंने कुछ समय पहले साथ ही इस समस्या का में भाग गया पर वहाँ बंदरगाहों सक्षम कर सकते हैं। समस्या यह है कि SmtpClient अंतर्निहित एसएसएल कनेक्शन का समर्थन नहीं करता है, लेकिन स्पष्ट कनेक्शन का समर्थन करता है (System.Net.Mail with SSL to authenticate against port 465)। MailMessage की पिछली कक्षा (मुझे विश्वास है .Net 1.0) ने इसका समर्थन किया लेकिन लंबे समय से अप्रचलित रहा है।

मेरा जवाब सीडीओ (सहयोगी डेटा ऑब्जेक्ट) सीधे कॉम के माध्यम से निम्नलिखित की तरह कुछ का उपयोग कर कॉल करने के लिए (http://support.microsoft.com/kb/310212) था:

/// <summary> 
    /// Send an electronic message using the Collaboration Data Objects (CDO). 
    /// </summary> 
    /// <remarks>http://support.microsoft.com/kb/310212</remarks> 
    private void SendTestCDOMessage() 
    { 
     try 
     { 
      string yourEmail = "[email protected]"; 

      CDO.Message message = new CDO.Message(); 
      CDO.IConfiguration configuration = message.Configuration; 
      ADODB.Fields fields = configuration.Fields; 

      Console.WriteLine(String.Format("Configuring CDO settings...")); 

      // Set configuration. 
      // sendusing:    cdoSendUsingPort, value 2, for sending the message using the network. 
      // smtpauthenticate:  Specifies the mechanism used when authenticating to an SMTP service over the network. 
      //         Possible values are: 
      //         - cdoAnonymous, value 0. Do not authenticate. 
      //         - cdoBasic, value 1. Use basic clear-text authentication. (Hint: This requires the use of "sendusername" and "sendpassword" fields) 
      //         - cdoNTLM, value 2. The current process security context is used to authenticate with the service. 

      ADODB.Field field = fields["http://schemas.microsoft.com/cdo/configuration/smtpserver"]; 
      field.Value = "smtp.gmail.com"; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"]; 
      field.Value = 465; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/sendusing"]; 
      field.Value = CDO.CdoSendUsing.cdoSendUsingPort; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"]; 
      field.Value = CDO.CdoProtocolsAuthentication.cdoBasic; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/sendusername"]; 
      field.Value = yourEmail; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"]; 
      field.Value = "YourPassword"; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"]; 
      field.Value = "true"; 

      fields.Update(); 

      Console.WriteLine(String.Format("Building CDO Message...")); 

      message.From = yourEmail; 
      message.To = yourEmail; 
      message.Subject = "Test message."; 
      message.TextBody = "This is a test message. Please disregard."; 

      Console.WriteLine(String.Format("Attempting to connect to remote server...")); 

      // Send message. 
      message.Send(); 

      Console.WriteLine("Message sent."); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

मत भूलना अपने COM संदर्भ के माध्यम से ब्राउज़ करें और "माइक्रोसॉफ्ट सीडीओ को जोड़ने के लिए विंडोज 200 लाइब्रेरी के लिए "जो दो संदर्भ जोड़ना चाहिए: एडीओडीबी, और सीडीओ।

1

मुझे एक ही समस्या थी, लेकिन मेरी कंपनी के फ़ायरवॉल प्रतिबंधों को बदलने की स्वतंत्रता नहीं थी। this Google doc पर नोट्स के आधार पर, ऊपर दिए गए एरडेनेट्सट के उत्तर के साथ, मैंने पोर्ट 25 का उपयोग करने की कोशिश की और यह काम किया।(सबसे पहले मुझे चिंतित था कि पोर्ट 25 का उपयोग करने से यह संकेत हो सकता है कि संदेश एन्क्रिप्ट नहीं किया जा सकता है, इसलिए मैंने EnableSSL को गलत पर सेट किया है, जिसके कारण जीमेल ने इसे अस्वीकार कर दिया क्योंकि स्टार्ट टीएलएस को कभी नहीं बुलाया गया था। इससे मुझे विश्वास होता है कि जीमेल स्पष्टीकरण को लागू कर रहा है एसएसएल, पोर्ट 25 पर भी)।

2

सर्वर पर इस लिंक को http://www.google.com/accounts/DisplayUnlockCaptcha आज़माएं।

व्यवसाय जीमेल खाते, (या सामान्य जीमेल खाते इस बारे में निश्चित नहीं हैं) पहली बार एक प्रदर्शनUnlockCaptcha की मांग करता है।

0

एसएसएल पर एसएमटीपी करने के दो तरीके हैं: स्पष्ट और लागू। स्पष्ट अर्थ है कि आप सादे टेक्स्ट में सामान्य एसएमटीपी पोर्ट (आमतौर पर 25 या 587) से कनेक्ट होते हैं, फिर एसएसएल-मोड पर स्विच करने के लिए "starttls" कमांड जारी करते हैं। लागू का मतलब है कि आप एक बंदरगाह से कनेक्ट होते हैं जो सबकुछ एसएसएल (आमतौर पर 465) होने की अपेक्षा करता है।

Asp.net ईमेल भेजने के लिए "System.Net.Mail.SmtpClient()" का उपयोग करें। मुख्य समस्या यह है कि SmtpClient अंतर्निहित एसएसएल कनेक्शन का समर्थन नहीं करता है, लेकिन स्पष्ट कनेक्शन का समर्थन करता है (पोर्ट 465 के खिलाफ प्रमाणीकृत करने के लिए सिस्टम के साथ System.Net.Mail।)। इसलिए, यदि मेल सर्वर (एसएमटीपी) स्पष्ट कनेक्शन का समर्थन नहीं करता है, तो यह ईमेल भेजने और "कनेक्शन टाइमआउट" जैसे संदेश दिखाने में विफल रहता है, "संदेश SMTP सर्वर पर नहीं भेजा जा सका। परिवहन त्रुटि कोड 0x80040217 था। सर्वर प्रतिक्रिया उपलब्ध नहीं थी "आदि

एएसपीनेट में इस समस्या को हल करने के लिए हम संलग्नक के साथ एक ई-मेल संदेश भेजने के लिए Windows 2000 लाइब्रेरी (Cdosys.dll) के लिए सहयोग डेटा ऑब्जेक्ट्स (सीडीओ) का उपयोग कर सकते हैं। माइक्रोसॉफ्ट आउटलुक ईमेल भेजने के लिए इस डीएलएल का उपयोग करें। आपके एएसपीनेट समाधान में, आपको "2000 2000 लाइब्रेरी के लिए माइक्रोसॉफ्ट सीडीओ" संदर्भ जोड़ना होगा। यह बिन फ़ोल्डर में दो चिह्नित डीएल जोड़ देगा।

image to add referance

अब सी # .net में bellow कोड कार्य करें:

public static void SendMail(string FromName, string FromEmail, string ReceiverEmail, string CC, string BCC, string subj, string Mssg) 
{ 
const var cdoSendUsingPort = 2; 
const var cdoBasicAuth = 1; 
const var cdoTimeout = 60; 
var mailServer = "mail.XXXXXXX.net"; 
var SMTPport = 465; 
var mailusername = "[email protected]"; 
var mailpassword = "PPPPXXXX"; 
var objEmail = CreateObject("CDO.Message"); 
var objConf = objEmail.Configuration; 
var objFlds = objConf.Fields; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mailServer; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SMTPport; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = cdoTimeout; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasicAuth; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = mailusername; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mailpassword; 
objFlds.Update(); 
objEmail.To = ReceiverEmail; 
objEmail.From = FromEmail; 
objEmail.CC = CC; 
objEmail.BCC = BCC; 
objEmail.Subject = subj; 
objEmail.HTMLBody = Mssg; 
objEmail.Send(); 
} 

VB.net में

Public Shared Sub SendMail(ByVal FromName As String, ByVal FromEmail As String, ByVal ReceiverEmail As String, ByVal CC As String, ByVal BCC As String, ByVal subj As String, ByVal Mssg As String) 

''#################Sending Email########################## 

Const cdoSendUsingPort = 2 ' Send the message using SMTP 
Const cdoBasicAuth = 1 ' Clear-text authentication 
Const cdoTimeout = 60 ' Timeout for SMTP in seconds 

Dim mailServer = "mail.XXXXXXX.net" 
Dim SMTPport = 465 
Dim mailusername = "[email protected]" 
Dim mailpassword = "PPPPXXXX" 




Dim objEmail = CreateObject("CDO.Message") 
Dim objConf = objEmail.Configuration 
Dim objFlds = objConf.Fields 

With objFlds 
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mailServer 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SMTPport 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = cdoTimeout 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasicAuth 
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = mailusername 
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mailpassword 
.Update() 
End With 

objEmail.To = ReceiverEmail 
objEmail.From = FromEmail 
objEmail.CC = CC 
objEmail.BCC = BCC 
objEmail.Subject = subj 
objEmail.HTMLBody = Mssg 
'objEmail.AddAttachment "C:\report.pdf" 
objEmail.Send() 
End Sub 

सन्दर्भ: Original post अंतर्निहित & स्पष्ट एसएमटीपी http://help.fogcreek.com/9002/using-an-smtp-server-with-ssl का उपयोग Cdosys.dll लाइब्रेरी संलग्नक के साथ एक ई-मेल संदेश भेजने के लिए https://support.microsoft.com/en-us/help/310212/how-to-use-the-cdosys-dll-library-to-send-an-e-mail-message-with-attac

संबंधित मुद्दे