programing

C#을 사용하여 Gmail SMTP 서버를 통해 전자 메일 보내기

linuxpc 2023. 5. 6. 14:07
반응형

C#을 사용하여 Gmail SMTP 서버를 통해 전자 메일 보내기

어떤 이유로든 수락된 답변이나 다른 어떤 답변도 "이메일 보내기"에 대해 제게 도움이 되지 않습니다.Gmail을 통한 NET".왜 그들은 일하지 않을까요?

업데이트: 다른 질문에 대한 모든 답변(인정 및 기타)을 시도해 보았지만 어느 것도 작동하지 않습니다.

저는 그것이 다른 사람에게 효과가 있는지 알고 싶습니다. 그렇지 않으면 구글이 (이전에 일어난) 무언가를 바꿨을 수도 있습니다.

▁▁uses를 사용하는 볼때.SmtpDeliveryMethod.NetworkSend(메시지) 시 SmtpException을 빠르게 수신합니다.는 메지는입니다.

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

서버 응답은 다음과 같습니다.

5.5.1 인증 필요.자세한 내용은 "<-- 정말로, 여기서 끝납니다.

업데이트:

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

저는 이 게시물과 다른 EmailSender 프로젝트의 아이디어 중 일부를 Codeplex에서 EmailSender 프로젝트를 만들었습니다.테스트 가능성을 위해 설계되었으며 GoDaddy 및 Gmail과 같은 제가 좋아하는 SMTP 서비스를 지원합니다.

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구성 파일:( ).

2021년 업데이트

기본적으로 gmail 설정 페이지(google.com/settings/security/lesssecureapps 에서 "보안 수준이 낮은 앱"에 대한 액세스를 활성화해야 합니다.서버 응답이 "5.5.1 인증이 필요합니다."라는 예외가 발생할 경우 이 작업이 필요합니다.@Ravendarksky 덕분에

위의 다른 문제 해결 단계 외에도 GMail 계정에서 2단계 인증(2단계 확인이라고도 함)을 사용하도록 설정한 경우에는 응용 프로그램별 암호를 생성하고 새로 생성된 암호를 사용하여 SMTP를 통해 인증해야 합니다.

암호를 만들려면 https://www.google.com/settings/ 을 방문하고 암호를 생성할 응용프로그램 사이트 인증을 선택합니다.

다른 모든 것이 실패한 경우 다음은 거의 확실하게 질문대한 답변이 될 입니다.

정확히 같은 오류가 발생했습니다. Google의 새로운 암호 강도 측정 알고리즘이 제 현재 암호를 너무 취약하다고 간주하고 메시지나 경고도 알려주지 않는 것으로 나타났습니다.제가 이걸 어떻게 발견했죠?음, 저는 그것이 도움이 되는지 알아보기 위해 비밀번호를 바꾸기로 결정했고(다른 모든 것을 시도했지만 소용이 없었습니다), 제가 비밀번호를 바꾸었을 때, 그것은 작동했습니다!

그리고 나서, 실험을 위해, 저는 무슨 일이 일어날지 보기 위해 제 비밀번호를 다시 이전 비밀번호로 바꾸려고 시도했지만, Gmail은 "선택한 비밀번호가 너무 약해서 이 변경사항을 저장할 수 없습니다"라는 이유를 들어 제가 이전 비밀번호로 돌아가지 못하게 했습니다.저는 이것을 통해 a) x개월마다 한 번씩 비밀번호를 변경해야 하거나 b)로 인해 오류가 발생하고 있다는 것을 알았습니다.제가 전에 말했듯이, 그들의 비밀번호 강도 알고리즘이 바뀌어서, 제가 가지고 있던 약한 비밀번호는 그들이 아무데나 로그인하려고 할 때 이것에 대해 아무 말도 하지 않았음에도 불구하고 받아들여지지 않았습니다!이것(2번)이 가장 가능성이 높은 시나리오인데, 저의 약한 비밀번호가 약 4개월이 지났고 Gmail에서 사용할 수 있게 해주었습니다.

그들이 이것에 대해 아무 말도 하지 않은 것은 꽤 나쁜 일이지만, 그것은 말이 됩니다.대부분의 탈취된 이메일은 Gmail 외부의 소프트웨어를 사용하여 로그인하기 때문에 Gmail 환경 외부에서 Gmail을 사용하려면 더 강력한 암호가 필요합니다.

덜 안전한 앱을 위해 액세스 켜기를 선택하면 암호를 변경할 필요가 없습니다.

Gmail 설정 링크

여기에 이미지 설명 입력

제 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)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");
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.

이 두 줄을 반대 방향으로 전환하려고 했는데 5.5.1 Authentication Required 오류가 반환되었습니다.

문제는 gmail로 보낼 수 있는 기술적 능력이 아닙니다.대부분의 상황에서 작동합니다.전송할 컴퓨터를 가져올 수 없는 경우, 일반적으로 기계가 컨트롤에서 한 번 이상 사람에게 인증되지 않았기 때문입니다.

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

현재 시스템에서 제가 한 일은 각 메시지 사이에 1.5초의 지연 시간을 두고 보내는 것입니다.그러면 오류가 발생하면 5분 동안 멈추고 다시 시작하세요.이는 일반적으로 작동하며 계정 한도까지 전송할 수 있습니다(마지막으로 확인한 바에 따르면 프리미어 고객 로그인의 경우 하루에 2,000건이었습니다).

저도 같은 문제가 있었지만 바이러스 방지 기능이 "스팸" 전자 메일을 차단하는 것으로 드러났습니다.이 옵션을 해제하면 포트 587을 사용하여 GMail을 통해 SMTP 이메일을 보낼 수 있습니다.

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

Gmail에 로그인하기

페이지 https://www.google.com/settings/security/lesssecureapps 로 이동하여 "설정"으로 설정합니다.

다른 방법이 없다면 타사 응용 프로그램에서 Gmail 계정에 액세스할 수 있도록 허용해야 할 수도 있습니다.이것이 제 문제였습니다.액세스를 허용하려면 다음을 수행합니다.

  1. gmail 계정에 로그인합니다.
  2. 이 페이지 https://accounts.google.com/DisplayUnlockCaptcha 을 방문하고 버튼을 클릭하여 액세스를 허용합니다.
  3. 페이지 https://www.google.com/settings/security/lesssecureapps 을 방문하여 보안 수준이 낮은 앱에 대한 액세스를 활성화합니다.

이것은 다른 사람에게 효과가 있기를 바랍니다!

어느 쪽인지 모르겠어요.에서 일치하는 eglassius가 했기 때문에 합니다.enableSslsetting .설정 사용중다니입)를 사용하고 .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>

먼저 Gmail 계정에서 POP 또는 IMAP을 사용하도록 설정해야 할 수 있습니다. https://mail.google.com/mail/ ?shva=1#http/fwdandpop

먼저 일반 메일 클라이언트와 함께 사용해 보는 것을 추천합니다...

회사 VPN 연결을 사용하고 있었습니다.그것이 제가 애플리케이션에서 이메일을 보낼 수 없는 이유였습니다.VPN에서 연결을 끊으면 작동합니다.

또한 제가 로그인할 때 사용했던 계정이 어떤 이유로 구글에 의해 비활성화되었다는 것을 알게 되었습니다.비밀번호를 원래대로 재설정하면 이메일을 보낼 수 있습니다.저도 5.5.1 메시지를 받고 있었습니다.

저는 또한 많은 해결책을 시도했지만 몇 가지 변경을 하면 효과가 있을 것입니다.

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

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

@안드레스 퐁피글리오:네, 맞습니다. 비밀번호를 한 번 이상 변경해야 합니다.이 코드는 잘 작동합니다.

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

저도 같은 오류가 발생했지만 위의 해결책 중 어느 것도 도움이 되지 않았습니다.

제 문제는 Gmail 계정에 로그인하는 데 사용된 적이 없는 원격 서버에서 코드를 실행하는 것이었습니다.

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

계정에 대해 보안 수준이 낮은 앱 켜기: https://www.google.com/settings/security/lesssecureapps

  1. 먼저 gmail 계정 설정을 확인하고 "보안 수준이 낮은 앱에 대한 액세스"에서 설정합니다.

Gmail과 같은 보안 앱을 사용하여 계정에 액세스하는 것이 좋습니다.구글이 만든 모든 앱은 이러한 보안 기준을 충족합니다.그러나 보안 수준이 낮은 앱을 사용하면 계정이 취약해질 수 있습니다.더 배우기.

  1. 세트

    smtp.UseDefaultCredentials = false;
    

    전에

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

