2011-06-05 22 views
35

के माध्यम से System.Net.Mail का उपयोग कर SMTP ईमेल भेजें हम नए Office 365 बीटा का परीक्षण कर रहे हैं, और मेरे पास एक्सचेंज ऑनलाइन सेवा पर एक मेल खाता है। अब मैं एक LOB एप्लिकेशन कनेक्ट करने की कोशिश कर रहा हूं जो मेरे परीक्षण खाते से smtp ईमेल भेज सकता है।एक्सचेंज ऑनलाइन (Office 365)

हालांकि एक्सचेंज 365 प्लेटफार्म को पोर्ट 587 पर टीएलएस एन्क्रिप्शन की आवश्यकता है, और System.Net.Mail की 'फीचर' है जो लागू एसएसएल एन्क्रिप्शन की अनुमति नहीं देती है।

क्या कोई इस मंच के माध्यम से सी # भेज रहा है?

मेरे पास निम्न मूल कोड है जो मेल भेजना चाहिए - किसी भी सलाह की सराहना की जाएगी।

SmtpClient server = new SmtpClient("ServerAddress"); 
server.Port = 587; 
server.EnableSsl = true; 
server.Credentials = new System.Net.NetworkCredential("[email protected]", "password"); 
server.Timeout = 5000; 
server.UseDefaultCredentials = false; 

MailMessage mail = new MailMessage(); 
mail.From = new MailAddress("[email protected]"); 
mail.To.Add("[email protected]"); 
mail.Subject = "test out message sending"; 
mail.Body = "this is my message body"; 
mail.IsBodyHtml = true; 

server.Send(mail); 
+2

क्या इससे कोई त्रुटि आती है? – BugFinder

+0

हां आपको एक टाइमआउट मिलता है - यह स्पष्ट रूप से डिफ़ॉल्ट विफलता –

+0

है इसलिए मैं आश्चर्यचकित होना शुरू कर रहा हूं कि यह सी # का उपयोग करके भी संभव है और System.Net.Mail नेमस्पेस की सीमाएं SSL सेटिंग्स से अधिक हैं। ऐसा लगता है कि एक्सचेंज के पास Office 365 पर इसका वेबसाइसेस सामने आया है और बहुत सारे लेख मेलबॉक्स आदि के साथ काम करने के लिए इसका लाभ उठाने के बारे में बात करते हैं। हालांकि मैं वास्तव में पूरे मेलबॉक्स को अपने LOB एप्लिकेशन में बेनकाब नहीं करना चाहता हूं। एसएमटीपी में 'एस' 'सरल' के लिए खड़ा है - मुझे विश्वास नहीं है कि माइक्रोसॉफ्ट के माइक्रोसॉफ्ट के मेल सर्वर की स्थापना माइक्रोसॉफ्ट की प्रोग्रामिंग भाषा के साथ काम नहीं कर सकती है। कृपया कोई मुझे बताओ कि मैं यहाँ कुछ याद कर रहा हूँ! –

उत्तर

5

क्या आपने यह देखा है? Sending email using Smtp.mail.microsoftonline.com

प्रमाण-पत्र सेट करने के बाद UseDefaultCredentials को सेट करना आपके प्रमाण-पत्र गुण को रीसेट कर देगा।

10

त्वरित उत्तर: FROM पता से आपके द्वारा भेजे जा रहे खाते से बिल्कुल मेल खाना चाहिए, या आपको एक त्रुटि मिलेगी 5.7.1 क्लाइंट को इस प्रेषक के रूप में भेजने की अनुमति नहीं है।

मेरा अनुमान है कि आपके Office 365 खाते के साथ ईमेल स्पूफ़िंग रोकता है, अन्यथा आप [email protected] के रूप में भेज सकते हैं।

एक और बात करने की कोशिश करना है प्रमाणीकरण में, डोमेन के साथ तीसरे क्षेत्र भरा तरह

Dim smtpAuth = New System.Net.NetworkCredential(
    "TheDude", "hunter2password", "MicrosoftOffice365Domain.com") 

वह काम नहीं करता, तो पुनः जाँच लें कि आप कम से खाते में प्रवेश कर सकते हैं: https://portal.microsoftonline.com

फिर भी एक और बात यह है कि आपका एंटीवायरस समाधान एंटी-स्पैमिंग समाधान के रूप में 25 और 587 बंदरगाहों तक प्रोग्रामेटिक पहुंच को अवरुद्ध कर सकता है। नॉर्टन और मैकफी चुपचाप इन बंदरगाहों तक पहुंच को अवरुद्ध कर सकते हैं। केवल मेल और सॉकेट डीबगिंग को सक्षम करने से आप इसे नोटिस कर सकते हैं (नीचे देखें)।

