sobota, 1 maja 2010

JavaMail: Wysłanie emaila

W poniższym artykule zademonstruje jak łatwo można napisać kod, który wysyła wiadomości email. Wysyłanie wiadomości odbędzie się przy pomocy naszego konta na gmail'u, więc nie będzie potrzebne instalowanie serwerów smtp, itd.

Przygotowanie projektu
Pierwszym krokiem jakim musisz wykonać jest założenie sobie konta na googlach. Następnie potrzebujemy jeszcze biblioteki Java Mail dzięki której będziemy mogli wysyłać maile. Plik jar możemy ściągnąć z oficjalnej strony Java Mail Api. Po ściągnięciu i rozpakowaniu, plik mail.jar przenosimy do katalogu bibliotek w naszym projekcie.

Proste wysłanie maila
Oto prosty kod dzięki któremu wyślemy bardzo prostą wiadomość:
package com.blogspot.mkorwel.mail;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * 
 * @author Mateusz Korwel
 * 
 */
public class SendMail {

 private static final String HOST = "smtp.gmail.com";
 private static final int PORT = 465;
 // Adres email osby która wysyła maila
 private static final String FROM = "mateusz.korwel@gmail.com";
 // Hasło do konta osoby która wysyła maila
 private static final String PASSWORD = "xxx";
 // Adres email osoby do której wysyłany jest mail
 private static final String TO = "mateusz.korwel@gmail.com";
 // Temat wiadomości
 private static final String SUBJECT = "Hello World";
 // Treść wiadomości
 private static final String CONTENT = "To mój pierwszy mail wysłany za pomocą JavaMailAPI.";

 public static void main(String[] args) {
  try {
   new SendMail().send();
  } catch (MessagingException e) {
   e.printStackTrace();
  }
 }

 public void send() throws MessagingException {

  Properties props = new Properties();
  props.put("mail.transport.protocol", "smtps");
  props.put("mail.smtps.auth", "true");

  // Inicjalizacja sesji
  Session mailSession = Session.getDefaultInstance(props);

  // ustawienie debagowania, jeśli nie chcesz oglądać logów to usuń
  // linijkę poniżej lub zmień wartość na false
  mailSession.setDebug(true);

  // Tworzenie wiadomości email
  MimeMessage message = new MimeMessage(mailSession);
  message.setSubject(SUBJECT);
  message.setContent(CONTENT, "text/plain; charset=ISO-8859-2");
  message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO));

  Transport transport = mailSession.getTransport();
  transport.connect(HOST, PORT, FROM, PASSWORD);

  // wysłanie wiadomości
  transport.sendMessage(message, message
    .getRecipients(Message.RecipientType.TO));
  transport.close();
 }
}

Powyższy kod wysyła bardzo prostą wiadomość email. A co jeśli chcieli byśmy sformatować naszą wiadomość przy pomocy znaczków html? Powyższy kod wysłał by całą zawartość maila bez żadnej transformacji, ale wystarczy że zmienimy typ mime naszej wiadomości i treść zostanie sformatowana. Obecnie mamy text/plain a potrzebujemy text/html. Po takiej zmianie możemy wysyłać maila z kodem html.

Wysłanie maila z załącznikiem
Oto prosty kod dzięki któremu wyślemy wiadomość z załącznikiem:
package com.blogspot.mkorwel.mail;

import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.FileDataSource;
import javax.activation.DataHandler;

import java.util.Properties;

/**
 * 
 * @author Mateusz Korwel
 * 
 */
class SendMailAttachment {

 private static final String HOST = "smtp.gmail.com";
 private static final int PORT = 465;
 // Adres email osby która wysyła maila
 private static final String FROM = "mateusz.korwel@gmail.com";
 // Hasło do konta osoby która wysyła maila
 private static final String PASSWORD = "xxx";
 // Adres email osoby do której wysyłany jest mail
 private static final String TO = "mateusz.korwel@gmail.com";
 // Temat wiadomości
 private static final String SUBJECT = "Hello World";
 // Treść wiadomości
 private static final String CONTENT = "To mój pierwszy mail z załącznikami wysłaby za pomocą JavaMailAPI.";
 // Ścieżka do pliku
 private static final String PATH_FILE = "zalacznik.txt";

 public static void main(String[] args) {
  try {
   new SendMailAttachment().send();
   System.out.println("Wiadomość wysłana");
  } catch (MessagingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 void send() throws MessagingException {

  Properties props = new Properties();
  props.put("mail.transport.protocol", "smtps");
  props.put("mail.smtps.auth", "true");

  // Pobranie sesji
  Session mailSession = Session.getDefaultInstance(props, null);

  // Tworzenie wiadomości
  MimeMessage message = new MimeMessage(mailSession);
  message.setSubject(SUBJECT);

  // Stworzenie części wiadomosci z treścią
  MimeBodyPart textPart = new MimeBodyPart();
  textPart.setContent(CONTENT, "text/html; charset=ISO-8859-2");

  // Stworzenie części z załacznikami
  MimeBodyPart attachFilePart = new MimeBodyPart();
  FileDataSource fds = new FileDataSource(PATH_FILE);
  attachFilePart.setDataHandler(new DataHandler(fds));
  attachFilePart.setFileName(fds.getName());

  // Zestawienie obydwu części maila w jedną wieloczęściową
  Multipart mp = new MimeMultipart();
  mp.addBodyPart(textPart);
  mp.addBodyPart(attachFilePart);

  // Dodanie treści maila
  message.setContent(mp);
  message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO));

  Transport transport = mailSession.getTransport();
  transport.connect(HOST, PORT, FROM, PASSWORD);

  // Wysąłnei maila
  transport.sendMessage(message, message
    .getRecipients(Message.RecipientType.TO));
  transport.close();
 }
}

Powyższego kodu chyba nie trzeba komentować. Jedną różnicą maila z załącznikami od maila bez załączników jest to, że wiadomość składa się z kilku części.

3 komentarze:

  1. Nie wiem jak 5 lat temu, ale dzisiaj google blokuje próbę logowania za pomocą powyższego kodu.
    Jak stowrzyć "bezpieczną" aplikację? Czego wg google brakuje w powyższej klasie?

    OdpowiedzUsuń
  2. blokuje pewnie z tego powodu aby uniemozliwic botom do wysylania wiadomośći

    OdpowiedzUsuń
  3. Babyliss Pro Nano Titanium - titanium-arts.com
    We tested this product titanium rod in leg on a babylisspro nano titanium spring curling iron wide variety of samsung titanium watch applications in titanium pipes a number of products titanium straightener including: Caroble (a beverage), Alcohol (beer),

    OdpowiedzUsuń