동일한 오류가 발생했습니다("SMTP 서버에 보안 연결이 필요하거나 클라이언트가 인증되지 않았습니다. 서버 응답: 5.5.1 인증 필요. 자세한 내용은 에서 확인하십시오. )에서 확인한 결과 잘못된 암호를 사용하고 있었습니다.로그인 자격 증명을 수정했는데 올바르게 전송되었습니다.

늦었지만 다른 사람에게 도움이 될 수도 있습니다.

또한 한 번 이상 암호를 변경해야 합니다.그리고 보안 수준 암호를 사용해 보십시오(암호, 123456 등과 동일한 사용자를 사용하지 마십시오).

당신을 위한 또 다른 가능한 해결책입니다.저는 IMAP을 통해 gmail에 연결하는 데 비슷한 문제를 겪고 있었습니다. SO의 여기와 다른 곳에서 여러분이 읽을 수 있는 모든 해결책을 시도한 후(예: IMAP 사용, https://accounts.google.com/b/0/displayunlockcaptcha 사용 등), 저는 실제로 새로운 gmail 계정을 다시 설정했습니다.

제 원래 테스트에서, 제가 만든 첫 번째 지메일 계정에서, 저는 제 메인 지메일 계정에 연결했습니다.이로 인해 구글에서 잘못된 계정을 참조하는 불규칙한 동작이 발생했습니다.예를 들어, https://accounts.google.com/b/0/displayunlockcaptcha 을 운영하는 것은 제가 그 목적을 위해 만든 것이 아니라 제 메인 계정을 열어주었습니다.

그래서 제가 새로운 계정을 만들고 메인 계정에 연결하지 않았을 때 위와 같은 모든 적절한 단계를 수행한 후에 정상적으로 작동한다는 것을 알게 되었습니다!

저는 아직 이것을 확인하지 못했지만 (즉, 재생산) 그것이 저에게 도움이 된 것 같습니다.도움이 되길 바랍니다.

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

  • 로컬 시스템에서 Gmail(또는 다른 경우)로 로그인합니다.

  • 또한 덜 안전한 앱을 확인하고 "설정"으로 설정하십시오. 여기에 G메일 링크가 있습니다. https://www.google.com/settings/security/lesssecureapps

  • 전자 메일 코드에서 EnableSsl을 확인하고 true로 설정합니다.

    smtp.EnableSsl = true;
    
  • 또한 현재 사용 중인 포트를 확인하십시오. 25는 글로벌이지만 587과 같은 다른 포트도 확인할 수 있습니다. 여기를 확인하십시오.모든 SMTP 통신은 25세 이상에 이루어집니까?

  • 원격으로 연결된 경우: 위의 블라드 타마스의 답변을 확인하십시오.

Gmail 계정에 2단계 검증 단계가 있는 경우 앱 암호를 생성해야 합니다.https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=en&visit_id=636903322072234863-1319515789&rd=1 암호 생성 방법 옵션을 선택하고 제공된 단계를 따릅니다.생성된 앱 암호를 복사하여 어딘가에 붙여넣으십시오. DONE을 클릭한 후에는 암호를 복구할 수 없습니다.

포트 465를 통해 연결할 수도 있지만 시스템의 몇 가지 제한 때문입니다.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, 에서 논의되며, 저는 다른 토론(C#통한 GMail SMTP)에서 CDO(Collaborative Data Object)를 사용하는 방법의 예를 제공했습니다.모든 포트에서 순 오류 발생).

저는 이 문제를 해결했습니다.이 메시지는 여러 오류 유형에서 사용됩니다.저의 문제는 제가 최대 500통의 메일을 보낸다는 것이었습니다.

계정에 로그인하고 수동으로 메일을 보내 봅니다.한도에 도달하면 이를 알려줍니다.

구글은 더 이상 "안전성이 떨어지는 앱"을 허용하지 않기 때문에 일반 Gmail 사용자에게는 불가능합니다.

2022년 5월 이후 구글에 의한 변경 사항.

이러한 변경을 위해 우리는 코드를 다음과 같이 변경해야 합니다.

  1. 먼저 Gmail 계정 보안으로 이동합니다.

  2. 2단계 인증을 사용합니다.

  3. Google 계정에서 앱 암호를 구성합니다.

  4. 응용 프로그램에서 앱 암호를 사용합니다.

         MailMessage mail = new MailMessage();
         mail.To.Add(email.Text.ToString().Trim());
         mail.From = new MailAddress("your_Gmail_address");
         mail.Subject = "Hello test email";
         mail.Body = "<p>hello user<br/> How are you?</p>";
         mail.IsBodyHtml = true;
    
         SmtpClient smtp = new SmtpClient();
         smtp.Port = 587; // 25 465
         smtp.EnableSsl = true;
         smtp.UseDefaultCredentials = false;
         smtp.Host = "smtp.gmail.com";
         smtp.Credentials = new System.Net.NetworkCredential("your_Gmail_address", "Your_gmail_app_password");
         smtp.Send(mail);
    
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;

Gmail 비밀번호를 변경하고 다시 시도하세요, 그 이후에 작동할 것입니다.

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

이 코드는 저에게 적합하며, 또한 보안되지 않은 앱에서 gmail 액세스를 허용하고, 인증을 제거하는 2단계:

Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(MailAddress, Password)

언급URL : https://stackoverflow.com/questions/704636/sending-email-through-gmail-smtp-server-with-c-sharp

반응형