package com.sygnalist.api;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.firebase.auth.FirebaseAuthException;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.stream.JsonReader;
import com.sygnalist.api.models.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
@RestController
@RequestMapping(path = "/utils/", headers = {"content-type=application/json"})
public class EmailController {
@GetMapping("/sendEmail")
public void sendEmail(String hash) throws MessagingException, IOException, ExecutionException, InterruptedException, FirebaseAuthException {
EmailConstructor emailConstructor = new EmailConstructor();
Report report = ReportFetcher.FetchReport(hash);
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "sygnalist.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
}
});
List<String> emails = report.getRecipientList();
for (String email : emails) {
Message msg = new MimeMessage(session);
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(email));
msg.setSubject("Zgłoszenie z aplikacji sygnalista");
msg.setContent("Zgłoszenie z aplikacji sygnalista", "text/html; charset=UTF-8");
msg.setSentDate(new Date());
MimeBodyPart messageBodyPart = new MimeBodyPart();
MimeUtility.encodeText(emailConstructor.CreateSygnalistaEmail(report, email), "UTF-8", "B");
messageBodyPart.setContent(emailConstructor.CreateSygnalistaEmail(report, email), "text/html; charset=UTF-8");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
msg.setContent(multipart);
Transport.send(msg);
}
}
@GetMapping("/report")
public void GetReport(String hash) throws ExecutionException, InterruptedException {
ReportFetcher.FetchReport(hash);
}
@PostMapping("/sendEmailKids")
public void sendEmail(@RequestBody KidsReportEmail kidsReportEmail) {
ObjectMapper objectMapper = new ObjectMapper();
try {
String objStr = "";
objStr = objectMapper.writeValueAsString(kidsReportEmail);
System.out.println(objStr);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
try {
System.out.println(kidsReportEmail.toString());
sendmailkids(kidsReportEmail);
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@PostMapping("/sendEmailPaparazzi")
public void sendEmailPaparazzi(@RequestBody PaparazziEmail paparazziEmail) {
ObjectMapper objectMapper = new ObjectMapper();
try {
String objStr = "";
objStr = objectMapper.writeValueAsString(paparazziEmail);
System.out.println(objStr);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
try {
System.out.println(paparazziEmail.toString());
sendMailPaparazzi(paparazziEmail);
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void sendmailkids(KidsReportEmail reportEmail) throws AddressException, MessagingException, IOException {
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "malysygnalista.pl");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("
[email protected]", "MalySygnalistaZgloszenie123*()");
}
});
Message msg = new MimeMessage(session);
//tutaj jest do kogo wysyłąne?
//ZMIANY 18.09.2019
InternetAddress[] emails = InternetAddress.parse(/*reportEmail.institution.email + "\n" + */(/*reportEmail.sendToMe ?*/ reportEmail.targetEmail/* : ""*/));
//GOTCH YA
msg.setRecipients(Message.RecipientType.TO, emails);
msg.setSubject("Zgłoszenie z aplikacji Mały Sygnalista");
msg.setContent("Zgłoszenie z aplikacji Mały Sygnalista", "text/html; charset=UTF-8");
msg.setSentDate(new Date());
MimeBodyPart messageBodyPart = new MimeBodyPart();
MimeUtility.encodeText(createEmailContentForKids(reportEmail), "UTF-8", "B");
messageBodyPart.setContent(createEmailContentForKids(reportEmail), "text/html; charset=UTF-8");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
//MimeBodyPart attachPart = new MimeBodyPart();
//attachPart.attachFile("/var/tmp/image19.png");
//multipart.addBodyPart(attachPart);
msg.setContent(multipart);
Transport.send(msg);
}
private void sendMailPaparazzi(PaparazziEmail paparazziEmail) throws AddressException, MessagingException, IOException {
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "malysygnalista.pl");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("
[email protected]", "MalySygnalistaZgloszenie123*()");
}
});
Message msg = new MimeMessage(session);
InternetAddress[] emails = InternetAddress.parse(paparazziEmail.email);
msg.setRecipients(Message.RecipientType.TO, emails);
msg.setSubject("Zgłoszenie z aplikacji Paparazzi");
msg.setContent("Zgłoszenie z aplikacji Paparazzi", "text/html; charset=UTF-8");
msg.setSentDate(new Date());
MimeBodyPart messageBodyPart = new MimeBodyPart();
MimeUtility.encodeText(createEmailContentPaparazzi(paparazziEmail), "UTF-8", "B");
messageBodyPart.setContent(createEmailContentPaparazzi(paparazziEmail), "text/html; charset=UTF-8");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
//MimeBodyPart attachPart = new MimeBodyPart();
//attachPart.attachFile("/var/tmp/image19.png");
//multipart.addBodyPart(attachPart);
msg.setContent(multipart);
Transport.send(msg);
}
private String createEmailContent(ReportEmail reportEmail) {
List<String> urls = reportEmail.urls;
String attachments = "";
System.out.println(reportEmail.urls.size());
int number = 1;
for (String url : urls) {
attachments = attachments + "
<a href=\"" + url + "\"> " + url + "
</a><br>";
number++;
}
System.out.println("attachments " + attachments);
DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
Date date = new Date();
String email = "
<html lang=\"en\" dir=\"ltr\">\n" +
"
<meta charset=\"utf-8\">\n" +
"
<meta http-equiv=\"Content-Type\" content=\"text/html charset=UTF-8\" />\n" +
"
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">" +
" \n" +
" @import url('https://fonts.googleapis.com/css?family=Titillium+Web');\n" +
"
<div style=\"background: #EAEAEA; height: 100%; font-family: 'Titillium Web';\">\n" +
"
<div id=\"main\" style=\"padding-top: 70px; padding-bottom: 70px;\">\n" +
"
<div style=\"height: 15px; margin: 0px 4vw 0px 4vw; background: #fff; border-radius: 10px 10px 0px 0px;\"> <div style=\"padding-top: 30px; padding-right: 50px;\"><i><span style=\"float: right;\">" + dateFormat.format(date) + ", Zgłoszenie nr " + reportEmail.reportNumber + "
</span></i></div></div>\n" +
"
<div style=\"background: #fff; margin: 0px 4vw 0px 4vw; padding: 40px 0px 0px 0px; border-radius:0px 0px 10px 10px; \">\n" +
" \n" +
"
<div style=\"padding: 20px 20px 20px 20px; margin: 25px 15px 20px 15px; background: #FAFAFA; border: solid 1px #EEEEEE;\">\n" +
"
<span><b>" + reportEmail.institution.getName() + "
</b></span><br>"
+
((reportEmail.email != null && !reportEmail.email.isEmpty())
?
("<span>" + reportEmail.institution.getAddress() + "</span><br><span>" + reportEmail.institution.getCity() + "</span><br>")
:
("<span>" + reportEmail.institution.getEmail() + "</span><br>"))
+
" </div>\n" +
" <center><span style=\"padding: 4vw 4vw 0px 4vw; font-size: 150%; font-family: 'Titillium Web';\">
<b>ZAWIADOMIENIE
</b><span></span></span>" +
"
<br><span style=\"padding: 4vw 4vw 0px 4vw; font-size: 100%; font-family: 'Titillium Web';\">" + reportEmail.problem + "\n" +
"
<div style=\"padding: 20px 20px 20px 20px; margin: 25px 15px 20px 15px; background: #FAFAFA; border: solid 1px #EEEEEE;\">\n" +
(!reportEmail.description.isEmpty() ? "
<span style=\"font-family: 'Titillium Web';\">Ja niżej podpisany zawiadamiam o treści:
</span><br>\n" +
"
<span style=\"font-family: 'Titillium Web';\"> " + reportEmail.description + "
</span>\n" : "") +
// "
<br><span style=\"\"><b>Lokalizacja:
</b></span><a href=\"" + "https://www.google.com/maps?q="+ reportEmail.lat +","+ reportEmail.lng +"\">" + "https://www.google.com/maps?q="+ reportEmail.lat +","+ reportEmail.lng + "
</a><br><br>" +
"
<br><span style=\"\"><b>Lokalizacja:
</b></span><a href=\"" + "https://www.google.com/maps/search/" + reportEmail.fetchedAddress + "/@" + reportEmail.lat + "," + reportEmail.lng + ",13.5z\">" + "https://www.google.com/maps/search/" + reportEmail.fetchedAddress + "/@" + reportEmail.lat + "," + reportEmail.lng + ",13.5z" + "
</a><br><br>" +
"
<span style=\"\"><b>Załączniki:
</b></span><br>\n" + attachments +
"
<div style=\"padding:20px 20px 20px 20px; margin: 25px 15px 20px 15px;\">\n" +
"
<span><b>Dane osoby składającej zawiadomienie:
</b></span><span style=\"margin-left: 5px\"></span><br>\n" +
((reportEmail.firstName == null || reportEmail.anonymously) ? ("
<span> Anonimowy mały sygnalista
</span><br>") :
("
<span>" + reportEmail.firstName + " " + reportEmail.lastName + "
</span><br>\n" +
"
<span>" + reportEmail.streetName + " " + reportEmail.flat + (!reportEmail.flatNumber.isEmpty() ? "/" + reportEmail.flatNumber : "") + " " + reportEmail.city + " " + reportEmail.postCode + "
</span><br>\n" +
"
<span>Tel: " + reportEmail.phoneNumber + "
</span><br>\n" +
"
<div style=\"height:55px;padding: 20px 20px 20px 20px; margin: 25px 0px 0px 0px;background:linear-gradient(to left,#f45c43 0%,#eb3349 100%);border-radius:0px 0px 10px 10px\"><center><span style=\"font-family:'Titillium Web';color:white;font-size:80%;font-style:italic\">Zawiadomienie wysłane za pośrednictwem aplikacji mały sygnalista
</span><br>\n" +
"
<img style=\"height: 20px; width: 90; margin-top:10px;\" src=\"https://firebasestorage.googleapis.com/v0/b/sg-app-fe55c.appspot.com/o/logo_white_v1.png?alt=media&token=c5219959-3299-4df8-a483-950034c69fb4\">" +
String encodedBody = null;
try {
encodedBody = new String(email.getBytes("UTF-8"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return encodedBody;
}
private String createEmailContentForKids(KidsReportEmail reportEmail) {
List<String> urls = reportEmail.attachments;
String attachments = "";
System.out.println(reportEmail.attachments.size());
int number = 1;
for (String url : urls) {
attachments = attachments + "
<a href=\"" + url + "\"> " + url + "
</a><br>";
number++;
}
System.out.println("attachments " + attachments);
DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
Date date = new Date();
String email = "
<html lang=\"en\" dir=\"ltr\">\n" +
"
<meta charset=\"utf-8\">\n" +
"
<meta http-equiv=\"Content-Type\" content=\"text/html charset=UTF-8\" />\n" +
"
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">" +
" \n" +
" @import url('https://fonts.googleapis.com/css?family=Titillium+Web');\n" +
"
<div style=\"background: #EAEAEA; height: 100%; font-family: 'Titillium Web';\">\n" +
"
<div id=\"main\" style=\"padding-top: 70px; padding-bottom: 70px;\">\n" +
"
<div style=\"height: 15px; margin: 0px 4vw 0px 4vw; background: #fff; border-radius: 10px 10px 0px 0px;\"> <div style=\"padding-top: 30px; padding-right: 50px;\"><i><span style=\"float: right;\">" + dateFormat.format(date) + ", Zgłoszenie nr " + reportEmail.reportNumber + "
</span></i></div></div>\n" +
"
<div style=\"background: #fff; margin: 0px 4vw 0px 4vw; padding: 40px 0px 0px 0px; border-radius:0px 0px 10px 10px; \">\n" +
" \n" +
"
<div style=\"padding: 20px 20px 20px 20px; margin: 25px 15px 20px 15px; background: #FAFAFA; border: solid 1px #EEEEEE;\">\n" +
+
((reportEmail.kidEmail != null && !reportEmail.kidEmail.isEmpty())
?
("<span>" + reportEmail.targetAddress + "</span><br><span>" + reportEmail.targetCity + "</span><br>")
:
("<span>" + reportEmail.targetEmail + "</span><br>"))
+
" </div>\n" +
" <center><span style=\"padding: 4vw 4vw 0px 4vw; font-size: 150%; font-family: 'Titillium Web';\">
<b>ZAWIADOMIENIE
</b><span></span></span>" +
"</center>\n" +
"
<div style=\"padding: 20px 20px 20px 20px; margin: 25px 15px 20px 15px; background: #FAFAFA; border: solid 1px #EEEEEE;\">\n" +
(!reportEmail.description.isEmpty() ? "
<span style=\"font-family: 'Titillium Web';\">Ja niżej podpisany zawiadamiam o:
</span><br>\n" +
"
<span style=\"font-family: 'Titillium Web';\"> " + reportEmail.description + "
</span>\n" : "") +
// "
<br><span style=\"\"><b>Lokalizacja:
</b></span><a href=\"" + "https://www.google.com/maps?q="+ reportEmail.lat +","+ reportEmail.lng +"\">" + "https://www.google.com/maps?q="+ reportEmail.lat +","+ reportEmail.lng + "
</a><br><br>" +
"
<br><br><span style=\"\"><b>Lokalizacja:
</b></span><a href=\"" + "https://www.google.com/maps/search/" + reportEmail.reportLocation + "/@" + reportEmail.reportLocationLat + "," + reportEmail.reportLocationLng + ",13.5z\">" + "https://www.google.com/maps/search/" + reportEmail.targetAddress + "/@" + reportEmail.reportLocationLat + "," + reportEmail.reportLocationLng + ",13.5z" + "
</a><br><br>" +
"
<span style=\"\"><b>Załączniki:
</b></span><br>\n" + attachments +
"
<div style=\"padding:20px 20px 20px 20px; margin: 25px 15px 20px 15px;\">\n" +
"
<span><b>Dane osoby składającej zawiadomienie:
</b></span><span style=\"margin-left: 5px\"></span><br>\n" +
((reportEmail.anonymously) ? "Anonimowy sygnalista" : reportEmail.kidName) + "
<br><br>" +
"
<span><b>Dane opiekuna osoby składającej zawiadomienie:
</b></span><span style=\"margin-left: 5px\"></span><br>\n" +
((reportEmail.parentName == null || reportEmail.parentName == " " || reportEmail.parentName == "" || reportEmail.anonymously) ? ("
<span>Dane ukryte
</span><br>") :
("
<span>" + reportEmail.parentName + "
</span><br>\n" +
"
<span>" + reportEmail.parentAddress + "\n" + reportEmail.parentCity + "
</span><br>\n" +
"
<span>Tel: " + reportEmail.targetPhoneNumber + "
</span><br>\n" +
"
<div style=\"height:55px;padding: 20px 20px 20px 20px; margin: 25px 0px 0px 0px;background:linear-gradient(to left,#f45c43 0%,#eb3349 100%);border-radius:0px 0px 10px 10px\"><center><span style=\"font-family:'Titillium Web';color:white;font-size:80%;font-style:italic\">Zawiadomienie wysłane za pośrednictwem aplikacji sygnalista
</span><br>\n" +
"
<img style=\"height: 20px; width: 90; margin-top:10px;\" src=\"https://firebasestorage.googleapis.com/v0/b/sygnalistakids-41d56.appspot.com/o/logo.png?alt=media&token=040fd1f2-dff2-4a7d-811f-a0c348ff2e0d\">" +
String encodedBody = null;
try {
encodedBody = new String(email.getBytes("UTF-8"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return encodedBody;
}
private String createEmailContentPaparazzi(PaparazziEmail paparazziEmail) {
List<String> urls = paparazziEmail.attachments;
String attachments = "";
System.out.println(paparazziEmail.attachments.size());
int number = 1;
for (String url : urls) {
attachments = attachments + "
<a href=\"" + url + "\"> " + url + "
</a><br>";
number++;
}
System.out.println("attachments " + attachments);
DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
Date date = new Date();
String email = "
<html lang=\"en\" dir=\"ltr\">\n" +
"
<meta charset=\"utf-8\">\n" +
"
<meta http-equiv=\"Content-Type\" content=\"text/html charset=UTF-8\" />\n" +
"
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">" +
" \n" +
" @import url('https://fonts.googleapis.com/css?family=Titillium+Web');\n" +
"
<div style=\"background: #EAEAEA; height: 100%; font-family: 'Titillium Web';\">\n" +
"
<div id=\"main\" style=\"padding-top: 70px; padding-bottom: 70px;\">\n" +
"
<div style=\"height: 15px; margin: 0px 4vw 0px 4vw; background: #fff; border-radius: 10px 10px 0px 0px;\"> <div style=\"padding-top: 30px; padding-right: 50px;\"><i><span style=\"float: right;\">" + dateFormat.format(date) + ", Materiał nr " + paparazziEmail.reportNumber + "
</span></i></div></div>\n" +
"
<div style=\"background: #fff; margin: 0px 4vw 0px 4vw; padding: 40px 0px 0px 0px; border-radius:0px 0px 10px 10px; \">\n" +
"
<div style=\"padding: 20px 20px 20px 20px; margin: 25px 15px 20px 15px; background: #FAFAFA; border: solid 1px #EEEEEE;\">\n" +
+
+
"
<div style=\"padding: 20px 20px 20px 20px; margin: 25px 15px 20px 15px; background: #FAFAFA; border: solid 1px #EEEEEE;\">\n" +
(!paparazziEmail.description.isEmpty() ? "
<span style=\"font-family: 'Titillium Web';\">Opis materiału:
</span><br>\n" +
"
<span style=\"font-family: 'Titillium Web';\"> " + paparazziEmail.description + "
</span>\n" : "") +
// "
<br><span style=\"\"><b>Lokalizacja:
</b></span><a href=\"" + "https://www.google.com/maps?q="+ reportEmail.lat +","+ reportEmail.lng +"\">" + "https://www.google.com/maps?q="+ reportEmail.lat +","+ reportEmail.lng + "
</a><br><br>" +
"
<br><span style=\"\"><b>Lokalizacja:
</b></span><a href=\"" + "https://www.google.com/maps/search/" + paparazziEmail.address + "/@" + paparazziEmail.reportLocationLat + "," + paparazziEmail.reportLocationLng + ",13.5z\">" + "https://www.google.com/maps/search/" + paparazziEmail.address + "/@" + paparazziEmail.reportLocationLat + "," + paparazziEmail.reportLocationLng + ",13.5z" + "
</a><br><br>" +
"
<span style=\"\"><b>Załączniki:
</b></span><br>\n" + attachments +
"
<div style=\"padding:20px 20px 20px 20px; margin: 25px 15px 20px 15px;\">\n" +
"
<span><b>Dane osoby składającej materiał:
</b></span><span style=\"margin-left: 5px\"></span><br>\n" +
((paparazziEmail.firstName == null || paparazziEmail.anonymously) ? ("
<span>Użytkownik anonimowy
</span><br>") :
("
<span>" + paparazziEmail.firstName + " " + paparazziEmail.lastName + "
</span><br>\n" +
"
<span>" + paparazziEmail.streetName + " " + paparazziEmail.homeNumber + (!paparazziEmail.flatNumber.isEmpty() ? "/" + paparazziEmail.flatNumber : "") + " " + paparazziEmail.city + " " + paparazziEmail.postCode + "
</span><br>\n" +
"
<span>Tel: " + paparazziEmail.phoneNumber + "
</span><br>\n" +
"
<br><br><span>Numer konta: " + paparazziEmail.bankAccount + "
</span><br><br>" +
(paparazziEmail.publishing ? "
<span>Wyrażono zgodę na publikację materiału
</span><br>" : "
<span>Nie wyrażono zgody na publikację materiału
</span><br>") +
"
<div style=\"height:55px;padding: 20px 20px 20px 20px; margin: 25px 0px 0px 0px;background:#000;border-radius:0px 0px 10px 10px\"><center><span style=\"font-family:'Titillium Web';color:white;font-size:80%;font-style:italic\">Materiał wysłany za pośrednictwem aplikacji Paparazzi
</span><br>\n" +
"
<img style=\"height: 20px; width: 90; margin-top:10px;\" src=\"https://firebasestorage.googleapis.com/v0/b/paparazzi-e9d73.appspot.com/o/Path%2014.png?alt=media&token=45342157-dfbc-4238-9a23-83b68971ca11\">" +
String encodedBody = null;
try {
encodedBody = new String(email.getBytes("UTF-8"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return encodedBody;
}
private String determineReportType(int type) {
if (type == 2) {
return "Negatywne";
} else if (type == 1) {
return "Pozytywne";
}
return "";
}
}