ASP.NET MVC 3 WebMail Helper ile Mail göndermek

Merhabalar,

ASP.NET MVC 3 ile beraber kolaylıkla mail göndermemiz için WebMail adında helper geldi. Bu yazıda basit bir iletişim formu oluşturup, WebMail sınıfımızı da kullanarak mail gönderme işlemini gerçekleştireceğiz.

 

 

Yeni bir (boş) MVC 3 projesi  açıyoruz. HomeController isminde controller ekliyoruz ve bu Controller’ımız için View dosyası oluşturuyoruz. Bu View dosyasını _Layout.cshtml ismindeki layout sayfamıza bağlıyoruz.

 

Oluşturduğumuz View(Home) dosyasını açıp, mail göndermemiz için gereken yazı ve buton nesnelerini oluşturacağız.

Index.cshtml

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

@Html.ValidationMessage("_HATA")

@using(Html.BeginForm("MailGonder","Home")){
<table>
<tr><td>Mail : </td><td>@Html.TextBox("mail")</td></tr>
<tr><td>Konu : </td><td>@Html.TextBox("konu")</td></tr>
<tr><td>İleti : </td><td>@Html.TextArea("ileti")</td></tr>
</table>
<input type="submit" value="Mail Gönder!"/>

} 

 

  • 8. satırda formumuzu post ettikten sonra çıkabilecek hatayı yazdırmak içindir.
  • 10. satırda form başlangıcını yaptık. Oluşturduğumuz form, “HomeController.cs” içine yaratacağımız “MailGonder” ismindeki action metoduna post olacaktır.
  • Diğer satırlarda ise bildiğiniz üzere input alanlarımızı helper metotları ile yarattık.

 HomeController.cs

public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult MailGonder(string mail, string konu,string ileti)
        {
            try
            {
                WebMail.SmtpServer = "smtp.gmail.com";
                WebMail.EnableSsl = true;
                WebMail.UserName = "doru.yusuf@gmail.com";
                WebMail.Password = "123456"; // gerçek dışı
                WebMail.SmtpPort = 587;
                WebMail.Send(
                        "doru.yusuf@gmail.com",
                        konu,
                        ileti,
                        mail
                    );

                return RedirectToAction("Gonderildi");
            }
            catch (Exception ex)
            {
                ViewData.ModelState.AddModelError("_HATA", ex.Message);
            }

            return View("Index");
        }
        public string Gonderildi()
        {
            return "İletiniz başarıyla gönderildi";
        }

    }

 

 

 

“MailGonder” action metodunda olup biten;

 

  • View dosyamızdan gelen form nesneleri “MailGonder” action metoduna post oluyor.
  • [HttpPost] özniteliği sayesinde direk parametrelere veriler yazılıyor.
  •  try-catch blog ile oluşabilecek hatayı yakalayıp, View sayfasında gösteriliyor.
  • try blogunun arasındaki 1. satırda SMTP sunucusunu tanımladık.
  • 2. satırda Gmail için SSL aktif ettik.
  • 3. ve 4. satırlarda kullanıcı adı ve şifremizi yazdık.
  • 5. satırda Gmail’in kullandığı port’u tanımladık.
  • 6. satırda “WebMail.Send” metodu;
  •       1. parametresinde mailin kime gideceğini yazdık.
  •       2,3 ve 4. parametrelerini söylememe gerek yok sanırım 🙂
  • 7. satırda “RedirectToAction” metodu ile “Gonderildi” adındaki action metoduna yönleniyor. Aslında tek amacı “Mail’iniz gönderildi” mesajı vermektir.

Projemizi build edip, çalıştırdığımızda;

 

Mail gönder dediğimizde;

 

ve mail kutumuza baktığımızda 🙂

 

Yayınlayan

Yusuf Doru

İstanbul'da yaşıyor. Web ve masaüstü ortamlarında çalışmalar yapıyor. Araştırıyor, geliştiriyor. Kendine ait kişisel blogu var. Her ne kadar .NET dillerine ilgisi olsa da, açık kaynaklı programlama dillerinde de kendini geliştirmeye devam ediyor.

