From ce39eff23a54e57d15a854de917bc84065c1a63c Mon Sep 17 00:00:00 2001 From: Rohit Sehgal Date: Fri, 5 Jun 2020 17:06:11 +0530 Subject: [PATCH] Add: Show HTML content button Now with HTML incoming mails, HTML version button will be sent, to view content in broser with html data. Fix #28 --- .gitignore | 1 + pom.xml | 3 +- .../Configurations/TrashemailConfig.java | 11 ++- .../messageEntities/InlineKeyboardButton.java | 8 +- .../Telegram/ForwardMailsToTelegram.java | 31 ++++++- .../Telegram/SendTelegramMessage.java | 85 ++++++++++++++++++- .../github/trashemail/utils/MailParser.java | 1 - .../trashemail/utils/SaveMailToHTMLFile.java | 40 +++++++++ 8 files changed, 169 insertions(+), 11 deletions(-) create mode 100644 src/main/java/io/github/trashemail/utils/SaveMailToHTMLFile.java diff --git a/.gitignore b/.gitignore index d730885..0354255 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ src/main/resources/application.yml *.db lib/ bin/ +*.html ### STS ### .apt_generated diff --git a/pom.xml b/pom.xml index 75461db..290132b 100644 --- a/pom.xml +++ b/pom.xml @@ -77,6 +77,7 @@ spring-integration-mail 5.3.0.RELEASE + org.jsoup jsoup @@ -88,7 +89,7 @@ 1.18.10 - + diff --git a/src/main/java/io/github/trashemail/Configurations/TrashemailConfig.java b/src/main/java/io/github/trashemail/Configurations/TrashemailConfig.java index 2e9967b..d12ca0e 100644 --- a/src/main/java/io/github/trashemail/Configurations/TrashemailConfig.java +++ b/src/main/java/io/github/trashemail/Configurations/TrashemailConfig.java @@ -13,9 +13,14 @@ @ConfigurationProperties(prefix = "trashemail") public class TrashemailConfig { private Integer maxEmailsPerUser; + private String hostURI; + private String downloadPath; - @Override - public String toString() { - return Integer.toString(maxEmailsPerUser); + @Override public String toString() { + return "TrashemailConfig{" + + "maxEmailsPerUser=" + maxEmailsPerUser + + ", hostURI='" + hostURI + '\'' + + ", downloadPath='" + downloadPath + '\'' + + '}'; } } diff --git a/src/main/java/io/github/trashemail/Telegram/DTO/messageEntities/InlineKeyboardButton.java b/src/main/java/io/github/trashemail/Telegram/DTO/messageEntities/InlineKeyboardButton.java index 1bc7d6c..e9b5069 100644 --- a/src/main/java/io/github/trashemail/Telegram/DTO/messageEntities/InlineKeyboardButton.java +++ b/src/main/java/io/github/trashemail/Telegram/DTO/messageEntities/InlineKeyboardButton.java @@ -11,14 +11,18 @@ @Setter @NoArgsConstructor public class InlineKeyboardButton { + /* + According the docs, either of callback_data or uri, only one should be set. + */ private String text; private String callback_data; + private String url; - @Override - public String toString() { + @Override public String toString() { return "InlineKeyboardButton{" + "text='" + text + '\'' + ", callback_data='" + callback_data + '\'' + + ", url='" + url + '\'' + '}'; } } diff --git a/src/main/java/io/github/trashemail/Telegram/ForwardMailsToTelegram.java b/src/main/java/io/github/trashemail/Telegram/ForwardMailsToTelegram.java index dc9c00d..5e7c071 100644 --- a/src/main/java/io/github/trashemail/Telegram/ForwardMailsToTelegram.java +++ b/src/main/java/io/github/trashemail/Telegram/ForwardMailsToTelegram.java @@ -3,6 +3,7 @@ import io.github.trashemail.Respositories.UserRepository; import io.github.trashemail.models.User; import io.github.trashemail.utils.MailParser; +import io.github.trashemail.utils.SaveMailToHTMLFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +17,8 @@ public class ForwardMailsToTelegram { private UserRepository userRepository; @Autowired private SendTelegramMessage sendTelegramMessage; + @Autowired + private SaveMailToHTMLFile saveMailToHTMLFile; private static final Logger log = LoggerFactory.getLogger( ForwardMailsToTelegram.class); @@ -25,7 +28,31 @@ public void sendToTelegram(Message message) throws Exception { User user = userRepository.findByEmailId(emailFor); MailParser parsedMail = new MailParser(message); - sendTelegramMessage.sendMessage(parsedMail.toString(), - Long.toString(user.getChatId())); + /* + If html content is set, offer to save in file and show html link. + */ + if(parsedMail.getHtmlContentSet()){ + Object filename = saveMailToHTMLFile.saveToFile( + parsedMail.getHtmlContent() + ); + + if (filename != null) + sendTelegramMessage.sendMessage( + parsedMail.toString(), + Long.toString(user.getChatId()), + (String) filename + ); + else { + sendTelegramMessage.sendMessage(parsedMail.toString(), + Long.toString( + user.getChatId() + ) + ); + } + } + else { + sendTelegramMessage.sendMessage(parsedMail.toString(), + Long.toString(user.getChatId())); + } } } diff --git a/src/main/java/io/github/trashemail/Telegram/SendTelegramMessage.java b/src/main/java/io/github/trashemail/Telegram/SendTelegramMessage.java index 724c3c6..931e921 100644 --- a/src/main/java/io/github/trashemail/Telegram/SendTelegramMessage.java +++ b/src/main/java/io/github/trashemail/Telegram/SendTelegramMessage.java @@ -3,7 +3,12 @@ import io.github.trashemail.Configurations.TelegramConfig; import java.util.ArrayList; +import java.util.List; +import io.github.trashemail.Configurations.TrashemailConfig; +import io.github.trashemail.Telegram.DTO.TelegramResponse; +import io.github.trashemail.Telegram.DTO.messageEntities.InlineKeyboardButton; +import io.github.trashemail.Telegram.DTO.messageEntities.InlineKeyboardMarkup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -20,6 +25,8 @@ public class SendTelegramMessage { @Autowired private TelegramConfig telegramConfig; + @Autowired + private TrashemailConfig trashemailConfig; @Autowired RestTemplate restTemplate; @@ -51,8 +58,7 @@ public void sendMessage(String message, String chatId){ data.add("text", split.get(i)); HttpEntity> request = - new HttpEntity>(data, - headers); + new HttpEntity>(data, headers); ResponseEntity response = restTemplate.postForEntity( telegramURI, @@ -65,5 +71,80 @@ public void sendMessage(String message, String chatId){ else log.error("Unable to send message to user: " + chatId); } + + } + + @Async + public void sendMessage(String message, String chatId, String filename){ + String telegramURI = telegramConfig.getUrl() + + telegramConfig.getBotToken() + + "/sendMessage"; + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + // Checking the message size and do splitting into chunks if required + int maxMessageSize = telegramConfig.getSize(); + ArrayList split = new ArrayList<>(); + for (int i = 0; i <= message.length() / maxMessageSize; i++) { + split.add(message.substring(i * maxMessageSize, + Math.min((i + 1) * maxMessageSize, + message.length()))); + } + + for (int i = 0; i < split.size(); i++) { + MultiValueMap data = new LinkedMultiValueMap<>(); + data.add("chat_id", chatId); + data.add("text", split.get(i)); + + HttpEntity> request = + new HttpEntity>(data, headers); + + ResponseEntity response = restTemplate.postForEntity( + telegramURI, + request, + String.class); + + if(response.getStatusCode() == HttpStatus.OK){ + log.debug("Message sent to user: " + chatId); + } + else + log.error("Unable to send message to user: " + chatId); + } + + // send the response with html button + InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); + + InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); + inlineKeyboardButton.setText("HTML version"); + inlineKeyboardButton.setUrl( + trashemailConfig.getHostPath() + filename + ); + + List> inlineKeyboardButtonList = + new ArrayList<>(); + + inlineKeyboardButtonList.add(new ArrayList<>()); + inlineKeyboardButtonList.get(0).add(inlineKeyboardButton); + + inlineKeyboardMarkup.setInlineKeyboardButtonList( + inlineKeyboardButtonList); + + TelegramResponse telegramResponse = new TelegramResponse( + Long.parseLong(chatId), + "To view in HTML format click the link below.", + inlineKeyboardMarkup + ); + + ResponseEntity response = restTemplate.postForEntity( + telegramURI, + telegramResponse, + TelegramResponse.class + ); + if(response.getStatusCode() == HttpStatus.OK){ + log.debug("HTML link sent to user: " + chatId + filename); + } + else + log.error("Unable to HTML Link to user: " + chatId + filename); } } diff --git a/src/main/java/io/github/trashemail/utils/MailParser.java b/src/main/java/io/github/trashemail/utils/MailParser.java index 9118c05..541c8f9 100644 --- a/src/main/java/io/github/trashemail/utils/MailParser.java +++ b/src/main/java/io/github/trashemail/utils/MailParser.java @@ -110,7 +110,6 @@ public String toString() { this.subject, this.content ); - return mailData; } } diff --git a/src/main/java/io/github/trashemail/utils/SaveMailToHTMLFile.java b/src/main/java/io/github/trashemail/utils/SaveMailToHTMLFile.java new file mode 100644 index 0000000..2c778fd --- /dev/null +++ b/src/main/java/io/github/trashemail/utils/SaveMailToHTMLFile.java @@ -0,0 +1,40 @@ +package io.github.trashemail.utils; + +import io.github.trashemail.Configurations.TrashemailConfig; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.mail.Message; +import java.io.FileWriter; +import java.util.UUID; + +@Component +public class SaveMailToHTMLFile { + @Autowired + TrashemailConfig trashemailConfig; + + private static final Logger log = LoggerFactory.getLogger( + SaveMailToHTMLFile.class); + + public Object saveToFile(String htmlContent){ + try { + String filename = UUID.randomUUID().toString() + ".html"; + + FileWriter myWriter = new FileWriter( + trashemailConfig.getDownloadPath() + filename); + + myWriter.write(htmlContent); + myWriter.close(); + + log.debug("File written to disk: "+ filename); + return filename; + } + catch (Exception e) { + log.error("Unable to save to HTML file. " + e.getMessage()); + return null; + } + } +}