it-gundan.com

C #으로 Gmail SMTP 서버를 통해 이메일 보내기

어떤 이유에서든 " Gmail을 통해 .NET에서 이메일 보내기 "에 대한 대답이나 다른 답변이 없습니다. 왜 그들은 일하지 않겠습니까?

업데이트 : 다른 질문에서 모든 답변 (수락 및 기타)을 시도했지만 그 중 아무도 작동하지 않습니다.

나는 다른 사람들을 위해 작동하는지 알고 싶다. 그렇지 않으면 Google이 뭔가를 변경했을 수도있다.

SmtpDeliveryMethod.Network를 사용하는 코드 조각을 사용하면 Send (메시지)에서 SmtpException이 발생합니다. 메시지는입니다.

SMTP 서버에 보안 연결이 필요하거나 클라이언트가 인증되지 않았습니다.

서버 응답 :

5.5.1 인증 필요. "<- 진지하게, 거기서 끝납니다.

업데이트 :

이것은 제가 오래전에 물어 본 질문입니다. 그리고 받아 들여진 대답은 여러 프로젝트에서 여러 번, 여러 번 사용해 본 코드입니다.

나는이 포스트와 다른 EmailSender 프로젝트에서 아이디어를 취하여 Codeplex에서 EmailSender 프로젝트 를 만들었습니다. 테스트 기능을 위해 설계되었으며 GoDaddy 및 Gmail과 같은 가장 좋아하는 SMTP 서비스를 지원합니다.

229
CVertex

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

또한 web.config, http://msdn.Microsoft.com/en-us/library/w355a94k.aspx 및 코드의 조합을 사용하여 작동시키고 있습니다 (왜냐하면 일치하는 EnableSsl이 구성 파일 :().

283
eglasius

다음은 거의 확실하게 답변 질문에 모든 오류가 실패한 경우 :

정확한 오류가 발생했습니다. Google의 새 암호가 밝혀졌습니다. 알고리즘이 너무 약해서 현재 암호가 너무 약한 것으로 간주되어 변경되었습니다. 메시지 나 경고조차 내게 알려주지 않습니다. 어떻게 찾았습니까? ? 음, 암호를 변경하여 도움이되는지 확인한 다음 (다른 모든 암호는 사용하지 않음) 암호를 변경하면 작동했습니다.

그런 다음 실험을 위해 비밀번호를 이전 비밀번호로 변경하여 이전 비밀번호를 다시 보았습니다. Gmail은 실제로이 작업을 수행 할 수 없었습니다. "죄송합니다. 귀하가 선택한 변경 사항으로이 변경 사항을 저장하도록 허용 할 수 없습니다. 암호가 너무 약함 "이며 이전 암호로 되돌릴 수 없습니다. 나는 이것이 잘못되었다는 것을 알아 냈습니다. 왜냐하면 a) 매월 x 개월마다 암호를 변경해야하거나 b) 암호를 변경해야하기 때문입니다. 앞에서 말했듯이 암호 강도 알고리즘이 변경되어 약한 암호가 허용되지 않았습니다. 로그인 할 때 아무 것도 말하지 않더라도! 약한 비밀번호가 약 4 개월 이었으므로이 (2 번)이 가장 가능성이 높은 시나리오이며 Gmail에서 사용할 수 있습니다.

그들이 이것에 관해 아무 말도하지 않았지만 그것은 합리적입니다. 대부분의 도용 된 이메일은 Gmail 외부의 소프트웨어를 사용하여 로그인되기 때문에 Gmail 환경 외부에서 Gmail을 사용하려면 더 강력한 비밀번호가 필요합니다.

이게 도움이 되길 바란다!

66

위의 다른 문제 해결 단계 외에도 Gmail 계정에 two-factor 인증 ( 2 단계 인증 이라고도 함)을 사용하도록 설정 한 경우이를 추가하고 싶습니다. 응용 프로그램 별 암호를 생성하고 새로 생성 된 암호를 사용하여 SMTP를 통해 인증해야 함.

