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.

Hiç yorum yok:

Yorum Gönder