การส่งอีเมลผ่านเซิร์ฟเวอร์ Gmail SMTP ด้วย C #


243

ด้วยเหตุผลบางอย่างทั้งคำตอบที่ยอมรับและอื่น ๆ ไม่ทำงานสำหรับฉันสำหรับ "การส่งอีเมลใน. NET ผ่าน Gmail " ทำไมพวกเขาถึงไม่ทำงาน

อัปเดต: ฉันได้ลองคำตอบทั้งหมด (ยอมรับและเป็นอย่างอื่น) ในคำถามอื่น แต่ไม่มีคำตอบใด ๆ

ฉันแค่อยากจะรู้ว่ามันใช้งานได้กับคนอื่นมิฉะนั้น Google อาจมีการเปลี่ยนแปลงบางสิ่งบางอย่าง (ซึ่งเกิดขึ้นก่อน)

เมื่อฉันลองใช้ชิ้นส่วนของรหัสที่ใช้SmtpDeliveryMethod.Networkฉันจะได้รับ SmtpException บน Send (ข้อความ) อย่างรวดเร็ว ข้อความคือ

เซิร์ฟเวอร์ SMTP ต้องการการเชื่อมต่อที่ปลอดภัยหรือไคลเอ็นต์ไม่ได้รับการตรวจสอบความถูกต้อง

การตอบกลับของเซิร์ฟเวอร์คือ:

5.5.1 ต้องมีการรับรองความถูกต้อง เรียนรู้เพิ่มเติมที่ "<- อย่างจริงจังมันสิ้นสุดที่นั่น

UPDATE:

นี่เป็นคำถามที่ฉันถามเมื่อนานมาแล้วและคำตอบที่ยอมรับได้คือรหัสที่ฉันใช้ไปหลายครั้งหลายครั้งในโครงการที่แตกต่างกัน

ฉันเอาบางส่วนของความคิดในการโพสต์นี้และโครงการ EmailSender อื่น ๆ ในการสร้างโครงการ EmailSender ที่ Codeplex มันถูกออกแบบมาสำหรับการทดสอบและรองรับบริการ SMTP ที่ฉันโปรดปรานเช่น GoDaddy และ Gmail


ฉันพยายามทำสิ่งนี้โดยใช้วิธีการที่คล้ายกันในภาษาอื่น พบสิ่งประเภทเดียวกัน: วิธีการเอกสารเก่าที่ทำงานมาก่อนไม่ได้ผลสำหรับฉัน ดังนั้นคุณเหลือสงสัยว่า google เปลี่ยนบางสิ่งบางอย่างหรือถ้าคุณทำอะไรผิด
AaronLS

3
@aaronls ดูเหมือนว่าการเปลี่ยนแปลงล่าสุดจะเกี่ยวข้องกับพอร์ต 465 ฉันลองในขณะที่กำลังมองหาวิธีแก้ปัญหา (ฉันเพิ่งทำงานในที่เดียวกัน) และพอร์ต 465 หมดเวลาตลอดเวลา หากเป็นกรณีของคุณลองด้วยพอร์ต 587
eglasius

2
ปัญหานี้เกิดจาก "การยืนยันคำ" (captcha) หากคุณลงชื่อเข้าใช้ผ่านเว็บอินเตอร์เฟสด้วยมือและกรอก captcha SMTP ของคุณจะเริ่มทำงาน
Robert Koritnik

4
FWIW ใช้ได้สำหรับฉัน คุณต้องใช้ 587 และ. เปิดใช้งานจริง c # 4 / .NET 4 ไม่รองรับ 465 / SSL สำรองในปัจจุบัน Gmail ความต้องการสำหรับการกำหนดค่าโปรแกรมไคลเอ็นต์อื่น
gerryLowry

1
ทำตาม @eglasius answer และตรวจสอบให้แน่ใจว่าคุณเปิดการตั้งค่า "อนุญาตให้มีความปลอดภัยน้อยลงแอพ" ใน Gmail เพื่ออนุญาตให้ gmail ตรวจสอบสิทธิ์บัญชีของคุณ
2713706

คำตอบ:


291