“ASP.NET MVC 3 WebMail Helper ile Mail göndermek” üzerine 46 yorum

  1. Webmail.Send kısmına Gmail den baska bır mail yazdıgımda olmuyor sadece gmail
    adresimi yazdıgımda çalısıyor neden baska maıl adresı yazamıyorum….???,

    1. WebMail.SmtpServer ve WebMail.SmtpPort alanlarını kendinize göre güncellerseniz sorun olmaz. Örnek: hotmail.com uzantılı mail için smtp.hotmail.com gibi

  2. Merhabalar Yusuf hocam çok güzel bir örnek olmuş tşk ederim.Hocam peki şu şekilde yapsak nasıl olur.Örneğin HomeController.cs içerisindeki tüm kodlar Controller klasörüne değilde

    Function diye bir klasör oluştursak
    Function/MailGonder.cs içerisine kodları yapıştırsak.
    tekrar Controller HomeController.cs dosyasına Function/MailGonder.cs yi nasıl tanımlarız bir yardımcı olursan çok sevinirim hocam.

    1. Merhaba Sedat,

      Tabi ki mümkün. Function klasörü içindeki sınıfları, Controller dosyası içinde kullanmak için kullanacağımız Controller dosyasında namespace tanımlamamız gerekir.

      Yani;
      using Function

  3. Merhabalar Yusuf hocam ben Sedat Tiryaki.
    Hocam aslında benim anlatmak istediğim şu;

    Function/Mail.cs dosyasına aşağıdaki kodları yazalım

    using System;
    using System.Web;
    using System.Net;
    using System.Net.Mail;
    using System.Web.Helpers;
    using System.Collections.Generic;
    namespace MVC4_DERS.Functions
    {
    public class Mail
    {
    public static string Yolla(string isim, string kimden, string kime, string konu, string mesaj)
    {

    try
    {
    WebMail.SmtpServer = “smtp.gmail.com”;
    WebMail.EnableSsl = true;
    WebMail.UserName = “doru.yusuf@gmail.com”;
    WebMail.Password = “123456”; // gerçek dışı
    WebMail.SmtpPort = 587;
    WebMail.Send(
    “doru.yusuf@gmail.com”,
    konu,
    ileti,
    mail
    );

    return RedirectToAction(“Gonderildi”);
    }
    catch (Exception ex)
    {
    ViewData.ModelState.AddModelError(“_HATA”, ex.Message);
    }

    return View(“Index”);
    }
    public string Gonderildi()
    {
    return “İletiniz başarıyla gönderildi”;
    }

    }
    }
    }

    daha sonra ben Controller/HomeController.cs dosyasına da zaten şu şekilde bir using tanımlaması yapıyorum.Ama Indexe nasıl çağıracağız onu yapamıyorum 🙂

    HomeController.cs

    using ProjeDosyası.Models;
    using ProjeDosyası.Functions;

    namespace ProjeDosyası.Controllers
    {
    public class HomeController : Controller
    {
    public ActionResult Index()
    {
    return View();
    }
    }
    }

    Hocam yardımcı olursanız çok sevinirim.
    Saygılarımla

    1. Merhaba Sedat,

      İlk verdiğin cs dosyasında namespace “MVC4_DERS.Functions” olarak tanımlanmış. 2.sinde ise “ProjeDosyası.Controllers“.

      MVC4_DERS.Functions içindeki sınıfları görüntüleyebilmek için; 2. cs dosyasındaki namespace tanımlamalarını düzeltirsen olacak gibi gözüküyor.
      using ProjeDosyası.Models;
      using ProjeDosyası.Functions;
      değil,
      using MVC4_DERS.Models;
      using MVC4_DERS.Functions;

      yani isimlendirmelerde sorun olacağını düşünüyorum.

      Kolay gelsin.

  4. HomeController.cs

    using MVC4_DERS.Models;
    using MVC4_DERS.Functions;

    namespace MVC4_DERS.Controllers
    {
    public class HomeController : Controller
    {
    public ActionResult Index()
    {

    //BURADA YER ALACAK KODLAR
    return View();
    }
    }
    }

    Evet size gönderirken yanlış yazmışım.Normalde bu şekilde hocam.Ama buraya nasıl çağıracam onu yapamadım

    public ActionResult Index()
    {

    //BURADA YER ALACAK KODLAR
    return View();
    }

  5. Hocam iyi akşamlar.

    public ActionResult Index()
    {

    Mail.Yolla() //BURAYA DEĞERLER VERECEKMİYİZ HOCAM
    return View();
    }

    1. Tanımlamayı zaten using MVC4_DERS.Functions; yapıyoruz.

      Metot parametre içeriyor. Çalışması için vermemiz gerekli aksi halde hata verir.

  6. using MVC4_DERS.Functions;
    public ActionResult Index()
    {

    Mail.Yolla() //BURAYA HANGİ PARAMETRELERİ NASIL VERECEĞİMİ BİLMİYORUM HOCAM
    return View();
    }

    Bir yardımcı olursan çok sevinirim

    1. Mail.Yolla(“Sedat Tiryaki”,”bysedattiryaki@gmail.com”,”bysedattiryaki@gmail.com”,”Test konu”,”Test Mesaj”) gibi.

  7. Hocam yardımcı olduğunuz için çok teşekkür ederim.Ama yukarıdaki kodlar Function içerisine yapıştırdığım zaman kodlar hata veriyor.Müsayit bir zamanda kodları dediğim gibi bir deneyebilirmisiniz hocam

    1. Mail.Yolla("Sedat Tiryaki","bysedattiryaki@gmail.com","bysedattiryaki@gmail.com","Test konu","Test Mesaj");

      Daha önceki verdiğim satırda çift tırnaklarda sorun olmuş şimdi deneyebilir misin? Eğer tırnaklarda yine sorun olursa kendin yazarsın.

  8. Hocam, ben webmail helperı kullanarak sitemde iletişim sayfası yapmak istiyorum. Kullanıcının yazdığı iletiler benim controlllerda girdiğim kullanıcı adı ve şifresi olan eposta hesabında toplansın istiyorum. Ama kullanıcının girdiği mail adresini aynen burada anlatıldığı gibi WebMail.Send in ilk parametresi olarak veriyorum halde Eposta hesabımda mesajı kendi kendime göndermişim gibi gözüküyor, öyle olsada sorun değil ama ileti yollayanın adresi hiçbir yerde çıkmıyor. Cevap vermeye kalksam veremeyeceğim. Gönderenin adresi hiçbir yerde çıkmayacaksa neden parametre olarak veriyoruz? Bunu yapabilen başka bir helper varmı bildiğiniz?

    1. Merhaba, niyetiniz göndereni öğrenmek ise, aşağıdaki ilgili satır sorununuzu çözer.

      WebMail.SmtpServer = “smtp.gmail.com”;
      WebMail.EnableSsl = true;
      WebMail.UserName = “doru.yusuf@gmail.com”;
      WebMail.Password = “123456”; // gerçek dışı
      WebMail.SmtpPort = 587;
      ileti = “Gönderen E-mail : “+mail+”\n”+ileti;
      WebMail.Send(
      “doru.yusuf@gmail.com”,
      konu,
      ileti,
      mail
      );

  9. Merhabalar benim yapmak istediğim arıza takip programı yani arızasını yazıp gönder dediğinde benim mailime kimde geldiğini atması gerek. Nasıl yapabilirim?

    1. Merhaba, üstteki cevabımda bu soruya benzer bir yanıt vermiştim. Gönderecek kişinin mailini bir text girişine yazmasını zorunlu bırakıp, bunu kod bölümünde işlemeniz gerekiyor. (bkz: alttaki kodda ileti değişkeninde)

      WebMail.SmtpServer = “smtp.gmail.com”;
      WebMail.EnableSsl = true;
      WebMail.UserName = “doru.yusuf@gmail.com”;
      WebMail.Password = “123456″; // gerçek dışı
      WebMail.SmtpPort = 587;
      ileti = “Gönderen E-mail : “+mail+”\n”+ileti;
      WebMail.Send(
      “doru.yusuf@gmail.com”,
      konu,
      ileti,
      mail
      );

  10. hocam bir proje üzerinde çalışıyorum ve büyük bir çoğunluğu bitti mail kısmı kaldı.çalışanınnın doldurduğu formu müdürüne mail atmak istiyorum mail dahil herşeyi sqlden çekicem yardımcı olursanız sevinirm

    1. Merhaba,

      Veritabanından çektiğin mail alanını 1. parametreye atayarak gönderebilirsin. Aşağıdaki gibi;

      WebMail.Send(
      dataRow[‘mail’].ToString(),
      konu,
      ileti,
      mail
      );

  11. Merhaba hocam,

    WebMail tanımlı olarak gelmiyor. Ekstra bir Nuget paketimi lazım ? Nasıl çözebilirim bu sorunu. 

  12. hocam ben SMTP sunucusu güvenli bir bağlantı gerektiriyor veya istemcinin kimliği doğrulanmadı. Sunucu yanıtı şöyleydi: 5.5.1 Authentication Required. Learn more at   bu hatayı alıyorum neden acaba

  13. burdan aldım zaten

    kodda bu

                WebMail.SmtpServer = “smtp.gmail.com”;
                WebMail.EnableSsl = true;
                WebMail.UserName = “soluganemre94@gmail.com”;
                WebMail.Password = “12345”; // gerçek dışı
                WebMail.SmtpPort = 587;
    WebMail.Send(
                        “soluganemre94@gmail.com”,
                      mail,
                      konu,
                      ileti
                      
                    );

      1. yusuf bey gerçekten çok teşekkür ederim bende adaşım 🙂 gibi aynı hatayı alıyordum, sayenizde sorunu çözebildim.

  14. merhaba ben toplu mail atmak istiyorum ama mail adreslerini upload ettiğim dosyadan almak istiyorum bunu nasıl yapabilirim?

      1. bunlara baktım ama nasıl yapacağımı çözemedim mvcye başlayalı 4 gun oldu daha önceden sadece csharp bilgim var o da ileri düzeyde değil daha 2. sınıfa yeni geçtim

      1. merhaba şimdi text dosyamı seçiyorm actionımda dosyayı upload edip okuyorum ve bi diziye atıyorm başka bir actionımda da o diziyi kullanarak o dizideki mail adreslerine mail göndermek istiyorum ama mail atmak için kullandığım actionda o dizime null değeri geliyor ne yapmam gerekiyor

        1. string[] mails = {“x@x.com”,”x1@x.com”,”x2@x.com”};
          string mailString = String.Join(“;”,mails); // Çıktı : “x@x.com;x1@x.com;x2@x.com”

          “mailString” değişkenini mail parametresi olarak göndereceksin.

  15. Hocam anlatım için çok teşekkür ederim.
    İletişim sayfasını C://dosya/kayit.txt metin belgesi olarak nasıl kaydedebilirim.

  16. Mehaba, öncelikle paylaşımınız için çok teşekkür ederim oldukça faydalı bir paylaşım olmuş. Size sormak istediğim bir şey var. Google ayarlardan daha az güvenli uygulamalara izin verme ayarından sonra mail, benim hesabımdan bana gönderiliyormuş gibi epostama ulaştı. Fakat şöyle bir durum var. Ben sitem için domaini godaddy den aldım ve hosting hizmetini de oradan alacağım. Aynı zamanda şirket e posta hesabı da aldım. Yani sitemi yayınladıktan sonra artık maillerin gmail adresime değil de, godaddy nin verdiği çiçek@dentident.com(örnek) adresine gelmesini isteyeceğim. Bunun ayarını kodlar üzerinde nasıl yapabilirim ve google güvenliği gibi orada da benzer bir engelle karşılaşır mıyım?

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir