it-swarm-vi.com

Gửi email thông qua máy chủ Gmail SMTP bằng C #

Vì một số lý do, cả câu trả lời được chấp nhận cũng như bất kỳ câu trả lời nào khác đều không phù hợp với tôi vì " Gửi email bằng .NET thông qua Gmail ". Tại sao họ không làm việc?

CẬP NHẬT: Tôi đã thử tất cả các câu trả lời (được chấp nhận và mặt khác) trong câu hỏi khác, nhưng không có câu trả lời nào hoạt động.

Tôi chỉ muốn biết nếu nó hoạt động cho bất kỳ ai khác, nếu không Google có thể đã thay đổi điều gì đó (điều này đã xảy ra trước đây).

Khi tôi thử đoạn mã sử dụng SmtpDeliveryMethod.Network, tôi nhanh chóng nhận được SmtpException trên Gửi (tin nhắn). Tin nhắn là

Máy chủ SMTP yêu cầu kết nối an toàn hoặc máy khách không được xác thực.

Phản hồi của máy chủ là:

5.5.1 Yêu cầu xác thực. Tìm hiểu thêm tại "<- nghiêm túc, nó kết thúc ở đó.

CẬP NHẬT:

Đây là một câu hỏi mà tôi đã hỏi từ lâu và câu trả lời được chấp nhận là mã mà tôi đã sử dụng nhiều, nhiều lần cho các dự án khác nhau.

Tôi đã lấy một số ý tưởng trong bài đăng này và các dự án EmailSender khác để tạo dự án EmailSender tại Codeplex . Nó được thiết kế để kiểm tra và hỗ trợ các dịch vụ SMTP yêu thích của tôi như GoDaddy và Gmail.

229
CVertex

CVertex, đảm bảo xem lại mã của bạn và nếu điều đó không tiết lộ bất cứ điều gì, hãy đăng nó. Tôi chỉ kích hoạt tính năng này trên một trang web ASP.NET thử nghiệm mà tôi đang làm việc và nó hoạt động.

Trên thực tế, tại một số thời điểm tôi đã có một vấn đề về mã của tôi. Tôi đã không phát hiện ra nó cho đến khi tôi có một phiên bản đơn giản hơn trên một chương trình điều khiển và thấy nó đang hoạt động (không có thay đổi nào về phía Gmail như bạn lo lắng). Mã dưới đây hoạt động giống như các mẫu bạn đã đề cập:

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("[email protected]", "mypwd"),
                EnableSsl = true
            };
            client.Send("[email protected]", "[email protected]", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

Tôi cũng đã làm cho nó hoạt động bằng cách sử dụng kết hợp web.config, http://msdn.Microsoft.com/en-us/l Library/w355a94k.aspx và mã (vì không có EnableSsl phù hợp trong tập tin cấu hình :( ).

283
eglasius

NHỮNG SAU SAU CÒN LÀ NGƯỜI TRẢ LỜI LÀ TRẢ LỜI ĐẾN CÂU HỎI CỦA BẠN NẾU TẤT CẢ MỌI THỨ ĐÃ ĐƯỢC FAILED:

Tôi cũng mắc một lỗi chính xác, hóa ra thuật toán đo mật khẩu mới của Google đã thay đổi vì cho rằng mật khẩu hiện tại của tôi quá yếu và không cho tôi biết điều gì về nó (thậm chí không phải là tin nhắn hay cảnh báo) ... Làm thế nào tôi phát hiện ra điều này ? Chà, tôi đã chọn thay đổi mật khẩu của mình để xem nó có giúp ích không (đã thử mọi cách khác nhưng không được) và khi tôi thay đổi mật khẩu, nó đã hoạt động!

Sau đó, để thử nghiệm, tôi đã thử thay đổi mật khẩu trở lại mật khẩu trước đó để xem điều gì sẽ xảy ra và Gmail thực sự không cho phép tôi làm điều này, với lý do "xin lỗi, chúng tôi không thể cho phép bạn lưu thay đổi này như bạn đã chọn mật khẩu quá yếu "và sẽ không cho phép tôi quay lại mật khẩu cũ. Tôi nhận ra rằng nó đã bị lỗi vì a) bạn cần thay đổi mật khẩu của mình một lần sau mỗi x số tháng hoặc b). như tôi đã nói trước đây, thuật toán độ mạnh mật khẩu của họ đã thay đổi và do đó mật khẩu yếu tôi đã không được chấp nhận, mặc dù họ không nói gì về điều này khi cố gắng đăng nhập MỌI NƠI! Đây (số 2) là kịch bản có khả năng nhất, vì mật khẩu yếu của tôi đã được khoảng 4 tháng và nó cho phép tôi sử dụng nó trong Gmail.

Thật tệ khi họ không nói gì về điều này, nhưng nó có ý nghĩa. Bởi vì hầu hết các email bị tấn công đều được đăng nhập bằng phần mềm bên ngoài gmail và tôi đoán bạn bắt buộc phải có mật khẩu mạnh hơn nếu bạn muốn sử dụng Gmail bên ngoài môi trường Gmail.

Tôi hi vọng cái này giúp được!

66
Erx_VB.NExT.Coder

Ngoài các bước khắc phục sự cố khác ở trên, tôi cũng muốn thêm rằng nếu bạn đã bật xác thực hai yếu tố (còn được gọi là xác minh hai bước ) trên tài khoản Gmail của bạn, bạn phải tạo mật khẩu dành riêng cho ứng dụng và sử dụng mật khẩu mới được tạo để xác thực qua SMTP .

Để tạo một cái, hãy truy cập: https://www.google.com.vn/sinstall/ và chọn Cho phép ứng dụng và trang web để tạo mật khẩu.

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

Liên kết đến Cài đặt Gmail

enter image description here

50
Suhail Mumtaz Awan

Tôi cũng gặp một số vấn đề khi gửi email từ tài khoản gmail của mình, nguyên nhân là do một số tình huống đã nói ở trên. Đây là một bản tóm tắt về cách tôi làm cho nó hoạt động và giữ cho nó linh hoạt cùng một lúc:

  • Trước hết hãy thiết lập tài khoản Gmail của bạn: [.__.]
    • Bật IMAP và xác nhận đúng số lượng tin nhắn tối đa (bạn có thể làm như vậy tại đây)
    • Đảm bảo mật khẩu của bạn có ít nhất 7 ký tự và mạnh (theo Google)
    • Hãy chắc chắn rằng bạn không phải nhập mã captcha trước. Bạn có thể làm như vậy bằng cách gửi email kiểm tra từ trình duyệt của bạn.
  • Thực hiện các thay đổi trong web.config (hoặc app.config, tôi chưa thử điều đó nhưng tôi cho rằng thật dễ dàng để làm cho nó hoạt động trong ứng dụng Windows):
<configuration>
    <appSettings>
        <add key="EnableSSLOnMail" value="True"/>   
    </appSettings>

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="[email protected]" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    Host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="[email protected]"
                    />
                <!-- 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

Và bây giờ bất cứ khi nào bạn muốn gửi email, tất cả những gì bạn cần làm là gọi SSLMail.SendMail:

ví dụ. trong một trang có kiểm soát 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("[email protected]")
    SSLMail.SendMail(e)
End Sub

End Class

Hoặc bất cứ nơi nào trong mã của bạn, bạn có thể gọi:

SSLMail.SendMail(New system.Net.Mail.MailMessage("[email protected]","[email protected]", "Subject", "Body"})

Tôi hy vọng điều này sẽ giúp bất cứ ai chạy vào bài viết này! (Tôi đã sử dụng VB.NET nhưng tôi nghĩ việc chuyển đổi nó sang bất kỳ ngôn ngữ .NET nào là không quan trọng.)

29
Sebas
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("[email protected]", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("[email protected]","[email protected]","test","testbody")

Nếu bạn gặp lỗi như "Máy chủ SMTP yêu cầu kết nối an toàn hoặc máy khách không được xác thực. Phản hồi của máy chủ là: 5.5.1 Yêu cầu xác thực. Tìm hiểu thêm tại" như tôi nhận được trước đây, hãy đảm bảo có dòng SMTPClientObj.UseDefaultCredentials = False và điều này dòng nên trước SMTPClientObj.Credentials.

Tôi đã thử chuyển 2 dòng này theo cách ngược lại và 5.5.1 Lỗi Yêu cầu Xác thực được trả về.

13
Terry Chng

Ồ ... Thật tuyệt vời ... Đầu tiên tôi không thể gửi email vì bất kỳ lý do gì. Nhưng sau khi tôi thay đổi trình tự của hai dòng này như dưới đây, nó hoạt động hoàn hảo.

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("[email protected]", "password");

Hy vọng điều này giúp đỡ!!! :)

12
Wirol

Tôi gặp vấn đề tương tự, nhưng hóa ra là phần mềm chống vi-rút của tôi đã chặn email "spam". Tắt tính năng này cho phép tôi sử dụng cổng 587 để gửi email SMTP qua GMail

9
user464329

Các bước đơn giản để khắc phục điều này:

1) Đăng nhập vào Gmail của bạn

2) Điều hướng đến trang này https://www.google.com.vn/sinstall/security/lesssecur Ứng dụng lại & đặt thành "Bật"

9
Kevin

Vấn đề không phải là một trong những khả năng kỹ thuật để gửi qua gmail. Điều đó làm việc cho hầu hết các tình huống. Nếu bạn không thể nhận được một máy để gửi, thường là do máy chưa được xác thực với con người tại các điều khiển ít nhất một lần.

Vấn đề mà hầu hết người dùng gặp phải là Google quyết định thay đổi giới hạn ra bên ngoài mọi lúc. Bạn nên luôn luôn thêm mã phòng thủ vào giải pháp của bạn. Nếu bạn bắt đầu thấy lỗi, hãy tắt tốc độ gửi của bạn và chỉ dừng gửi trong một thời gian. Nếu bạn tiếp tục cố gắng gửi Google đôi khi sẽ thêm thời gian thêm vào thời gian trì hoãn của bạn trước khi bạn có thể gửi lại.

Những gì tôi đã làm trong hệ thống hiện tại của mình là gửi với độ trễ 1,5 giây giữa mỗi tin nhắn. Sau đó, nếu tôi nhận được bất kỳ lỗi nào, dừng lại trong 5 phút và sau đó bắt đầu lại. Điều này thường hoạt động và sẽ cho phép bạn gửi tối đa giới hạn của tài khoản (lần cuối tôi kiểm tra là 2.000 để đăng nhập khách hàng hàng đầu mỗi ngày).

9
Jason Short

Tôi không chắc chắn phiên bản .NET nào được yêu cầu cho việc này vì eglasius đã đề cập không có cài đặt enableSsl phù hợp (Tôi đang sử dụng .NET 4.0, nhưng tôi nghi ngờ nó hoạt động trong .NET 2.0 trở lên), nhưng cấu hình này chỉ hoạt động đối với tôi (và không yêu cầu bạn sử dụng bất kỳ cấu hình lập trình nào):

<system.net>
  <mailSettings>
    <smtp from="[email protected]" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" Host="smtp.gmail.com" port="587" password="password" userName="[email protected]"/>
    </smtp>
  </mailSettings>
</system.net>

Trước tiên, bạn có thể phải bật POP hoặc IMAP trên tài khoản Gmail của mình: https://mail.google.com/mail/?shva=1#sinstall/fwdandpop

Tôi khuyên bạn nên thử nó với một ứng dụng thư bình thường trước ...

8
Wiebe Tijsma

Nếu không có gì khác làm việc ở đây cho bạn, bạn có thể cần cho phép truy cập vào tài khoản gmail của mình từ các ứng dụng của bên thứ ba. Đây là vấn đề của tôi. Để cho phép truy cập, hãy làm như sau:

  1. Đăng nhập vào tài khoản gmail của bạn.
  2. Truy cập trang này https://accounts.google.com/DisplayUnlockCaptcha và nhấp vào nút để cho phép truy cập.
  3. Truy cập trang này https://www.google.com.vn/sinstall/security/lesssecur Ứng dụng lại và cho phép truy cập các ứng dụng kém an toàn hơn.

Điều này làm việc cho tôi hy vọng nó làm việc cho người khác!

8
Celt

Tôi đã sử dụng kết nối VPN của công ty. Đó là lý do tại sao tôi không thể gửi email từ ứng dụng của mình. Nó hoạt động nếu tôi ngắt kết nối khỏi VPN.

6
Ned

@Andres Pompiglio: Đúng vậy, bạn phải thay đổi mật khẩu của mình ít nhất một lần .. mã này hoạt động tốt:

//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

VÀ bạn có thể thực hiện cuộc gọi đến chức năng bằng cách sử dụng:

Response.Write(SendMail(recipient Address, "[email protected]", "ccList if any", "subject", "body"))
6
maxcoder

Tôi cũng thấy rằng tài khoản tôi sử dụng để đăng nhập đã bị hủy kích hoạt bởi google vì một số lý do. Khi tôi đặt lại mật khẩu của mình (giống như trước đây), tôi có thể gửi email tốt. Tôi cũng nhận được tin nhắn 5.5.1.

5
RKL

Tôi cũng đã thử nhiều giải pháp nhưng thực hiện một số thay đổi thì nó sẽ hoạt động

Host = smtp.gmail.com
port = 587
username = [email protected]
password = password
enabledssl = true

với các tham số trên smtpclient đang hoạt động trong gmail

5
Suresh

