e-mail etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
e-mail etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

22 Ağustos 2015 Cumartesi

E-Posta Gönderme

RFC 822 Nedir?
Bu ilk e-posta standardında, bir mesaj header ve body olarak ikiye ayrılmıştır. Header'ın şekli belirlenmiş ancak Body'nin şekli belirsiz bırakılmış. Sadece 7 bit ASCII olmasına karar verilmiş.




Ancak daha sonra RFC822'ye eklentiler yapılmış ve MIME ile body kısmının şekli belirlenmiş.
Yani MIME içeriğin şeklini tanımlar.

multipart/mixed nedir
Farklı tiplerde nesnelerin - mesela text + eklenti - gönderildiği anlamına gelir.

multipart/alternative nedir
Aynı bilginin farklı gösterim şeklidir. Örneğin text olarak gönderilen metnin alternatifi html de olabilir. Bu durumda şöyle bir blok içinde göndeririz.
  • mixed
    • alternative
      • text
      • related
        • html
        • inline image
        • inline image
    • attachment
    • attachment
Java Mail Alma
Session
Örnek:
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getInstance(props, null);
Store store = session.getStore();
store.connect("smtp.gmail.com", "myuser", "mypassword");
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
int messageCount = inbox.getMessageCount();
List<Message> messages = getMessages(inbox, messageCount);
inbox.close(true);
Java Mail Gönderme
Session
Message veya ondan türeyen MimeMessage sınıfı constructor metodu içine Session nesnesi alırlar. Bu nesne bağlantı bilgilerini içerir. 
getDefaultInstance

Default doldurulmuş bir session nesnesi döner. Örnek:
import java.util.Properties;
import javax.mail.Session;

Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getDefaultInstance(props, null);


getInstance
Session açma örneği:
Properties props = new Properties();
props.put("mail.smtp.auth", true);
props.put("mail.smtp.starttls.enable", true);
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });
Message message = new MimeMessage(session); 

InternetAddress
Bu sınıf alıcının adresi temsil ediliyor.
validate
Verilen adresin doğru olup olmadığı kontrol edilir. Örnek:
 
javax.mail.internet.MimeMessage
Bu sınıf bir e-mail'in kimden geldiği, kime gittiği gibi bilgileri içerir. Content olarak sadece metin içerebilir. Bu durumda RFC822'nin ilk halini gerçekleştirimiş olur. Veya content olarak MimeMultipart sınıfını da kullanabilir. MimeMultipart sınıfı ise MimeBodyPart sınıflarını içeren bir yapı.
 
Aşağıda html e-posta gönderme örneği var. Örneği buradan aldım.

MimeMessage msg = new MimeMessage(session);

//Set from
InternetAddress addressFrom = new InternetAddress("myuser@gmail.com");
msg.setFrom(addressFrom);

//Set to
InternetAddress[] addressTo = new InternetAddress[sendTo.length];
for (int i = 0; i < sendTo.length; i++) {
    addressTo[i] = new InternetAddress(sendTo[i]);
}
msg.setRecipients(Message.RecipientType.TO, addressTo);

//Set subject
msg.setSubject(emailSubjectTxt);
MimeMultipart multipart = new MimeMultipart("related");

//first part  (the html) 
BodyPart messageBodyPart = new MimeBodyPart(); 
String htmlText = "<H1>Hello</H1><img src=\"cid:image\">"
messageBodyPart.setContent(htmlText, "text/html"); 

// add it 
multipart.addBodyPart(messageBodyPart);

// put everything together 
msg.setContent(multipart); 
Transport.send(msg);
javax.mail.Multipart
Eklenti parçalarını içeren kısım. Aşağıdaki şekilde görülebilir.
getCount ve getBodyPart
Bu metodlar ile parçalar alınabilir. Her parçanın BodyPart sınıfından türemek zorundadır.

javax.mail.internet.MimeMultiPart
Bu sınıf MIME eklentilerini içerir. Şekilden daha güzel anlaşılıyor.

javax.mail.internet.MimeBodyPart
Bu sınıf gönderilecek MIM eklentisi bilgisini içerir. Gömülü resim göndermek için örnek:
InternetHeaders headers = new InternetHeaders();
headers.addHeader("Content-Type", "image/jpeg");
headers.addHeader("Content-Transfer-Encoding", "base64");

MimeBodyPart messageBodyPart = new MimeBodyPart(headers, base64EncodedImageContentByteArray);
messageBodyPart.setDisposition(Part.INLINE);
messageBodyPart.setContentID("&lt;image&gt;");
messageBodyPart.setFileName("image.jpg"); 
Bir başka örnek:
messageBodyPart.setContent(content, "text/html");
messageBodyPart.setDisposition(Part.INLINE);

veya

messageBodyPart.setContent(content, "text/plain");
messageBodyPart.setDisposition(Part.INLINE);

javax.mail.Store
Bu sınıf ile bağlantı açılır.
connect
Örnek:
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "mail", "pass");
javax.mail.Folder
search
Belli bir tercihe göre arama yapabilmeyi sağlar.

javax.mail.search.ReceivedDateTerm
Örnek:

Apache Commons
IMAPClient
IMAP ile SMTP arasındaki farkı bilmiyorum. Ancak Apache Commons ile bir IMAP sınıfı geilyor. Örnek:

SimpleEmail
addTo
E-postanın kime gideceğini belirtir. Örnek:
 
send
Basit bir e-posta göndermek için SimpleEmail sınıfı kullanılıyor. Örnek:
SimpleEmail mail = new SimpleEmail();
//Sınıfı doldur
//..


//Gönder

email.send();
setAuthenticator
Sunucunun sorduğu şifreyi göndermek için kullanılır. Örnekte şifre ssl ile gönderiliyor.

setBounceAddress
Çok emin olmamakla beraber gönderilemeyen yani geri dönen e-postaların burada belirtilen adrese iletildiklerini düşünüyorum.Konuyla ilgili bir link burada.
 
setMsg
Gönderilecek e-postanın içinin belirtir. Örnek:
 
setSSLOnConnect
Bu metod ile TLS'in farkını bilmiyorum.
setTLS
Bu metod ile SSL'in farkını bilmiyorum.

MultiPartEmail sınıfı
Eklenti içeren e-postalar gönderbilmeyi sağlar. Apache sayfasında güzel bir örnek var.

HtmlEMail sınıfı
embed
Bu metod ile verilen html mesajının içine bir resim konulabiliyor. Örnek:

Daha sonra gömülen nesneye ait id html içinde "cid" olarak kullanılıyor. 

send
Html e-posta göndermek için HtmlEmail sınıfı kullanılıyor. Örneği buradan aldım.
MultiPartEmail email = new HtmlEmail();
//Sınıfı doldur
//..

//Gönder

email.send();
ImageHtmlEmail sınıfı
Bu sınıf ile resimlere url atamak mümkün. E-posta açılırken html içindeki image'lar url'den indiriliyor.
embed
Örnek:


EmailAttachment sınıfı
HtmlEmail sınıfına eklenti eklemek için EmailAttachment sınıfı kullanılıyor.Eklenetiler ATTACHMENT veya INLINE olarak gönderilebiliyor.

// eklenti ekle
EmailAttachment attachment = new EmailAttachment();
attachment.setPath("path/my.pdf");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
email.attach(attachment);

C#
Konuyu E-Posta Gönderme - C# başlıklı yazıya taşıdım.

SMTP Protokolü 
SMTP Protokolü yazısına taşıdım.

E-Posta Adresinin Doğruluğunu Kontrol Etme
Java
En kolay yöntem InternetAddress sınıfını kullanmak. Örnek:

Relay nedir ?
Relay e-posta sunucusunun sadece tanıdığı (authenticate) kişilere ait e-postaları göndermesidir. Şekli buradan aldım.

5 Ağustos 2015 Çarşamba

E-Posta Gönderme - C#

Giriş
C# ile e-posta gönderme için iki seçenek bulunuyor. İlk seçenekte bilgisayarda kurulu Outlook'a Interop aracılığyla bağlanıp e-posta göndermesini söylüyoruz. Bu durumda gönderilen e-posta "Sent" dizininde de görülebiliyor.

