it-swarm-id.com

Mengirim email melalui server SMTP Gmail dengan C #

Untuk beberapa alasan, jawaban yang diterima atau yang lain tidak berfungsi untuk saya untuk " Mengirim email dalam .NET melalui Gmail ". Mengapa mereka tidak bekerja?

UPDATE: Saya telah mencoba semua jawaban (diterima dan sebaliknya) dalam pertanyaan lain, tetapi tidak ada yang bekerja.

Saya hanya ingin tahu apakah itu bekerja untuk orang lain, kalau tidak Google mungkin telah mengubah sesuatu (yang telah terjadi sebelumnya).

Ketika saya mencoba potongan kode yang menggunakan SmtpDeliveryMethod.Network, saya dengan cepat menerima SmtpException saat Kirim (pesan). Pesannya adalah

Server SMTP membutuhkan koneksi yang aman atau klien tidak diautentikasi.

Respons server adalah:

5.5.1 Diperlukan Otentikasi. Pelajari lebih lanjut di "<- serius, itu berakhir di sana.

PEMBARUAN:

Ini adalah pertanyaan yang saya tanyakan sejak lama, dan jawaban yang diterima adalah kode yang telah saya gunakan berkali-kali pada proyek yang berbeda.

Saya telah mengambil beberapa ide dalam posting ini dan proyek EmailSender lainnya untuk membuat proyek EmailSender di Codeplex . Ini dirancang untuk testabilitas dan mendukung layanan SMTP favorit saya seperti GoDaddy dan Gmail.

229
CVertex

CVertex, pastikan untuk meninjau kode Anda, dan, jika itu tidak mengungkapkan apa pun, kirimkan. Saya baru saja mengaktifkan ini pada situs uji ASP.NET yang saya kerjakan, dan berfungsi.

Sebenarnya, pada beberapa titik saya memiliki masalah pada kode saya. Saya tidak melihatnya sampai saya memiliki versi yang lebih sederhana pada program konsol dan melihatnya bekerja (tidak ada perubahan di sisi Gmail karena Anda khawatir tentang). Kode di bawah ini berfungsi seperti sampel yang Anda maksud:

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();
        }
    }
}

Saya juga dapat menggunakannya menggunakan kombinasi web.config, http://msdn.Microsoft.com/en-us/library/w355a94k.aspx dan kode (karena tidak ada EnableSsl yang cocok di dalam file konfigurasi :().

283
eglasius

BERIKUT INI AKAN HAMPIR TERTENTU JAWABAN UNTUK PERTANYAAN ANDA JIKA SEMUA LAIN TELAH GAGAL:

Saya mendapatkan kesalahan yang sama persis, ternyata algoritma penguat kata sandi baru Google telah berubah menganggap bahwa kata sandi saya saat ini terlalu lemah, dan tidak memberi tahu saya tentang hal itu (bahkan bukan pesan atau peringatan) ... Bagaimana saya menemukan ini ? Yah, saya memilih untuk mengubah kata sandi saya untuk melihat apakah itu akan membantu (mencoba yang lain tidak berhasil) dan ketika saya mengubah kata sandi saya, itu berhasil!

Kemudian, untuk percobaan, saya mencoba mengubah kata sandi saya kembali ke kata sandi saya sebelumnya untuk melihat apa yang akan terjadi, dan Gmail sebenarnya tidak mengizinkan saya untuk melakukan ini, dengan alasan "maaf kami tidak dapat membiarkan Anda menyimpan perubahan ini seperti yang Anda pilih kata sandi terlalu lemah "dan tidak akan membiarkan saya kembali ke kata sandi lama saya. Dari sini saya tahu bahwa itu salah karena a) Anda perlu mengganti kata sandi sekali setiap x jumlah bulan atau b). seperti yang saya katakan sebelumnya, algoritma kekuatan kata sandi mereka berubah dan oleh karena itu kata sandi yang lemah yang saya miliki tidak diterima, walaupun mereka tidak mengatakan apa-apa tentang ini ketika mencoba masuk ke MANA SAJA! Ini (nomor 2) adalah skenario yang paling mungkin, karena kata sandi saya yang lemah berusia sekitar 4 bulan, dan itu memungkinkan saya menggunakannya di Gmail.