Một giải pháp khả thi khác cho bạn. Tôi gặp vấn đề tương tự khi kết nối với gmail qua IMAP. Sau khi thử tất cả các giải pháp mà tôi đã gặp mà bạn sẽ đọc ở đây và các nơi khác trên SO (ví dụ: bật IMAP, cho phép truy cập ít an toàn hơn vào thư của bạn, sử dụng tài khoản https: //. google.com/b/0/displayunlockcaptcha và cứ thế), tôi thực sự thiết lập một tài khoản gmail mới một lần nữa.

Trong thử nghiệm ban đầu của tôi, tài khoản gmail đầu tiên tôi đã tạo, tôi đã kết nối với tài khoản gmail chính của mình. Điều này dẫn đến hành vi thất thường trong đó tài khoản sai đã được google tham khảo. Ví dụ: chạy https://accounts.google.com/b/0/displayunlockcaptcha đã mở tài khoản chính của tôi chứ không phải tài khoản tôi đã tạo cho mục đích này.

Vì vậy, khi tôi tạo một tài khoản mới và không kết nối nó với tài khoản chính của mình, sau khi làm theo tất cả các bước thích hợp như trên, tôi thấy rằng nó hoạt động tốt!

Tôi chưa xác nhận điều này (tức là sao chép), nhưng rõ ràng nó đã làm điều đó cho tôi ... hy vọng nó có ích.

4
sinewave440hz

Tôi đã nhận được cùng một lỗi và không có giải pháp nào ở trên giúp được.

Vấn đề của tôi là tôi đã chạy mã từ một máy chủ từ xa, chưa bao giờ được sử dụng để đăng nhập vào tài khoản gmail.

Tôi đã mở một trình duyệt trên máy chủ từ xa và đăng nhập vào gmail từ đó. Nó hỏi một câu hỏi bảo mật để xác minh đó là tôi vì đây là một địa điểm mới. Sau khi thực hiện kiểm tra bảo mật, tôi đã có thể xác thực thông qua mã.

4
Vlad Tamas

Tôi gặp phải lỗi tương tự ("Máy chủ SMTP yêu cầu kết nối an toàn hoặc máy khách không được xác thực. Phản hồi của máy chủ là: 5.5.1 Yêu cầu xác thực. Tìm hiểu thêm tại") và phát hiện ra rằng tôi đã sử dụng sai mật khẩu. Tôi đã sửa thông tin đăng nhập và nó được gửi chính xác.

Tôi biết điều này là muộn, nhưng có lẽ điều này sẽ giúp người khác.

4
Albert Bori

Bật các ứng dụng kém an toàn hơn cho tài khoản của bạn: https://www.google.com.vn/sinstall/security/lesssecur Ứng dụng lại

4
Burak Kalkan
  1. Trước tiên hãy kiểm tra cài đặt tài khoản gmail của bạn và bật từ "Truy cập cho các ứng dụng kém an toàn hơn" enter image description here

Chúng tôi thực sự khuyên bạn nên sử dụng một ứng dụng bảo mật, như Gmail, để truy cập tài khoản của bạn. Tất cả các ứng dụng được tạo bởi Google đều đáp ứng các tiêu chuẩn bảo mật này. Mặt khác, sử dụng một ứng dụng kém an toàn hơn có thể khiến tài khoản của bạn dễ bị tổn thương. Tìm hiểu thêm.

  1. Bộ

    smtp.UseDefaultCredentials = false;
    

    trước

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

Một điều khác mà tôi đã tìm thấy là bạn phải thay đổi mật khẩu của mình ít nhất một lần. Và thử sử dụng mật khẩu cấp an toàn (không sử dụng cùng một người dùng với mật khẩu, 123456, v.v.)

4
Andres Pompiglio

Tôi đã giải quyết vấn đề này. Aparently tin nhắn đó được sử dụng trong nhiều loại lỗi. Vấn đề của tôi là tôi đã đạt tối đa 500 thư được gửi.

đăng nhập vào tài khoản và cố gắng gửi mail. Nếu đạt đến giới hạn, nó sẽ thông báo cho bạn

3
Ayson Baxter

Bạn cũng có thể kết nối qua cổng 465, nhưng do một số hạn chế của không gian tên System.Net.Mail, bạn có thể phải thay đổi mã của mình. Điều này là do không gian tên không cung cấp khả năng tạo các kết nối SSL ẩn. Điều này được thảo luận tại http://bloss.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against -port-465.aspx và tôi đã cung cấp một ví dụ về cách sử dụng CDO (Đối tượng dữ liệu hợp tác) trong một cuộc thảo luận khác ( Chuyển đổi thư điện tử qua C # Lỗi .Net trên tất cả các cổng ).

3
Bryan Allred

Một hoặc nhiều lý do là có cho những lỗi này.

  • Đăng nhập bằng Gmail của bạn (hoặc bất kỳ cái nào khác nếu) trong hệ thống cục bộ của bạn.

  • Ngoài ra, hãy kiểm tra Ứng dụng ít bảo mật hơn và đặt thành "Bật" ở đây là Liên kết cho GMAIL. https://www.google.com.vn/sinstall/security/lesssecur Ứng dụng lại

  • kiểm tra EnableSsl trong mã Email của bạn và cũng đặt nó thành đúng.

    smtp.EnableSsl = true;
    
  • Đồng thời kiểm tra cổng nào bạn đang sử dụng. 25 là Toàn cầu, nhưng bạn có thể kiểm tra nó cho những người khác giống như 587. kiểm tra tại đây. Có phải tất cả giao tiếp SMTP xảy ra trên 25 không?

  • NẾU BẠN TRÊN TỪ XA : Kiểm tra câu trả lời của Vlad Tamas ở trên.

2
Bharat
  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;
2
somesh

Thay đổi mật khẩu gmail của bạn và thử lại, nó sẽ hoạt động sau đó.

Không biết tại sao, nhưng mỗi khi bạn thay đổi lưu trữ, bạn phải thay đổi mật khẩu của mình.

1
Jo Smo

Nếu bạn đã xác minh 2 bước trên tài khoản Gmail của mình, bạn sẽ cần tạo mật khẩu Ứng dụng. https://support.google.com/accounts RUB/185833?p=app_passwords_sa&hl=en&visit_id=636903322072234863-1319515789&rd=1 Chọn Cách tạo tùy chọn mật khẩu ứng dụng và làm theo các bước được cung cấp. Sao chép và dán mật khẩu Ứng dụng đã tạo ở đâu đó vì bạn sẽ không thể khôi phục mật khẩu sau khi bạn nhấp vào XONG.

0
Faith Nassiwa