İlk Seçenek Outlook Interop
Projeye Add Reference menüsünden Outlook assembly'si eklenir. Assemblies > Extensions > Microsoft.Office.Interop.Outlook eklenir. Basit bir metin gönderme örneği:

// Create the Outlook application.
    Outlook.Application oApp = new Outlook.Application();
    // Create a new mail item.
    Outlook.MailItem oMsg = (Outlook.MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem);
    // Set HTMLBody. 
    //add the body of the email
    oMsg.HTMLBody = "Hello, Jawed your message body will go here!!";
    //Subject line
    oMsg.Subject = "Your Subject will go here.";
    // Add a recipient.
    Outlook.Recipients oRecips = (Outlook.Recipients)oMsg.Recipients;
    // Change the recipient in the next line if necessary.
    Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add("jawed.ace@gmail.com");
    oRecip.Resolve();
    // Send.
    oMsg.Send();

İkinci Seçenek System.Net.Mail Sınıfları
Tam çalışan örnek:
Sınıflara bakmadan önce tam çalışan bir örnek eklemek istedim.
MailMessage mail = new MailMessage();
mail.From = new MailAddress("abc@mydomain.com", "Enquiry");
mail.To.Add("munjal.pandya@yahoo.com");
mail.IsBodyHtml = true;
mail.Subject = "Registration";
mail.Body = "Some Text";
mail.Priority = MailPriority.High;

SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
//smtp.UseDefaultCredentials = true;
smtp.Credentials = new System.Net.NetworkCredential("xyz@gmail.com", "<mypwd>");
smtp.EnableSsl = true;
//smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.Send(mail);

Attachment sınıfı
E-postadaki eklentiyi temsil eder. Inline attachent şöyle gönderilir.
string attachmentPath = Environment.CurrentDirectory + @"\test.png";
Attachment inline = new Attachment(attachmentPath);
inline.ContentDisposition.Inline = true;
inline.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
inline.ContentId = contentID;
inline.ContentType.MediaType = "image/png";
inline.ContentType.Name = Path.GetFileName(attachmentPath);

message.Attachments.Add(inline);


MailAddress sınıfı
Bu sınıf Java'daki Internet address sınıfına benziyor. Örnek:
new MailAddress("abc@mydomain.com", "Enquiry");
MailMessage  sınıfı
Mesajın içeriğini saklayan sınıf

MailMessage sınıfı Disposable olduğu için using ile kullanmak gerekir.
// .NET 4.0 only for SmtpClient disposing
using (var smtpClient = new SmtpClient(_host, _portNumber))
{
  using (var mailMsg = new MailMessage())
  {
    ...
    smtpClient.Send(mailMsg);
  }
}
From Alanı
Kimden geldiğini gösterir. MailAddress nesnesi atanır.

Priority Alanı
Yüksek öncelik verilebilir.Örnek:
MailMessage mailMsg = new MailMessage();
mailMsg.Priority = MailPriority.High; //I want to know now!
To Alanı
MailAddressCollection türünden olan bu alana liste ekleme metodu bulunmuyor. Şöyle yapılabilir.
List<string> recipientAddresses = ...
var mailMsg = new MailMessage();
recipientAddresses.ForEach(p => mailMsg.To.Add(p));

SmtpClient Sınıfı
Bu sınıf Java'daki Transport'a benziyor.

Constructor metodu
Sınıfın bir kaç tane constructor metodu var.
En kolay hedef e-posta sunucusu ve port numarasını beraber veren metod. Bu arada SMTP port numarası olarak artık 25 yerine çoğunlukla 587 kullanılıyor.
SmtpClient smtpClient = new SmtpClient("mailexchanger_String", 587);
Send metodu
MailMessage nesnesini gönderir. Örnek:
MailMessage mail = ...
SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
smtp.Send(mail);

SmptpClient sınıfı Disposable olduğu için using ile kullanmak gerekir

using (SmtpClient smtpClient = new SmtpClient(...))
{
...
}