Sangat buruk bahwa mereka tidak mengatakan apa-apa tentang ini, tetapi itu masuk akal. Karena sebagian besar email yang dibajak masuk menggunakan perangkat lunak di luar gmail, dan saya rasa Anda diharuskan memiliki kata sandi yang lebih kuat jika Anda ingin menggunakan Gmail di luar lingkungan Gmail.

Saya harap ini membantu!

66

Selain langkah pemecahan masalah lainnya di atas, saya juga ingin menambahkan bahwa jika Anda telah mengaktifkan otentikasi dua faktor (juga dikenal sebagai verifikasi dua langkah ) pada akun GMail Anda, Anda harus menghasilkan kata sandi khusus aplikasi dan menggunakan kata sandi yang baru dibuat untuk mengotentikasi melalui SMTP .

Untuk membuatnya, kunjungi: https://www.google.com/settings/ dan pilih Otorisasi aplikasi & situs untuk menghasilkan kata sandi.

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

Tautan ke Pengaturan Gmail

enter image description here

50

Saya juga mengalami masalah dalam mengirim email dari akun gmail saya, yang disebabkan oleh beberapa situasi di atas. Berikut ringkasan cara saya membuatnya bekerja, dan menjaganya tetap fleksibel pada saat yang sama:

  • Pertama-tama siapkan akun GMail Anda:
    • Aktifkan IMAP dan nyatakan jumlah maksimum pesan yang tepat (Anda dapat melakukannya di sini)
    • Pastikan kata sandi Anda setidaknya 7 karakter dan kuat (menurut Google)
    • Pastikan Anda tidak harus memasukkan kode captcha terlebih dahulu. Anda dapat melakukannya dengan mengirim email percobaan dari browser Anda.
  • Buat perubahan di web.config (atau app.config, saya belum pernah mencobanya tetapi saya menganggap itu mudah untuk membuatnya bekerja di aplikasi 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

Dan sekarang setiap kali Anda ingin mengirim email yang perlu Anda lakukan hanyalah menelepon SSLMail.SendMail:

misalnya di Halaman dengan kontrol 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

Atau di mana pun dalam kode Anda, Anda dapat menelepon:

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

Saya harap ini membantu siapa saja yang mengalami posting ini! (Saya menggunakan VB.NET tapi saya pikir itu sepele untuk mengubahnya menjadi bahasa .NET.)

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

Jika Anda mendapatkan kesalahan seperti "Server SMTP memerlukan koneksi yang aman atau klien tidak diautentikasi. Respons server adalah: 5.5.1 Diperlukan Otentikasi. Pelajari lebih lanjut di" saat saya mendapatkan sebelumnya, pastikan baris SMTPClientObj.UseDefaultCredentials = False disertakan dan ini baris harus sebelum SMTPClientObj.Credentials.

Saya memang mencoba untuk beralih 2 baris ini dengan cara yang berlawanan dan 5.5.1 Diperlukan kesalahan Otentikasi dikembalikan.

13
Terry Chng

Oh ... Luar biasa ... Pertama, saya tidak bisa mengirim email karena alasan apa pun. Tetapi setelah saya mengubah urutan kedua baris ini seperti di bawah ini, ia bekerja dengan sempurna.

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

Semoga bantuan ini !!! :)

12
Wirol

Saya memiliki masalah yang sama, tetapi ternyata perlindungan virus saya memblokir email "spam" keluar. Mematikan ini memungkinkan saya untuk menggunakan port 587 untuk mengirim email SMTP melalui GMail

9
user464329

Langkah-langkah sederhana untuk memperbaikinya:

1) Masuk ke Gmail Anda

2) Navigasikan ke halaman ini https://www.google.com/settings/security/lesssecureapps & set ke "Turn On"

9
Kevin

Masalahnya bukan pada kemampuan teknis untuk mengirim melalui gmail. Itu bekerja untuk sebagian besar situasi. Jika Anda tidak bisa mendapatkan mesin untuk dikirim, biasanya karena mesin tidak dikonfirmasi dengan manusia di kontrol setidaknya sekali.

Masalah yang dihadapi sebagian besar pengguna adalah Google memutuskan untuk mengubah batas keluar setiap saat. Anda harus selalu menambahkan kode defensif ke solusi Anda. Jika Anda mulai melihat kesalahan, turunkan kecepatan kirim Anda dan berhenti mengirim untuk sementara waktu. Jika Anda terus mencoba mengirim Google, kadang-kadang akan menambah waktu tambahan untuk periode penundaan Anda sebelum Anda dapat mengirim lagi.