비밀번호를 만들려면 https://www.google.com/settings/ 을 방문하고 인증 애플리케이션 및 사이트 를 선택하여 비밀번호를 생성하십시오.

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

Gmail 설정 링크

enter image description here

50
Suhail Mumtaz Awan

앞서 언급 한 여러 가지 상황으로 인해 Gmail 계정에서 이메일을 보내는 데 몇 가지 문제가있었습니다. 다음은 어떻게 작동하는지 요약하고, 동시에 유연하게 유지하는 방법에 대한 요약입니다.

  • 먼저 GMail 계정을 설정하십시오 :
    • IMAP을 활성화하고 올바른 최대 메시지 수를 지정하십시오 (여기서 할 수 있습니다
    • 비밀번호가 7 자 이상이어야하며 Google에 따라 강해야합니다.
    • 먼저 captcha 코드를 입력 할 필요가 없는지 확인하십시오. 브라우저에서 테스트 이메일을 보내면됩니다.
  • Web.config (또는 app.config에서 변경하십시오. 아직 시도하지는 않았지만 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

이제 이메일을 보내려는 경우 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("[email protected]")
    SSLMail.SendMail(e)
End Sub

End Class

또는 코드의 어느 곳에서나 호출 할 수 있습니다.

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

나는이 게시물에 누가 실행 도움이되기를 바랍니다! (VB.NET을 사용했지만 .NET 언어로 변환하는 것이 간단하다고 생각합니다.)

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

"SMTP 서버에 보안 연결이 필요하거나 클라이언트가 인증되지 않았습니다. 서버 응답 : 5.5.1 인증이 필요합니다. 더 자세히 알아보십시오"와 같은 오류가 발생하기 전에이 줄을 SMTPClientObj.UseDefaultCredentials = False에 포함했는지 확인하십시오. 줄은 SMTPClientObj.Credentials 앞에 있어야합니다.

이 두 줄을 반대 방향으로 전환하려고 시도했는데 5.5.1 인증 필요 오류 반환되었습니다.

13
Terry Chng

오 ... 정말 놀랍습니다 ... 처음에는 어떤 이유로 든 이메일을 보낼 수 없었습니다. 하지만이 두 줄의 순서를 아래와 같이 변경하면 완벽하게 작동합니다.

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

희망이 도움이! :)

12
Wirol

나는 똑같은 문제가 있었지만 내 바이러스 보호로 밝혀지면 나가는 "스팸"이메일을 차단하고있었습니다. 이 설정을 해제하면 포트 587을 사용하여 Gmail 이메일을 통해 SMTP 이메일을 보낼 수있었습니다.

9
user464329

이 문제를 해결하기위한 간단한 단계 :

1) Gmail에 로그인하십시오.

2)이 페이지로 이동 https://www.google.com/settings/security/lesssecureapps & 설정 "설정"

9
Kevin

문제는 Gmail을 통해 전송할 수있는 기술적 능력이 아닙니다. 그것은 대부분의 상황에서 효과가 있습니다. 기계를 보내지 못하게되면 보통 기계가 최소한 한 번은 제어 시스템에서 사람과 인증을받지 않았기 때문입니다.

대부분의 사용자가 직면하는 문제는 Google이 아웃 바운드 한도를 항상 변경하기로 결정했기 때문입니다. 항상 솔루션에 방어적인 코드를 추가해야합니다. 오류가 발생하기 시작하면 전송 속도를 줄이고 잠시 동안 전송을 중지하십시오. 계속해서 보내려고하면 Google은 지연 시간에 여분의 시간을 추가하여 다시 보낼 수 있습니다.

현재 시스템에서 수행 한 작업은 각 메시지 사이에 1.5 초 지연으로 전송하는 것입니다. 그런 다음 오류가 발생하면 5 분 동안 멈추고 다시 시작하십시오. 이것은 일반적으로 작동하며 계정의 한도까지 보낼 수 있습니다. 마지막으로 하루에 가장 우수한 고객 로그인 수는 2,000입니다.

9
Jason Short

Eglasius가 일치하는 enableSsl 설정이 없다는 것을 언급했기 때문에 .NET 버전이 필요한지 잘 모르겠다. (.NET 4.0을 사용하고 있지만 .NET 2.0 이상에서 작동하는 것으로 의심된다.) 그러나이 구성은 올바르게 작동했다. 나를 위해 (그리고 프로그래밍 방식의 구성을 사용할 필요는 없습니다) :

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

먼저 Gmail 계정에서 POP 또는 IMAP을 활성화해야 할 수도 있습니다. https://mail.google.com/mail/?shva=1#settings/fwdandpop

나는 일반적인 메일 클라이언트로 먼저 시도하는 것이 좋습니다 ...

8
Wiebe Tijsma

다른 방법이없는 경우 타사 응용 프로그램에서 Gmail 계정에 대한 액세스를 허용해야 할 수 있습니다. 이것은 내 문제였다. 액세스를 허용하려면 다음을 수행하십시오.

  1. Gmail 계정에 로그인하십시오.
  2. 이 페이지 https://accounts.google.com/DisplayUnlockCaptcha 를 방문하고 버튼을 클릭하여 액세스를 허용하십시오.
  3. 이 페이지 https://www.google.com/settings/security/lesssecureapps 를 방문하여 덜 안전한 앱에 대한 액세스를 활성화하십시오.

이것은 나를 위해 일하는 희망 다른 사람을 위해!

8
Celt

회사 VPN 연결을 사용하고있었습니다. 내 신청서에서 이메일을 보낼 수없는 이유가 바로 여기에 있습니다. VPN 연결을 끊으면 작동합니다.

6
Ned

@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, "[email protected]", "ccList if any", "subject", "body"))
6
maxcoder

나는 또한 로그인하는 데 사용 된 계정이 어떤 이유로 Google에 의해 비활성화되었음을 발견했습니다. 일단 암호를 재설정하면 (이전과 동일), 전자 메일을 정상적으로 보낼 수있었습니다. 나는 5.5.1 메시지도 받고 있었다.

5
RKL

나는 또한 많은 해결책을 시도했지만 약간의 변화를 만들었다.

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

매개 변수 위의 smtpclient는 Gmail에서 작동합니다.

5
Suresh

또 다른 가능한 솔루션입니다. 나는 IMAP을 통해 Gmail에 연결하는 비슷한 문제를 겪고 있었다. 내가 만난 모든 솔루션을 시도한 후에는 SO (예 : IMAP 사용, 메일에 대한 보안 수준이 낮은 액세스 사용 https : // 계정 사용 .google.com/b/0/displayunlockcaptcha 등), 실제로 새 Gmail 계정을 한 번 더 설정했습니다.

원래 만든 테스트에서 내가 만든 첫 번째 gmail 계정은 내 주요 Gmail 계정에 연결되어있었습니다. 이로 인해 잘못된 계정이 Google에 의해 참조되는 경우 엉뚱한 행동이 발생했습니다. 예를 들어, running https://accounts.google.com/b/0/displayunlockcaptcha 는 내가 만든 목적보다는 내 기본 계정을 열었습니다.

따라서 새 계정을 만들고 기본 계정에 연결하지 않은 경우 위의 모든 단계를 수행 한 후에 정상적으로 작동하는 것으로 나타났습니다.

나는 이것을 (즉, 재현 한) 확인하지는 못했지만 분명히 나를 위해 해냈다 ... 도움이되기를 바란다.

4
sinewave440hz

동일한 오류가 발생하고 위의 해결 방법이 도움이되지 않았습니다.

내 문제는 Gmail 계정에 로그인하는 데 사용되지 않은 원격 서버에서 코드를 실행하고 있다는 것이 었습니다.

원격 서버에 브라우저를 열고 거기에서 Gmail에 로그인했습니다. 보안 질문에 새로운 장소 였기 때문에 그것이 나인지 확인해달라고 요청했습니다. 보안 검사를 한 후 코드를 통해 인증 할 수있었습니다.

4
Vlad Tamas

이 동일한 오류가 발생했습니다 "SMTP 서버에 보안 연결이 필요하거나 클라이언트가 인증되지 않았습니다. 서버 응답 : 5.5.1 인증 필요. 자세히 알아보기") 잘못된 암호를 사용하고 있음을 알았습니다. 로그인 자격 증명을 수정하고 올바르게 보냈습니다.

나는 이것이 늦었다는 것을 알고 있지만, 아마도 이것은 다른 누군가를 도울 것입니다.

4
Albert Bori

덜 안전한 앱을 계정에 사용 : https://www.google.com/settings/security/lesssecureapps

4
Burak Kalkan
  1. 먼저 Gmail 계정 설정을 확인하고 "덜 안전한 앱을위한 액세스"에서 켜기 enter image description here

계정에 액세스하려면 Gmail과 같은 보안 앱을 사용하는 것이 좋습니다. Google에서 만든 모든 앱은 이러한 보안 표준을 준수합니다. 반대로 덜 안전한 앱을 사용하면 계정이 취약해질 수 있습니다. 자세히 알아보기.

  1. 세트

    smtp.UseDefaultCredentials = false;
    

    전에

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

내가 찾은 또 다른 사항은 암호를 한 번 이상 변경해야한다는 것입니다. 그리고 안전한 수준의 암호를 사용하십시오 (암호, 123456 등과 같은 사용자를 사용하지 마십시오)

4
Andres Pompiglio

이 문제가 해결되었습니다. Aparently 그 메시지는 여러 오류 유형에 사용됩니다. 내 문제는 내가 보낸 최대 500 통의 메일에 도달했기 때문이다.

계정에 로그인하여 수동으로 메일 보내기를 시도하십시오. 한도에 도달하면 알려드립니다.

3
Ayson Baxter

포트 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 (Collaborative Data Object)를 다른 토론에서 사용하는 예제를 제공했다. ( 모든 포트에서 C # .Net 오류를 통해 GMail SMTP ).

3
Bryan Allred

이 오류는 하나 이상의 이유가 있습니다.

  • 로컬 시스템의 Gmail (또는 다른 if)로 로그인하십시오.

  • 덜 안전한 앱을 확인하고 '사용 설정'을 GMAIL의 링크로 설정합니다. https://www.google.com/settings/security/lesssecureapps

  • 이메일 코드에서 EnableSsl을 확인하고 true로 설정하십시오.

    smtp.EnableSsl = true;
    
  • 또한 현재 어떤 포트를 사용하고 있는지 확인하십시오. 25는 Global이지만 587과 같은 다른 사람도 확인할 수 있습니다. 여기를 확인하십시오. 모든 SMTP 통신은 25 회 이상 발생합니까?

  • 리모콘에있는 경우 : 위의 Vlad Tamas 의 대답을 확인하십시오.

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

Gmail 비밀번호를 변경하고 다시 시도하십시오. 그 후에야 작동합니다.

이유를 모르겠지만 호스팅을 변경할 때마다 암호를 변경해야합니다.

1
Jo Smo

Gmail 계정에서 2 단계 인증 단계를 거친 경우 앱 비밀번호를 생성해야합니다. https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=ko&visit_id=636903322072234863-1319515789&rd=1 앱 비밀번호 생성 옵션을 선택하고 제공된 단계를 따르십시오. 생성 된 앱 비밀번호를 복사하여 붙여 넣기를 클릭 한 후에는 복구 할 수 없으므로 어딘가에 붙여 넣으십시오.

0
Faith Nassiwa