CVertex ตรวจสอบให้แน่ใจว่าได้ตรวจสอบรหัสของคุณและหากยังไม่เปิดเผยสิ่งใดให้โพสต์ไว้ ฉันเพิ่งเปิดใช้งานสิ่งนี้บนไซต์ทดสอบ ASP.NET ที่ฉันใช้งานอยู่และใช้งานได้

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("myusername@gmail.com", "mypwd"),
                EnableSsl = true
            };
            client.Send("myusername@gmail.com", "myusername@gmail.com", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

ฉันยังทำให้มันทำงานโดยใช้ web.config, http://msdn.microsoft.com/en-us/library/w355a94k.aspxและรหัส (เพราะไม่มีการจับคู่EnableSslในไฟล์การกำหนดค่า :()


1
ทำงานเก่งสำหรับฉันในแอปพลิเคชัน C # winforms ขอบคุณเฟรดดี้
Andrew

13
แค่จำไว้ว่ารหัสแบบนี้ส่งข้อมูล gmail ของคุณอย่างมีประสิทธิภาพในรูปแบบข้อความธรรมดาไปยังผู้ใช้ ...
Chris Marisic

3
จริงๆแล้วมีการตั้งค่าการจับคู่สำหรับ enableSsl ใน web.config ดูคำตอบด้านล่าง
Wiebe Tijsma

4
@Zidad ที่ถูกเพิ่มใน 4.0
eglasius

21
นอกจากนี้คุณยังอาจต้องเปิดใช้การเข้าถึงสำหรับ "แอปที่ปลอดภัยน้อย" ในการตั้งค่าหน้า Gmail ของคุณ: google.com/settings/security/lesssecureapps นี่เป็นสิ่งจำเป็นหากคุณได้รับข้อยกเว้น "` การตอบกลับของเซิร์ฟเวอร์คือ: 5.5.1 ต้องมีการตรวจสอบสิทธิ์
Ravendarksky

74

การติดตามต่อไปนี้เกือบจะเป็นคำตอบสำหรับคำถามของคุณหากทุกอย่างล้มเหลว :

ฉันได้รับข้อผิดพลาดแบบเดียวกันมันกลับกลายเป็นว่าอัลกอริธึมการวัดรหัสผ่านแบบใหม่ของ Google เปลี่ยนไปเพราะรหัสผ่านปัจจุบันของฉันอ่อนแอเกินไปและไม่ได้บอกอะไรฉันเลย (ไม่ใช่แม้แต่ข้อความหรือคำเตือน) ... ? ฉันเลือกที่จะเปลี่ยนรหัสผ่านเพื่อดูว่ามันจะช่วยได้หรือไม่ (ลองทุกอย่างอื่นเพื่อประโยชน์) และเมื่อฉันเปลี่ยนรหัสผ่านมันทำงานได้!

จากนั้นสำหรับการทดสอบฉันพยายามเปลี่ยนรหัสผ่านกลับไปเป็นรหัสผ่านก่อนหน้าเพื่อดูว่าจะเกิดอะไรขึ้นและ Gmail ไม่อนุญาตให้ฉันทำสิ่งนี้โดยอ้างเหตุผลว่า "ขออภัยเราไม่สามารถอนุญาตให้คุณบันทึกการเปลี่ยนแปลงนี้ได้ตามที่คุณเลือก รหัสผ่านอ่อนแอเกินไป "และจะไม่ให้ฉันกลับไปใช้รหัสผ่านเก่าของฉัน ฉันคิดว่ามันเกิดข้อผิดพลาดเพราะ a) คุณต้องเปลี่ยนรหัสผ่านทุกๆ x จำนวนเดือนหรือ b) อย่างที่ฉันพูดไว้ก่อนหน้านี้อัลกอริทึมความแข็งแรงของรหัสผ่านของพวกเขาเปลี่ยนไปและดังนั้นรหัสผ่านที่อ่อนแอที่ฉันไม่ได้รับการยอมรับแม้ว่าพวกเขาจะไม่พูดอะไรเกี่ยวกับเรื่องนี้เมื่อพยายามเข้าสู่ระบบไม่ว่าที่ไหนก็ตาม! (หมายเลข 2) นี้เป็นสถานการณ์ที่เป็นไปได้มากที่สุดเนื่องจากรหัสผ่านที่อ่อนแอของฉันมีอายุประมาณ 4 เดือนและให้ฉันใช้ใน Gmail

มันค่อนข้างแย่ที่พวกเขาไม่ได้พูดอะไรเกี่ยวกับเรื่องนี้ แต่มันสมเหตุสมผล เนื่องจากอีเมลที่ถูกไฮแจ็คส่วนใหญ่เข้าสู่ระบบโดยใช้ซอฟต์แวร์นอก gmail และฉันเดาว่าคุณจะต้องมีรหัสผ่านที่เข้มงวดกว่านี้หากคุณต้องการใช้ Gmail นอกสภาพแวดล้อมของ Gmail

ฉันหวังว่านี่จะช่วยได้!