नोट करने के लिए एक आखिरी बात, विधि असीमित भेजें। यदि आप कॉल भेजने के तुरंत बाद

Dispose
पर कॉल करते हैं, तो मेल भेजने से पहले आप अपने कनेक्शन को बंद करने की संभावना से अधिक हैं। अपने smtpClient उदाहरण ऑनसेंड पूर्ण घटना के लिए सुनो, और वहां से निपटान कॉल करें। आपको इसके बजाय SendAsync विधि का उपयोग करना होगा, भेजें विधि इस घटना को नहीं बढ़ाती है।


विस्तृत उत्तर: दृश्य स्टूडियो के साथ (VB.NET या सी # कोई फर्क नहीं पड़ता), मैं एक साधारण से फ़ॉर्म कि एक बटन बनाया मेल संदेश, कि इसके बाद के संस्करण के लिए इसी तरह के साथ बनाया। फिर मैंने इसे application.exe.config में जोड़ा (मेरे प्रोजेक्ट की बिन/डीबग निर्देशिका में)। यह आउटपुट टैब को विस्तृत डीबग जानकारी रखने में सक्षम बनाता है।

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.diagnostics> 
     <sources> 
      <source name="System.Net"> 
       <listeners> 
        <add name="System.Net" /> 
       </listeners> 
      </source> 
      <source name="System.Net.Sockets"> 
       <listeners> 
        <add name="System.Net" /> 
       </listeners> 
      </source> 
     </sources> 
     <switches> 
      <add name="System.Net" value="Verbose" /> 
      <add name="System.Net.Sockets" value="Verbose" /> 
     </switches> 
     <sharedListeners> 
      <add name="System.Net" 
       type="System.Diagnostics.TextWriterTraceListener" 
       initializeData="System.Net.log" 
      /> 
     </sharedListeners> 
     <trace autoflush="true" /> 
    </system.diagnostics> 
</configuration> 
+1

मुझे लगता है कि 'hunter2password' आपका पासवर्ड नहीं है? – rhughes

+2

हे, हाँ, यह आईआरसी मेमे का पुराना संदर्भ है। मेरा पासवर्ड *************** है। एसआरसी: http://ars.userfriendly.org/cartoons/?id=19990814 –

+1

मेलमेसेज। यदि आप MailMessage जोड़ते हैं तो मुख्य खाता ईमेल होना आवश्यक नहीं है। O365 अधिकृत "ईमेल के रूप में भेजें" ईमेल के साथ संपत्ति प्रस्तुत करें पता। विवरण के लिए इस धागे में मेरी पोस्ट देखें: http://stackoverflow.com/a/33613150/2464869 – ShaneLS

1

अंत में, काम करता है!

के बाद smtpClient.Credentials = credentials; तो समस्या हल हो गई smtpClient.UseDefaultCredentials = false; रखें!

  SmtpClient smtpClient = new SmtpClient(smtpServerName);       
      System.Net.NetworkCredential credentials = new System.Net.NetworkCredential(smtpUName, smtpUNamePwd); 

      smtpClient.Credentials = credentials; 
      smtpClient.UseDefaultCredentials = false; <-- Set This Line After Credentials 

      smtpClient.Send(mailMsg); 
      smtpClient = null; 
      mailMsg.Dispose(); 
36

ऊपर काम कर कोड में उसमें गलतियों फिक्स्ड:

MailMessage msg = new MailMessage(); 
msg.To.Add(new MailAddress("[email protected]", "SomeOne")); 
msg.From = new MailAddress("[email protected]", "You"); 
msg.Subject = "This is a Test Mail"; 
msg.Body = "This is a test message using Exchange OnLine"; 
msg.IsBodyHtml = true; 

SmtpClient client = new SmtpClient(); 
client.UseDefaultCredentials = false; 
client.Credentials = new System.Net.NetworkCredential("your user name", "your password"); 
client.Port = 587; // You can use Port 25 if 587 is blocked (mine is!) 
client.Host = "smtp.office365.com"; 
client.DeliveryMethod = SmtpDeliveryMethod.Network; 
client.EnableSsl = true; 
try 
{ 
    client.Send(msg); 
    lblText.Text = "Message Sent Succesfully"; 
} 
catch (Exception ex) 
{ 
    lblText.Text = ex.ToString(); 
} 

मैं ऊपर कोड का उपयोग कर दो वेब अनुप्रयोगों और दोनों किसी परेशानी के बिना ठीक काम करते हैं।

+0

आप Office 365 का किस संस्करण पर चल रहे हैं। मैंने थोड़ी देर के लिए इस कोड को नहीं देखा है, लेकिन हम छोटे व्यापार योजना पी 1 से उद्यम योजना ई 1 तक बंदरगाह के लिए तैयार हो रहे हैं और मुझे आश्चर्य है कि मेरी शुरुआती समस्याएं पी 1 योजना पर होने के कारण हुई थीं। –

+0

दुर्भाग्यवश यह कोड अब Office 365 के साथ मान्य नहीं है। त्रुटि संदेश जो आता है वह है SMTP सर्वर को एक सुरक्षित कनेक्शन की आवश्यकता है या क्लाइंट प्रमाणीकृत नहीं है। सर्वर प्रतिक्रिया थी: 5.7.57 एसएमटीपी; ग्राहक को [HE1PR05CA0133.eurprd05.prod.outlook.com] के माध्यम से अज्ञात मेल भेजने के लिए प्रमाणित नहीं किया गया था –

2

मैंने बिना सफलता के office365 के माध्यम से काम करने के लिए smtp.google.com voc87 के खिलाफ काम करने के लिए उपयोग किया गया सी # कोड पोर्ट किया है। एसएसएल का उपयोग करने से पहले/बाद में प्रमाणन के सभी संयोजनों का प्रयास किया और इंटरनेट पर किए गए लगभग हर सिफारिश - w/o सफलता (5.7.1 मिली .... त्रुटि मिली)।

अंत में, अंतिम उपाय के रूप कहीं से इस लाइन मिल गया बस .Send (संदेश) से पहले

smtpClient.TargetName = "STARTTLS/smtp.office365.com"; 

तब से - हर भेज() बड़ी सफलता है।

3

कार्यालय 365 दो सर्वरों का उपयोग करें, smtp सर्वर और विस्तारित सेवर की रक्षा करें।

पहला सर्वर smtp.office365.com (smtp क्लाइंट का प्रॉपर्टी होस्ट) है और दूसरा सर्वर STARTTLS/smtp.office365.com (smtp क्लाइंट की संपत्ति लक्ष्यनाम) है। सेट नेटवर्कक्रेडेंशियल्स सेट करने से पहले एक और चीज को Usedefaultcredential = false रखना होगा।

client.UseDefaultCredentials = False 
    client.Credentials = New NetworkCredential("[email protected]", "Password") 
    client.Host = "smtp.office365.com" 
    client.EnableSsl = true 
    client.TargetName = "STARTTLS/smtp.office365.com" 
    client.Port = 587 

    client.Send(mail) 
+0

smtp.office365.com दो से अधिक सर्वर हैं। –

5

यहाँ कुछ है कि इस समस्या का एक जवाब के लिए इस सूत्र खोज की जा सकती है के लिए एक पक्ष नोट है। (इस समाधान को लागू करने से पहले नीचे दिए गए सावधानियों को पढ़ना सुनिश्चित करें।) मुझे उस क्लाइंट के लिए ईमेल भेजने में परेशानी हो रही थी जिस पर मेरे एमएस ऑफिस 365 सदस्यता के लिए उपयोगकर्ता या डोमेन नहीं था। मैं अपने [email protected] 365 खाते के माध्यम से एसएमटीपी की कोशिश कर रहा था लेकिन .NET मेल संदेश क्लाइंट @ क्लाइंटडॉमैन से संबोधित किया गया था। यह तब होता है जब "5.7.1 क्लाइंट की अनुमति नहीं है" त्रुटि मेरे लिए पॉप अप हो गई है। उपाय करने के लिए, MailMessage कक्षा भेजने की आवश्यकता है प्रेषक संपत्ति एक ईमेल पते पर सेट है कि मेरे आपूर्ति किए गए एसएमटीपी प्रमाण-पत्रों को O365 में "As As" के लिए अनुमति थी। मैंने नीचे दिए गए कोड में देखे गए मेरे मुख्य खाता ईमेल ([email protected]) का उपयोग करना चुना है। ध्यान रखें मैं किसी भी ईमेल मेरी O365 खाते को संबोधित इस्तेमाल किया जा सकता था (यानी [email protected], [email protected], आदि)

using System; 
using System.Net.Mail; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     using (
      MailMessage message = new MailMessage 
      { 
       To = { new MailAddress("[email protected]", "Recipient 1") }, 
       Sender = new MailAddress("[email protected]", "Me"), 
       From = new MailAddress("[email protected]", "Client"), 
       Subject=".net Testing" 
       Body="Testing .net emailing", 
       IsBodyHtml=true, 
      } 
     ) 
     { 
      using (
       SmtpClient smtp = new SmtpClient 
       { 
        Host = "smtp.office365.com", 
        Port = 587, 
        Credentials = new System.Net.NetworkCredential("[email protected]", "Pa55w0rd"), 
        EnableSsl = true 
       } 
      ) 
      { 
       try { smtp.Send(message); } 
       catch (Exception excp) 
       { 
        Console.Write(excp.Message); 
        Console.ReadKey(); 
       } 
      } 
     } 
     } 
    } 
} 