Apa yang saya lakukan dalam sistem saya saat ini adalah mengirim dengan penundaan 1,5 detik antara setiap pesan. Lalu jika saya mendapatkan kesalahan, berhenti selama 5 menit dan kemudian mulai lagi. Ini biasanya berfungsi dan akan memungkinkan Anda untuk mengirim hingga batas akun (terakhir saya memeriksa 2.000 untuk login pelanggan utama per hari).

9
Jason Short

Saya tidak yakin versi NET mana yang diperlukan untuk ini karena eglasius menyebutkan tidak ada pengaturan enableSsl yang cocok (saya menggunakan .NET 4.0, tapi saya curiga ini berfungsi di .NET 2.0 atau lebih baru), tetapi konfigurasi ini justed berfungsi untuk saya (dan tidak mengharuskan Anda menggunakan konfigurasi program apa pun):

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

Anda mungkin harus mengaktifkan POP atau IMAP di akun Gmail Anda terlebih dahulu: https://mail.google.com/mail/?shva=1#settings/fwdandpop

Saya sarankan mencobanya dengan klien surat biasa dulu ...

8
Wiebe Tijsma

Jika tidak ada hal lain yang berhasil di sini untuk Anda, Anda mungkin perlu mengizinkan akses ke akun gmail Anda dari aplikasi pihak ketiga. Ini masalah saya. Untuk mengizinkan akses lakukan hal berikut:

  1. Masuk ke akun gmail Anda.
  2. Kunjungi halaman ini https://accounts.google.com/DisplayUnlockCaptcha dan klik tombol untuk mengizinkan akses.
  3. Kunjungi halaman ini https://www.google.com/settings/security/lesssecureapps dan aktifkan akses untuk aplikasi yang kurang aman.

Ini bekerja untuk saya, berharap ini bekerja untuk orang lain

8
Celt

Saya menggunakan koneksi VPN perusahaan. Itulah alasan mengapa saya tidak bisa mengirim email dari aplikasi saya. Ini berfungsi jika saya memutuskan sambungan dari VPN.

6
Ned

@Andres Pompiglio: Ya itu benar, Anda harus mengubah kata sandi Anda setidaknya sekali .. kode ini berfungsi dengan baik:

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

DAN Anda dapat membuat panggilan ke fungsi dengan menggunakan:

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

Saya juga menemukan bahwa akun yang saya gunakan untuk masuk telah dinonaktifkan oleh google karena beberapa alasan. Setelah saya mengatur ulang kata sandi (sama seperti dulu), maka saya dapat mengirim email dengan baik. Saya juga mendapatkan pesan 5.5.1.

5
RKL

Saya juga mencoba banyak solusi tetapi membuat beberapa perubahan itu akan berhasil

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

dengan parameter smtpclient di atas berfungsi di gmail

5
Suresh