2
ขอบคุณที่คุณบอกว่าเปลี่ยนรหัสผ่านเพื่อให้มันแข็งแรงและทุกอย่างจะทำงานได้ดี
กาวิน

1
นี่เป็นปัญหาของฉัน - ข้อเสนอแนะอื่น ๆ ทั้งหมดเกี่ยวกับการกำหนดค่า แต่การกำหนดค่าของฉันถูกต้องตั้งแต่ต้น แต่ฉันยังคงได้รับข้อผิดพลาด การเปลี่ยนรหัสผ่านสร้างความแตกต่างได้ทุกอย่าง
André Vermeulen

ขอบคุณในที่สุดฉันก็สามารถแยกแยะปัญหานี้ได้จริงกรณีของฉันซับซ้อนกว่าเดิมมากฉันสามารถส่งอีเมลจากเครื่อง dev ของฉัน (ซึ่งอยู่ใน Georgia, Caucasus) แต่อีเมลล้มเหลวจากเซิร์ฟเวอร์การผลิต (UK) หลังจาก เปลี่ยนรหัสผ่านเป็นรหัสที่ซับซ้อนทุกอย่างใช้งานได้แล้วตอนนี้ :)
Kirill Chilingarashvili

ขอบคุณ ฉันมีปัญหาเดียวกันกับบัญชี Gmail ของฉันซึ่งไม่ได้เป็นเจ้าของความแข็งแกร่งของรหัสผ่าน ฉันอัปเดตด้วยรหัสที่แข็งแกร่งและรหัสของฉันใช้งานได้
Thomas.Benz

ขอบคุณใช่แล้วในที่สุดมันก็แค่เปลี่ยนรหัสผ่านเป็นรหัสที่แข็งแกร่ง
Misha Beskin

68

นอกเหนือจากขั้นตอนการแก้ไขปัญหาอื่น ๆ ข้างต้นฉันยังต้องการเพิ่มว่าหากคุณเปิดใช้งานการรับรองความถูกต้องแบบสองปัจจัย (หรือที่เรียกว่าการยืนยันแบบสองขั้นตอน ) ในบัญชี GMail ของคุณคุณต้องสร้างรหัสผ่านเฉพาะแอปพลิเคชัน สร้างรหัสผ่านในการตรวจสอบผ่าน SMTP

หากต้องการสร้างโปรดไปที่: https://www.google.com/settings/และเลือกการอนุญาตแอปพลิเคชันและไซต์เพื่อสร้างรหัสผ่าน


1
ฉันไม่ได้เปิดใช้งานการยืนยันแบบสองขั้นตอนและไม่สำคัญว่าฉันจะสร้างรหัสผ่านได้อย่างปลอดภัยเพียงใดนี่เป็นวิธีเดียวที่ฉันสามารถแก้ไขปัญหาของฉันได้ ฉันสามารถใช้บัญชี gmail อื่น ๆ ที่ไม่มี 2 ขั้นตอนและรหัสผ่านที่อ่อนแอลงได้โดยไม่มีปัญหา ... เพื่อใช้บัญชีที่ฉันต้องการใช้จริงๆฉันต้องเปิดใช้งาน 2 ขั้นตอนและใช้รหัสผ่านเฉพาะแอปพลิเคชัน
Ian Robertson

สิ่งที่ฉันทำอยู่ แต่ก็ยังคงเป็นข้อผิดพลาดเดียวกัน: - / มันทำหน้าที่เหมือนรหัสผ่านของฉันไม่แข็งแรงพอ แต่ฉันใช้รหัสผ่านสำหรับแอปที่ Gmail ให้ฉัน !!!
Jerry Dodge

55
Turn On Access For Less Secure Apps and it will work for all no need to change password.

เชื่อมโยงไปยังการตั้งค่า Gmail

ป้อนคำอธิบายรูปภาพที่นี่


1
สิ่งนี้ใช้ได้สำหรับฉัน มากยิ่งขึ้นเมื่อฉันพยายามที่จะส่งอีเมลถึงวิธีการดังกล่าวข้างต้นที่ผมได้รับอีเมลจาก Google จริงที่พวกเขาอย่างชัดเจนบอกว่าพวกเขาถูกปิดกั้นความพยายามนี้จากการตรวจสอบความปลอดภัยน้อยและพวกเขากล่าวถึงวิธีนี้จะแก้ไขได้
Demarsch

1
นี่คือกุญแจสำคัญที่สุดในปริศนาเนื่องจากฉันมีการตั้งค่าอื่น ๆ ทุกครั้งและดูเหมือนว่าจะไม่ทำงาน ทันทีที่ฉันตั้งค่านี้มันทำงานเหมือนมีเสน่ห์
แพ้

1
สิ่งนี้ใช้ได้สำหรับฉัน รหัสผ่านสำหรับแอป + SSL + NetworkCredentials (VB.NET)
CrazyIvan1974

30

ฉันมีปัญหาบางอย่างในการส่งอีเมลจากบัญชี gmail ของฉันเช่นกันซึ่งเกิดจากหลาย ๆ สถานการณ์ดังกล่าวข้างต้น นี่เป็นบทสรุปของวิธีที่ฉันใช้งานและทำให้มันยืดหยุ่นในเวลาเดียวกัน:

  • ก่อนอื่นให้ทำการตั้งค่าบัญชี GMail ของคุณ:
    • เปิดใช้งาน IMAP และยืนยันจำนวนข้อความสูงสุดที่ถูกต้อง(คุณสามารถทำได้ที่นี่)
    • ตรวจสอบให้แน่ใจว่ารหัสผ่านของคุณมีอย่างน้อย 7 ตัวอักษรและแข็งแรง (ตาม Google)
    • ตรวจสอบให้แน่ใจว่าคุณไม่ต้องป้อนรหัสแจ้งลบความคิดเห็นก่อน คุณสามารถทำได้โดยส่งอีเมลทดสอบจากเบราว์เซอร์ของคุณ
  • ทำการเปลี่ยนแปลงใน web.config (หรือ app.config ฉันยังไม่ได้ลองเลย แต่ฉันคิดว่ามันง่ายที่จะทำให้มันทำงานได้ในแอพพลิเคชั่น windows):
<configuration>
    <appSettings>
        <add key="EnableSSLOnMail" value="True"/>   
    </appSettings>

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="yourusername@gmail.com" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="yourusername@gmail.com"
                    />
                <!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
Add a Class to your project:

Imports System.Net.Mail

Public Class SSLMail

    Public Shared Sub SendMail(ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)

        GetSmtpClient.Send(e.Message)

        'Since the message is sent here, set cancel=true so the original SmtpClient will not try to send the message too:
        e.Cancel = True

    End Sub

    Public Shared Sub SendMail(ByVal Msg As MailMessage)
        GetSmtpClient.Send(Msg)
    End Sub

    Public Shared Function GetSmtpClient() As SmtpClient

        Dim smtp As New Net.Mail.SmtpClient
        'Read EnableSSL setting from web.config
        smtp.EnableSsl = CBool(ConfigurationManager.AppSettings("EnableSSLOnMail"))
        Return smtp
    End Function

End Class

และตอนนี้เมื่อใดก็ตามที่คุณต้องการส่งอีเมลทั้งหมดที่คุณต้องทำคือโทรSSLMail.SendMail:

เช่นในหน้าที่มีการควบคุม PasswordRecovery:

Partial Class RecoverPassword
Inherits System.Web.UI.Page

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles RecoverPwd.SendingMail
    e.Message.Bcc.Add("webmaster@example.com")
    SSLMail.SendMail(e)
End Sub

End Class

หรือที่ใดก็ได้ในรหัสของคุณคุณสามารถโทร:

SSLMail.SendMail(New system.Net.Mail.MailMessage("from@from.com","to@to.com", "Subject", "Body"})

ฉันหวังว่านี่จะช่วยให้ทุกคนที่เข้ามาโพสต์นี้! (ฉันใช้ VB.NET แต่ฉันคิดว่ามันสำคัญที่จะแปลงเป็นภาษา. NET ใด ๆ )


+1 "enableSsl =" true "- ใช้งานได้กับแอปรุ่นเก่าซึ่งไม่ได้ตั้งค่าคุณสมบัติ Smtp.enableSsl โดยไม่ต้องคอมไพล์ชุดประกอบอีกครั้งเคล็ดลับที่ยอดเยี่ยม!
Metro Smurf

และอย่าลืมไฟร์วอลล์ พอร์ต 587 ไม่ใช่พอร์ตปกติที่จะเปิด
Guy Lowe

13
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("myusername@gmail.com", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("myusername@gmail.com","yourusername@gmail.com","test","testbody")

ถ้าคุณได้รับข้อผิดพลาดเช่น "เซิร์ฟเวอร์ SMTP ต้องเชื่อมต่อที่ปลอดภัยหรือลูกค้าที่ไม่ได้รับรองความถูกต้องการตอบสนองเซิร์ฟเวอร์:. 5.5.1 ตรวจสอบความถูกต้องใช้การเรียนรู้เพิ่มเติมที่" ที่ฉันได้รับก่อนหน้านี้ให้แน่ใจว่าสายSMTPClientObj.UseDefaultCredentials = Falseรวมและบรรทัดนี้ SMTPClientObj.Credentialsควรก่อน

ฉันพยายามเปลี่ยน 2 บรรทัดเหล่านี้ในทางตรงกันข้ามและข้อผิดพลาดการตรวจสอบสิทธิ์ 5.5.1 ที่ส่งคืนกลับมา


นี่คือสิ่งที่เกิดขึ้นกับฉัน ใครคิดว่าคำสั่งของการตั้งค่าคุณสมบัติจะแก้ไข / แตกสิ่ง
Bill Yang

นี่เป็นปัญหาสำหรับฉันเช่นกันฉันสลับไปตามลำดับที่แนะนำและใช้งานได้ดี - ปวดหัวเอ่อ!
eth0

13

โอ้ ... มันน่าอัศจรรย์ ... ก่อนอื่นข้าไม่สามารถส่งอีเมลได้ไม่ว่าด้วยเหตุผลใด แต่หลังจากที่ฉันเปลี่ยนลำดับของสองบรรทัดนี้ไปแล้วมันก็ใช้งานได้อย่างสมบูรณ์แบบ

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");

หวังว่าความช่วยเหลือนี้ !!! :)


1
ใช่คำสั่งนั้นสร้างความแตกต่าง โดยเฉพาะอย่างยิ่งเมื่อคุณตั้งค่าคุณสมบัติข้อมูลรับรองและคุณไม่ต้องการใช้ข้อมูลรับรองเริ่มต้น
Stefan Cvetanovski

1
ตามเอกสารประกอบในการใช้ข้อมูลประจำตัวคุณต้องตั้งค่า UseDefaultCredentials = false อย่างไรก็ตามการตั้งค่าทั้งสองนี้ดูเหมือนว่าจะมีการเชื่อมโยงเข้าด้วยกันอย่างลับๆ หากคุณตั้งค่า UseDefaultCredentials เป็นจริงหรือเท็จจะมีผลกระทบด้านข้างของการตั้งค่าข้อมูลรับรองเป็นโมฆะ และปรากฏการตั้งค่าข้อมูลรับรองอาจตั้งค่าผลข้างเคียง UseDefaultCredentials = false ไม่ได้บันทึกว่าเป็นการกระทำเช่นนี้อาจเป็นข้อผิดพลาดหรือเป็นเพียงผู้พัฒนาที่อ่อนแอ
แอรอน

10

ปัญหาไม่ใช่ความสามารถด้านเทคนิคในการส่งผ่าน gmail เหมาะกับสถานการณ์ส่วนใหญ่ หากคุณไม่สามารถรับเครื่องส่งได้มักจะเกิดจากเครื่องที่ไม่ได้รับการรับรองความถูกต้องกับมนุษย์อย่างน้อยหนึ่งครั้ง

ปัญหาที่ผู้ใช้ส่วนใหญ่เผชิญคือ Google ตัดสินใจเปลี่ยนขีด จำกัด ขาออกตลอดเวลา คุณควรเพิ่มรหัสป้องกันให้กับโซลูชันของคุณ หากคุณเริ่มเห็นข้อผิดพลาดให้ปิดความเร็วในการส่งและเพียงหยุดส่งสักครู่ หากคุณพยายามส่ง Google บางครั้งจะเพิ่มเวลาพิเศษในช่วงเวลาที่คุณรอก่อนที่คุณจะสามารถส่งได้อีกครั้ง

สิ่งที่ฉันได้ทำในระบบปัจจุบันของฉันคือการส่งด้วยความล่าช้า 1.5 วินาทีระหว่างแต่ละข้อความ จากนั้นถ้าฉันได้รับข้อผิดพลาดหยุด 5 นาทีแล้วเริ่มใหม่อีกครั้ง โดยปกติจะใช้งานได้และจะช่วยให้คุณสามารถส่งบัญชีได้ถึงขีด จำกัด ของบัญชี (ล่าสุดที่ฉันตรวจสอบแล้วคือ 2,000 รายการสำหรับการเข้าสู่ระบบลูกค้าระดับพรีเมียร์ต่อวัน)


1
นี่เป็นปัญหาของฉันอย่างแน่นอน! เมื่อฉันปรับใช้กับการผลิตฉันได้รับปัญหาและหลังจากที่ฉันเข้าสู่ Gmail ในเซิร์ฟเวอร์ตัวเองมันเริ่มทำงานอีกครั้ง
ThisGuy