कृपया ध्यान दें SmtpClient "के रूप में भेजें" अनुमति थी केवल डिस्पोजेबल और .NET फ्रेमवर्क में उपयोग करते हुए ब्लॉक का उपयोग करने के 3.5 के माध्यम से .NET फ्रेमवर्क 4 में से 2
उपयोगकर्ता जैसे SmtpClient का उपयोग करना चाहिए में सक्षम है ...

SmtpClient smtp = new SmtpClient 
{ 
    Host = "smtp.office365.com", 
    Port = 587, 
    Credentials = new System.Net.NetworkCredential("[email protected]", "Pa55w0rd"), 
    EnableSsl = true 
}; 
try { smtp.Send(message); } 
catch (Exception excp) 
{ 
    Console.Write(excp.Message); 
    Console.ReadKey(); 
} 

जिसके परिणामस्वरूप ईमेल के हेडर कुछ इस तरह दिखेगा :

Authentication-Results: spf=none (sender IP is) 
    [email protected]; 
Received: from MyPC (192.168.1.1) by 
    BLUPR13MB0036.namprd13.prod.outlook.com (10.161.123.150) with Microsoft SMTP 
    Server (TLS) id 15.1.318.9; Mon, 9 Nov 2015 16:06:58 +0000 
MIME-Version: 1.0 
From: Client <[email protected]> 
Sender: Me <[email protected]> 
To: Recipient 1 <[email protected]> 

- सतर्क रहें -
बारे में पता कुछ मेल क्लाइंट एक नोट के रूप भेजने वाले का पता प्रदर्शित कर सकता है हो सकता है। क्लाइंट < ग्राहक @ ClientDomain की ओर से

मेरे <[email protected]>: उदाहरण के लिए आउटलुक पठन फलक के शीर्ष लेख में इन पंक्तियों के साथ कुछ प्रदर्शित करेगा।कॉम >

हालांकि, इतने लंबे समय के रूप में ईमेल क्लाइंट प्राप्तकर्ता का उपयोग करता है की कुल कचरा नहीं है, यह पता करने के लिए उत्तर को प्रभावित नहीं करना चाहिए। जवाब अभी भी पते से उपयोग करना चाहिए। अपने सभी अड्डों को कवर करने के लिए, आप MailMessage.ReplyToList प्रॉपर्टी का भी उपयोग कर सकते हैं ताकि ग्राहक को सही उत्तर पता का उपयोग करने के लिए हर मौका मिल सके।

साथ ही, इस बात से अवगत रहें कि कुछ ईमेल सर्वर डोमेन मालिक नीति प्रतिबंधों पर बैठे किसी अन्य कंपनी के Behalf पर भेजे गए किसी भी ईमेल को अस्वीकार कर सकते हैं। अच्छी तरह से परीक्षण करना और किसी बाउंस बैक की तलाश करना सुनिश्चित करें। मैं आपको बता सकता हूं कि मेरा व्यक्तिगत हॉटमेल (mail.live.com) ईमेल खाता वह है जो मेरे एक निश्चित ग्राहक की ओर से भेजे गए संदेशों को अस्वीकार कर देगा, लेकिन अन्य ग्राहक ठीक से गुजरते हैं। हालांकि मुझे संदेह है कि मेरे क्लाइंट के डोमेन TXT "spf1" रिकॉर्ड्स के साथ इसका कुछ संबंध है, लेकिन मेरे पास कोई जवाब नहीं है कि यह एक डोमेन की तरफ से भेजे गए ईमेल को दूसरी ओर क्यों अस्वीकार कर देगा। शायद कोई जानता है कि इस विषय पर कुछ प्रकाश डाल सकता है?

+0

बस एक नोट - कार्यालय 365 एक प्रेषक टैग जोड़ने की तरह प्रतीत नहीं होता है – markthewizard1234

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