sobota, 3 stycznia 2009

Wysyłanie maili z pomocą Gmaila

Dzisiaj zajmiemy się wysyłaniem maili przy użyciu konta na Gmailu. Stworzymy prostą aplikację JSF, mogącą pomóc w procesie rejestracji użytkownika i potwierdzenia poprawności wpisanego przez niego adresu e-mail.
Zacznijmy od napisania klasy obsługującej wysyłanie maili:
package pl.javazpiwnicy;

import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailManager
{
String addressFrom = "<nasze_konto>@gmail.com";
String temat = "Rejestracja sie powiodla!";

public void wyslij(String login, String haslo, String email) throws AddressException, MessagingException
{
String tresc = "Twoj login: " + login + "\n" + "Twoje haslo: " + haslo;
Properties props = System.getProperties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");

Authenticator auth = new SMTPAuthenticator();
Session sesja = Session.getInstance(props, auth);

MimeMessage wiadomosc = new MimeMessage(sesja);
wiadomosc.setFrom(new InternetAddress("<nasze_konto>@gmail.com"));
wiadomosc.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
wiadomosc.setSubject(temat);
wiadomosc.setText(tresc);

Transport.send(wiadomosc);
}

private class SMTPAuthenticator extends javax.mail.Authenticator
{
public PasswordAuthentication getPasswordAuthentication()
{
try
{
String username = "<nasz_login_na_gmaila>";
String password = "<nasze_haslo>";
return new PasswordAuthentication(username, password);
}catch (Exception e) {
}
return null;
}
}
}
Następnie napiszemy beana do zarządzania użytkownikiem:
package pl.javazpiwnicy;

import java.util.Random;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;

public class User
{
private String login;
private String email;
private String haslo;

private MailManager mm = new MailManager();

public String getLogin()
{
return login;
}
public void setLogin(String login)
{
this.login = login;
}
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
private void setHaslo()
{
Random r = new Random();
haslo = Long.toString(Math.abs(r.nextLong()), 27).substring(0, 8);
}

public String rejestruj() throws AddressException, MessagingException
{
setHaslo();
mm.wyslij(login, haslo, email);
return "success";
}
}
Teraz przyszła kolej na dodatkowy wpis w faces-config.xml :
<managed-bean>
<managed-bean-name>user</managed-bean-name>
<managed-bean-class>pl.javazpiwnicy.User</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Na koniec stworzymy bardzo prosty formularz, zawierający dwa pola do wpisania: login i adres maila:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>

</head>
<body>
<f:view>
<h:form>
<h:panelGrid columns="2">
<h:outputText value="Login"/><h:inputText value="#{user.login}"/>
<h:outputText value="E-mail"/><h:inputText value="#{user.email}"/>
<h:commandButton action="#{user.rejestruj}" value="Rejestruj"/>
</h:panelGrid>
</h:form>
</f:view>
</body>
</html>
Klikniecie przycisku rejestruj powinno spowodować wysłanie losowo wygenerowanego hasła na maila użytkownika. W ten sposób także łatwo potwierdzimy autentyczność adresu e-mail. Kod wydaje się w miarę łatwy, więc nie będę go wyjaśniał, jakby były pytania to proszę pisać w komentarzach. A oto jak wygląda struktura katalogów tego projektu u mnie:



Na koniec dodam jeszcze prostą funkcję na szyfrowanie hasła algorytmem md5, przyda się kiedy będziecie wygenerowane hasło chcieli wrzucić do bazy:
private String makeMD5(String password) throws NoSuchAlgorithmException
{
MessageDigest m = MessageDigest.getInstance( "MD5" );
m.update( password.getBytes(), 0, password.length() );
return new BigInteger( 1, m.digest() ).toString( 16 );
}

Brak komentarzy:

Prześlij komentarz