9

ฉันมีปัญหาเดียวกัน แต่กลับกลายเป็นว่าการป้องกันไวรัสของฉันปิดกั้นอีเมล "สแปม" ขาออก การปิดตัวเลือกนี้ทำให้ฉันสามารถใช้พอร์ต 587 เพื่อส่งอีเมล SMTP ผ่าน GMail


ฉันปิดการใช้งาน Windows Defender และมันก็เริ่มทำงานเช่นกัน
MorioBoncz

9

หากไม่มีอะไรทำงานได้ที่นี่สำหรับคุณคุณอาจต้องอนุญาตการเข้าถึงบัญชี gmail ของคุณจากแอปพลิเคชันบุคคลที่สาม นี่เป็นปัญหาของฉัน หากต้องการอนุญาตการเข้าถึงให้ทำดังต่อไปนี้:

  1. ลงชื่อเข้าใช้บัญชี gmail ของคุณ
  2. ไปที่หน้านี้https://accounts.google.com/DisplayUnlockCaptchaและคลิกที่ปุ่มเพื่ออนุญาตการเข้าถึง
  3. ไปที่หน้านี้https://www.google.com/settings/security/lesssecureappsและเปิดใช้งานการเข้าถึงแอปที่ปลอดภัยน้อยกว่า

สิ่งนี้ใช้ได้กับฉันหวังว่ามันจะใช้ได้กับคนอื่น!


8

ฉันไม่แน่ใจว่าต้องใช้. NET รุ่นใดเนื่องจาก eglasius ที่กล่าวถึงไม่มีการenableSslตั้งค่าที่ตรงกัน(ฉันใช้. NET 4.0 แต่ฉันสงสัยว่ามันจะทำงานใน. NET 2.0 หรือใหม่กว่า) แต่การกำหนดค่านี้ใช้ได้สำหรับ ฉัน (และไม่ต้องการให้คุณใช้การตั้งค่าแบบเป็นโปรแกรม):

<system.net>
  <mailSettings>
    <smtp from="myusername@gmail.com" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" password="password" userName="myusername@gmail.com"/>
    </smtp>
  </mailSettings>
</system.net>

คุณอาจต้องเปิดใช้งาน POP หรือ IMAP ในบัญชี Gmail ของคุณก่อน: https://mail.google.com/mail/?shva=1#settings/fwdandpop

ฉันขอแนะนำให้ลองกับโปรแกรมรับส่งเมลปกติก่อน ...


2
ที่ใหม่ไป 4.0 เปรียบเทียบกับรุ่นที่ -> msdn.microsoft.com/en-us/library/ms164242(v=VS.90).aspx
eglasius

สวัสดี Eglasius ... โอเคขอบคุณสำหรับสิ่งนั้น! แปลกพวกเขามีเพียงวิธีการเขียนโปรแกรมใน pre-4.0 ฉันเดาว่าเราทุกคนลืมสิ่งต่าง ๆ ไปแล้ว :)
Wiebe Tijsma

6

@Andres Pompiglio: ใช่ถูกต้องคุณต้องเปลี่ยนรหัสผ่านของคุณอย่างน้อยหนึ่งครั้ง .. รหัสนี้ใช้งานได้ดี:

//Satrt Send Email Function
public string SendMail(string toList, string from, string ccList,
    string subject, string body)
{

    MailMessage message = new MailMessage();
    SmtpClient smtpClient = new SmtpClient();
    string msg = string.Empty;
    try
    {
        MailAddress fromAddress = new MailAddress(from);
        message.From = fromAddress;
        message.To.Add(toList);
        if (ccList != null && ccList != string.Empty)
            message.CC.Add(ccList);
        message.Subject = subject;
        message.IsBodyHtml = true;
        message.Body = body;
        // We use gmail as our smtp client
        smtpClient.Host = "smtp.gmail.com";   
        smtpClient.Port = 587;
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new System.Net.NetworkCredential(
            "Your Gmail User Name", "Your Gmail Password");

        smtpClient.Send(message);
        msg = "Successful<BR>";
    }
    catch (Exception ex)
    {
        msg = ex.Message;
    }
    return msg;
}
//End Send Email Function

และคุณสามารถโทรไปที่ฟังก์ชันโดยใช้:

Response.Write(SendMail(recipient Address, "UserName@gmail.com", "ccList if any", "subject", "body"))

เซิร์ฟเวอร์ SMTP ต้องการการเชื่อมต่อที่ปลอดภัยหรือไคลเอ็นต์ไม่ได้รับการตรวจสอบความถูกต้อง การตอบกลับของเซิร์ฟเวอร์คือ: 5.5.1 ต้องมีการตรวจสอบสิทธิ์ เรียนรู้เพิ่มเติมได้ที่
Savas Adar

6

ฉันใช้การเชื่อมต่อ VPN ขององค์กร นี่คือเหตุผลที่ฉันไม่สามารถส่งอีเมลจากแอปพลิเคชันของฉัน มันทำงานได้ถ้าฉันตัดการเชื่อมต่อจาก VPN


5

ฉันพบว่าบัญชีที่ฉันใช้ในการเข้าสู่ระบบนั้นถูกปิดใช้งานโดย google ด้วยเหตุผลบางอย่าง เมื่อฉันรีเซ็ตรหัสผ่าน (เป็นรหัสเดิม) จากนั้นฉันก็สามารถส่งอีเมลได้อย่างดี ฉันได้รับข้อความ 5.5.1 ด้วย


5

ฉันได้ลองวิธีแก้ปัญหาหลายอย่างแล้ว แต่ทำการเปลี่ยนแปลงบางอย่างมันจะทำงาน

host = smtp.gmail.com
port = 587
username = email@gmail.com
password = password
enabledssl = true

ด้วย smtpclient พารามิเตอร์ข้างต้นทำงานใน gmail


5

ฉันได้รับข้อผิดพลาดเดียวกันและไม่มีวิธีการแก้ปัญหาด้านบนเลย

ปัญหาของฉันคือฉันใช้รหัสจากเซิร์ฟเวอร์ระยะไกลซึ่งไม่เคยใช้ในการเข้าสู่บัญชี gmail

ฉันเปิดเบราว์เซอร์บนเซิร์ฟเวอร์ระยะไกลและเข้าสู่ระบบ Gmail จากที่นั่น มันถามคำถามเพื่อความปลอดภัยเพื่อยืนยันว่าเป็นฉันเพราะนี่เป็นที่ตั้งใหม่ หลังจากทำการตรวจสอบความปลอดภัยฉันสามารถตรวจสอบผ่านรหัส



4

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

ฉันรู้ว่ามันสายไปแล้ว แต่บางทีนี่อาจช่วยคนอื่นได้


4

อีกสิ่งหนึ่งที่ฉันพบคือคุณต้องเปลี่ยนรหัสผ่านของคุณอย่างน้อยหนึ่งครั้ง และพยายามใช้รหัสผ่านระดับความปลอดภัย (อย่าใช้ผู้ใช้เดียวกันกับรหัสผ่าน 123456 ฯลฯ )


4

อีกวิธีหนึ่งที่เป็นไปได้สำหรับคุณ ฉันมีปัญหาคล้ายกันในการเชื่อมต่อ gmail ผ่าน IMAP หลังจากลองใช้วิธีแก้ไขปัญหาทั้งหมดที่ฉันเจอคุณจะอ่านเกี่ยวกับที่นี่และที่อื่น ๆ ใน SO (เช่นเปิดใช้งาน IMAP ให้เปิดใช้งานการเข้าถึงจดหมายของคุณอย่างปลอดภัยน้อยลงโดยใช้https://accounts.google.com/b/0/displayunlockcaptchaและ ต่อไป) ฉันตั้งค่าบัญชี Gmail ใหม่อีกครั้ง

ในการทดสอบครั้งแรกของฉันบัญชี Gmail แรกที่ฉันสร้างขึ้นฉันได้เชื่อมต่อกับบัญชี Gmail หลักของฉัน สิ่งนี้ส่งผลให้เกิดพฤติกรรมที่ผิดปกติที่มีการอ้างอิงบัญชีที่ไม่ถูกต้องโดย google ตัวอย่างเช่นการเรียกใช้https://accounts.google.com/b/0/displayunlockcaptchaเปิดบัญชีหลักของฉันมากกว่าบัญชีที่ฉันสร้างขึ้นเพื่อวัตถุประสงค์

ดังนั้นเมื่อฉันสร้างบัญชีใหม่และไม่ได้เชื่อมต่อกับบัญชีหลักของฉันหลังจากทำตามขั้นตอนที่เหมาะสมทั้งหมดข้างต้นฉันพบว่ามันใช้งานได้ดี!

ฉันยังไม่ได้ยืนยันสิ่งนี้ (เช่นทำซ้ำ) แต่เห็นได้ชัดว่าทำเพื่อฉัน ... หวังว่าจะช่วยได้


4
  1. ก่อนอื่นให้ตรวจสอบการตั้งค่าบัญชี gmail ของคุณและเปิดจาก "การเข้าถึงแอพที่ปลอดภัยน้อยกว่า" ป้อนคำอธิบายรูปภาพที่นี่

เราขอแนะนำให้คุณใช้แอปที่ปลอดภัยเช่น Gmail เพื่อเข้าถึงบัญชีของคุณ แอปทั้งหมดที่ทำโดย Google ตรงตามมาตรฐานความปลอดภัยเหล่านี้ ในทางกลับกันการใช้แอพที่ปลอดภัยน้อยกว่าอาจทำให้บัญชีของคุณเสี่ยง เรียนรู้เพิ่มเติม.

  1. ชุด

    smtp.UseDefaultCredentials = false;

    ก่อน

    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);

4

มีเหตุผลอย่างน้อยหนึ่งข้อสำหรับข้อผิดพลาดเหล่านี้

  • เข้าสู่ระบบด้วย Gmail ของคุณ (หรืออื่น ๆ ถ้า) ในระบบท้องถิ่นของคุณ

  • ตรวจสอบแอพที่ปลอดภัยน้อยลงและตั้งเป็น "เปิด" ที่นี่คือลิงก์สำหรับ GMAIL https://www.google.com/settings/security/lesssecureapps

  • ตรวจสอบ EnableSsl ในรหัสอีเมลของคุณและตั้งค่าเป็นจริง

    smtp.EnableSsl = true;
  • ตรวจสอบพอร์ตที่คุณใช้อยู่ในขณะนี้ 25 คือทั่วโลก แต่คุณสามารถตรวจสอบเพื่อคนอื่นเช่น 587 ตรวจสอบที่นี่ การสื่อสาร SMTP ทั้งหมดเกิดขึ้นมากกว่า 25 ครั้งหรือไม่

  • หากคุณอยู่ในระยะไกล : ตรวจสอบคำตอบของVlad Tamasด้านบน


จะทำอย่างไรถ้าฉันไม่ต้องการเปิดการตั้งค่าแอพที่ปลอดภัยน้อยกว่าไคลเอนต์อีเมลอื่นจะทำเช่นนี้ทำไมฉันถึงทำแบบเดียวกันกับ c # ไม่ได้?
user734028

3

คุณยังสามารถเชื่อมต่อผ่านพอร์ต 465 แต่เนื่องจากข้อ จำกัด บางอย่างของ System.Net.Mail เนมสเปซคุณอาจต้องเปลี่ยนรหัสของคุณ นี่เป็นเพราะเนมสเปซไม่มีความสามารถในการทำการเชื่อมต่อ SSL โดยนัย นี้จะกล่าวถึงที่http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspxและฉัน ได้ให้ตัวอย่างของวิธีการใช้ CDO (วัตถุข้อมูลความร่วมมือ) ในการสนทนาอื่น ( GMail SMTP ผ่านข้อผิดพลาด C # .Net ในพอร์ตทั้งหมด )


3

ฉันแก้ไขปัญหานี้แล้ว เห็นได้ชัดว่าข้อความที่ใช้ในข้อผิดพลาดหลายประเภท ปัญหาของฉันคือฉันได้รับจดหมายที่ส่งครบ 500 ครั้งแล้ว

เข้าสู่บัญชีและลองส่งจดหมายด้วยตนเอง หากถึงขีด จำกัด แล้วระบบจะแจ้งให้คุณทราบ


2

หากคุณมีการยืนยันแบบ 2 ขั้นตอนในบัญชี Gmail ของคุณคุณจะต้องสร้างรหัสผ่านสำหรับแอป https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=th&visit_id=636903322072234863-1319515789&rd=1 เลือกวิธีสร้างตัวเลือกรหัสผ่านสำหรับแอปและทำตามขั้นตอนที่ให้ไว้ คัดลอกและวางรหัสผ่านสำหรับแอปที่สร้างไว้ที่ไหนสักแห่งเนื่องจากคุณจะไม่สามารถกู้คืนได้หลังจากที่คุณคลิกเสร็จสิ้น


2
smtp.Host = "smtp.gmail.com"; //host name
smtp.Port = 587; //port number
smtp.EnableSsl = true; //whether your smtp server requires SSL
smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
smtp.Timeout = 20000;

1

เปลี่ยนรหัสผ่าน gmail ของคุณแล้วลองใหม่อีกครั้งมันจะทำงานหลังจากนั้น

ไม่ทราบสาเหตุ แต่ทุกครั้งที่คุณเปลี่ยนโฮสต์คุณต้องเปลี่ยนรหัสผ่าน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.