Namun solusi lain yang mungkin untuk Anda. Saya mengalami masalah serupa yang menghubungkan ke gmail melalui IMAP. Setelah mencoba semua solusi yang saya temui yang akan Anda baca di sini dan di tempat lain di SO (mis. Aktifkan IMAP, aktifkan akses yang kurang aman ke email Anda, menggunakan https: // akun. google.com/b/0/displayunlockcaptcha dan seterusnya), saya benar-benar membuat akun gmail baru sekali lagi.

Dalam pengujian asli saya, akun gmail pertama yang saya buat, saya telah terhubung ke akun gmail utama saya. Ini mengakibatkan perilaku yang tidak menentu di mana akun yang salah sedang direferensikan oleh google. Misalnya, menjalankan https://accounts.google.com/b/0/displayunlockcaptcha membuka akun utama saya alih-alih yang saya buat untuk tujuan itu.

Jadi ketika saya membuat akun baru dan tidak menghubungkannya ke akun utama saya, setelah mengikuti semua langkah yang tepat seperti di atas, saya menemukan bahwa itu berfungsi dengan baik!

Saya belum mengkonfirmasi ini (mis. Direproduksi), tetapi ternyata itu berhasil untuk saya ... semoga membantu.

4
sinewave440hz

Saya mendapatkan kesalahan yang sama dan tidak ada solusi di atas yang membantu.

Masalah saya adalah saya menjalankan kode dari server jauh, yang tidak pernah digunakan untuk masuk ke akun gmail.

Saya membuka browser di server jarak jauh dan masuk ke gmail dari sana. Ia menanyakan pertanyaan keamanan untuk memverifikasi itu saya karena ini adalah lokasi baru. Setelah melakukan pemeriksaan keamanan, saya dapat mengautentikasi melalui kode.

4
Vlad Tamas

Saya mengalami kesalahan yang sama ("Server SMTP memerlukan koneksi aman atau klien tidak diautentikasi. Respons server adalah: 5.5.1 Diperlukan Otentikasi. Pelajari selengkapnya di") dan menemukan bahwa saya menggunakan kata sandi yang salah. Saya memperbaiki kredensial login, dan itu dikirim dengan benar.

Saya tahu ini terlambat, tapi mungkin ini akan membantu orang lain.

4
Albert Bori

Nyalakan aplikasi yang kurang aman untuk akun Anda: https://www.google.com/settings/security/lesssecureapps

4
Burak Kalkan
  1. Pertama periksa pengaturan akun gmail Anda & nyalakan dari "Akses untuk aplikasi yang kurang aman" enter image description here

Kami sangat menyarankan Anda menggunakan aplikasi yang aman, seperti Gmail, untuk mengakses akun Anda. Semua aplikasi yang dibuat oleh Google memenuhi standar keamanan ini. Di sisi lain, menggunakan aplikasi yang kurang aman dapat membuat akun Anda rentan. Belajarlah lagi.

  1. Set

    smtp.UseDefaultCredentials = false;
    

    sebelum

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

Hal lain yang saya temukan adalah Anda harus mengubah kata sandi Anda setidaknya sekali. Dan coba gunakan kata sandi tingkat keamanan (jangan gunakan pengguna yang sama dengan kata sandi, 123456, dll.)

4
Andres Pompiglio

Saya memiliki masalah ini diselesaikan. Aparently pesan itu digunakan dalam beberapa tipe kesalahan. Masalah saya adalah bahwa saya telah mencapai maksimum 500 surat terkirim.

masuk ke akun dan coba kirim surat secara manual. Jika batas telah tercapai, itu akan memberi tahu Anda

3
Ayson Baxter

Anda juga dapat terhubung melalui port 465, tetapi karena beberapa keterbatasan namespace System.Net.Mail Anda mungkin harus mengubah kode Anda. Ini karena namespace tidak menawarkan kemampuan untuk membuat koneksi SSL implisit. Ini dibahas di http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465. aspx , dan saya telah memberikan contoh bagaimana menggunakan CDO (Objek Data Kolaboratif) dalam diskusi lain ( GMail SMTP melalui C #. Kesalahan bersih pada semua port ).

3
Bryan Allred

Ada satu atau lebih alasan untuk kesalahan ini.

  • Masuk dengan Gmail Anda (atau yang lain jika) di sistem lokal Anda.

  • Juga periksa untuk Aplikasi Kurang Aman dan Setel ke "Aktifkan" di sini adalah Tautan untuk GMAIL. https://www.google.com/settings/security/lesssecureapps

  • periksa EnableSsl di kode Email Anda, dan setel juga menjadi true.

    smtp.EnableSsl = true;
    
  • Periksa juga port mana yang Anda gunakan saat ini. 25 adalah Global, tetapi Anda dapat memeriksanya untuk orang lain juga seperti 587. periksa di sini. Apakah semua komunikasi SMTP terjadi lebih dari 25?

  • JIKA ANDA BERADA DI REMOTE : Periksa jawaban dari Vlad Tamas di atas.

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

Ubah kata sandi gmail Anda dan coba lagi, itu akan berfungsi setelah itu.

Tidak tahu mengapa, tetapi setiap kali Anda mengubah hosting, Anda harus mengubah kata sandi.

1
Jo Smo

Jika Anda memiliki Verifikasi 2 Langkah di akun Gmail Anda, Anda perlu membuat kata sandi Aplikasi. https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=en&visit_id=636903322072234863-1319515789&rd=1 Pilih Cara membuat opsi kata sandi aplikasi dan ikuti langkah-langkah yang disediakan. Salin dan tempel kata sandi aplikasi yang dihasilkan di suatu tempat karena Anda tidak akan dapat memulihkannya setelah Anda mengklik SELESAI.

0
Faith Nassiwa