Olá, pessoal!
No artigo de hoje vamos ver como enviar uma notificação por e-mail, usando JavaMail com AngularJS e tendo o Gmail como servidor. A aplicação é bem simples e vou usar um dos archetypes maven + angularjs que criei, assim vai poupar bastante tempo de configuração do projeto e podemos focar no que mais interessa para o artigo.
Requisitos:
- archetype-webapps-java-angularjs-yeoman;
- JavaMail;
- Ter uma conta Gmail.
Para começar, instale o archetype, que já vem com o Spring, Restful via Jersey, Twitter Bootstrap, AngularJS 1.0, Yeoman etc. Se não tiver o archetype instalado, siga os passos no GitHub do projeto.
O projeto de exemplo vai simular uma recuperação de senha, onde o usuário informa o e-mail cadastro e em seguida receberá um e-mail com as instruções para recuperação de senha.
Vamos começar a meter mão na massa! Vou ser bem objetivo e considerar que você já conhece AngularJS + Java.
Passo 01
Criando o projeto:
Escolha o archetype e preencha os campos com o nome do seu projeto.
Passo 02
Apague todos os packages em src/main/java deixando assim:
E apague os packages em src/test/java.
Passo 03
No arquivo pom.xml adicione a seguinte dependência:
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.5</version> </dependency>
E remova a tag <build></build>
Passo 04
Abra o arquivo applicationContext.xml e apague todo o código relacionado a banco de dados, deixando o conteúdo assim:
... <context:component-scan base-package="*" /> <tx:annotation-driven /> </beans>
Passo 05
No arquivo web.xml vamos informar o local onde ficará as classes dos serviços restful, no meu caso será:
<!-- package controller update of your --> <param-value>br.com.its.web.controller</param-value>
Observe que o caminho para API Restful será /rest/*. Você pode chamar como quiser /api/*.
Passo 06
Vamos desenvolver uma classe que terá o serviço de enviar o e-mail e as configurações do Gmail. Chamei de EmailNotificationService, veja a seguir (classe e os métodos são auto-explicativos):
@Service public class EmailNotificationService { public void sendEmail(User user) throws Exception{ Properties props = new Properties(); configEmail(props); Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { //aqui os dados da sua conta do gmail String login = "seuUsuario"; //não precisa colocar @gmail.com String password = "suaSenha"; return new PasswordAuthentication(login,password); } }); try { email(user, session); } catch (MessagingException e) { throw new Exception(e); } } /** */ private void email(User user, Session session) throws MessagingException, AddressException { Message message = new MimeMessage(session); String fromEmail = "email";//aqui o email que vai enviar as informações exemplo: noreply@suaempresa.com String subject = "Testing Send Email ITS"; String bodyEmail = "olá," + "\n\n It is working \\o//"; String toEmail = user.getEmail(); //o email de destino que vem da tela; message.setFrom(new InternetAddress(fromEmail)); message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(toEmail)); message.setSubject(subject); message.setText(bodyEmail); Transport.send(message); } //configurações do Gmail private void configEmail(Properties props) { props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); } }
Passo 07
Criaremos um objeto para representar os dados na tela User.java:
public class User { private String email; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
Passo 08
Agora vamos fazer o Controller e serviço restful:
@Controller @Path("/email") public class EmailNotificationController { @Autowired private EmailNotificationService emailNotificationService; @POST @Consumes(MediaType.APPLICATION_JSON) public Response send(User email){ Response response = Response.ok().build(); try { emailNotificationService.sendEmail(email); } catch (Exception e) { e.printStackTrace(); response = Response.status(Status.BAD_REQUEST).build(); } return response ; } public EmailNotificationService getEmailNotificationService() { return emailNotificationService; } public void setEmailNotificationService( EmailNotificationService emailNotificationService) { this.emailNotificationService = emailNotificationService; } }
Agora que temos o back-end pronto, vamos começar com o front-end. O primeiro passo, após a criação do projeto, é instalar o bower para baixar as libs necessárias via console: vá até a raiz do projeto e depois até a pasta src/main/webapp e digite:
bower install
Aguarde a instalação terminar.
Como estamos usando o Yeoman + AngularJS, ele já vem com uma estrutura minima funcionando, então vamos reaproveitar.
main.js
Vamos deixar o arquivo assim:
angular.module('webappApp') .controller('MainCtrl',['$scope','EmailService', function ($scope,EmailService) { $scope.emailService = new EmailService(); $scope.emailService.email = ''; console.log($scope.emailService); $scope.send = function(){ $scope.emailService.$save(function(){ $scope.emailService = new EmailService(); }); }; }]);
Criando EmailService.js
Vamos gerar o arquivo para camada de serviço, para digite:
yo angular:factory EmailService.js
E altere o arquivo emailservice.js, deixando-o assim:
'use strict'; angular.module('webappApp') .factory('EmailService', function($resource) { return $resource('../rest/email',{ }, { } ); });
Alterando o arquivo app/index.html
Vamos arrumar o nome do arquivo EmailService.js para forma correta deixando assim, na linha 72:
<script src="scripts/services/emailservice.js"></script>
Criando o views/home.html
Agora precisamos criar a tela que faz a recuperação de senha:
<h4>Email Notification with AngularJS + JavaMail with Gmail</h4> <form name="emailform"> <label>E-mail:</label> <div> <input type="email" required ng-model="emailService.email"> </div> <div> <button type="submit" class="btn btn-success" ng-click="send()" ng-disabled="emailform.$invalid">Reset Password</button> </div> </form>
Alterando a rota
Em app.js altere a rota deixando assim:
$routeProvider .when('/', { templateUrl: 'views/home.html', controller: 'MainCtrl' })
Testando
Vamos testar aplicação. O primeiro passo é compilar toda aplicação: mvn clean install
Agora vamos subir: mvn tomcat:run
Agora vou informar um e-mail e em seguida verificar o recebimento:
O email acabou de chegar:
O projeto example está disponível no meu Github.
Simples, não?! A aplicação é bem simples, e claro que se fosse um código final tem muita coisa para melhorar. Uma delas é não ter as informações de envio do e-mail (from) hard-code. A autenticação também não deveria está hard-code.
Vou ficando por aqui…