From 4f88884d710eba9fad5e33ce9a7bce2c83b97a1b Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Wed, 8 Feb 2023 17:58:04 +0100 Subject: [PATCH] update mail interface --- .../TestIMAPOutlookOAuth.java | 426 +++++++++--------- .../datev/EXTF_OPD_migration_2022-test-1.csv | 3 + pom.xml | 2 +- 3 files changed, 220 insertions(+), 211 deletions(-) diff --git a/office-alexander-logistics-app/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuth.java b/office-alexander-logistics-app/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuth.java index 6b92cc3..d8ce302 100644 --- a/office-alexander-logistics-app/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuth.java +++ b/office-alexander-logistics-app/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuth.java @@ -39,247 +39,253 @@ import junit.framework.Assert; */ public class TestIMAPOutlookOAuth { - @Test - public void imapAccess2() { + @Test + public void imapAccess2() { - String userEmailId = "imixs@alexander-logistics.com"; - try { - String oauth2AccessToken = getAuthToken(); + String userEmailId = "imixs@alexander-logistics.com"; + try { + String oauth2AccessToken = getAuthToken(); - String host = "outlook.office365.com"; - String port = "993"; - Store store = null; + String host = "outlook.office365.com"; + String port = "993"; + Store store = null; - String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; - Properties props = new Properties(); + String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; + Properties props = new Properties(); - props.put("mail.imaps.ssl.enable", "true"); - props.put("mail.imaps.sasl.enable", "true"); - props.put("mail.imaps.port", port); + props.put("mail.imaps.ssl.enable", "true"); + props.put("mail.imaps.sasl.enable", "true"); + props.put("mail.imaps.port", port); - props.put("mail.imaps.auth.mechanisms", "XOAUTH2"); - props.put("mail.imaps.sasl.mechanisms", "XOAUTH2"); + props.put("mail.imaps.auth.mechanisms", "XOAUTH2"); + props.put("mail.imaps.sasl.mechanisms", "XOAUTH2"); - props.put("mail.imaps.auth.login.disable", "true"); - props.put("mail.imaps.auth.plain.disable", "true"); + props.put("mail.imaps.auth.login.disable", "true"); + props.put("mail.imaps.auth.plain.disable", "true"); - props.setProperty("mail.imaps.socketFactory.class", SSL_FACTORY); - props.setProperty("mail.imaps.socketFactory.fallback", "false"); - props.setProperty("mail.imaps.socketFactory.port", port); - props.setProperty("mail.imaps.starttls.enable", "true"); - props.put("mail.imaps.auth.plain.disable", "true"); - props.put("mail.debug", "true"); - props.put("mail.debug.auth", "true"); + props.setProperty("mail.imaps.socketFactory.class", SSL_FACTORY); + props.setProperty("mail.imaps.socketFactory.fallback", "false"); + props.setProperty("mail.imaps.socketFactory.port", port); + props.setProperty("mail.imaps.starttls.enable", "true"); + props.put("mail.imaps.auth.plain.disable", "true"); + props.put("mail.debug", "true"); + props.put("mail.debug.auth", "true"); - Session session = Session.getInstance(props); - session.setDebug(true); + Session session = Session.getInstance(props); + session.setDebug(true); - store = session.getStore("imaps"); + store = session.getStore("imaps"); - System.out.println("OAUTH2 IMAP trying to connect with system properties to Host:" + host + ", Port: " - + port + ", userEmailId: " + userEmailId + ", AccessToken: " + oauth2AccessToken); + System.out.println("OAUTH2 IMAP trying to connect with system properties to Host:" + host + ", Port: " + + port + ", userEmailId: " + userEmailId + ", AccessToken: " + oauth2AccessToken); - store.connect(host, userEmailId, oauth2AccessToken); - System.out.println("IMAP connected with system properties to Host:" + host + ", Port: " + port - + ", userEmailId: " + userEmailId + ", AccessToken: " + oauth2AccessToken); - if (store.isConnected()) { - System.out.println("Connection Established using imap protocol successfully !"); + store.connect(host, userEmailId, oauth2AccessToken); + System.out.println("IMAP connected with system properties to Host:" + host + ", Port: " + port + + ", userEmailId: " + userEmailId + ", AccessToken: " + oauth2AccessToken); + if (store.isConnected()) { + System.out.println("Connection Established using imap protocol successfully !"); - IMAPFolder inbox = (IMAPFolder) store.getFolder("INBOX"); - inbox.open(Folder.READ_WRITE); + IMAPFolder inbox = (IMAPFolder) store.getFolder("INBOX"); + inbox.open(Folder.READ_WRITE); - // fetches all messages from the INBOX... - Message[] messages = inbox.getMessages(); - System.out.println("..." + messages.length + " new messages found"); - } - } catch (Exception e) { - System.out.println("Store.Connect failed with the errror: " + e.getMessage()); - StringWriter sw = new StringWriter(); - e.printStackTrace(new PrintWriter(sw)); - String exceptionAsString = sw.toString(); - System.out.println(exceptionAsString); - Assert.fail(); - } + // fetches all messages from the INBOX... + Message[] messages = inbox.getMessages(); + System.out.println("..." + messages.length + " new messages found"); + } + } catch (Exception e) { + System.out.println("Store.Connect failed with the errror: " + e.getMessage()); + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw)); + String exceptionAsString = sw.toString(); + System.out.println(exceptionAsString); + Assert.fail(); + } - } + } - /** - * Tests the Imap access - * - * https://stackoverflow.com/questions/73463357/cannot-authenticate-to-imap-on-office365-using-javamail - * - * mail.store.protocol="imap" mail.imap.host="outlook.office365.com" - * mail.imap.port="993" mail.imap.ssl.enable="true" - * mail.imap.starttls.enable="true" mail.imap.auth="true" - * mail.imap.auth.mechanisms="XOAUTH2" mail.imap.user="" - */ - @Test - public void imapAccess3() { - Properties props = new Properties(); + /** + * Tests the Imap access + * + * https://stackoverflow.com/questions/73463357/cannot-authenticate-to-imap-on-office365-using-javamail + * + * mail.store.protocol="imap" mail.imap.host="outlook.office365.com" + * mail.imap.port="993" mail.imap.ssl.enable="true" + * mail.imap.starttls.enable="true" mail.imap.auth="true" + * mail.imap.auth.mechanisms="XOAUTH2" mail.imap.user="" + */ + @Test + public void imapAccess3() { + Properties props = new Properties(); - props.put("mail.store.protocol", "imap"); - props.put("mail.imap.host", "outlook.office365.com"); - props.put("mail.imap.port", "993"); - props.put("mail.imap.ssl.enable", "true"); + props.put("mail.store.protocol", "imap"); + props.put("mail.imap.host", "outlook.office365.com"); + props.put("mail.imap.port", "993"); + props.put("mail.imap.ssl.enable", "true"); - props.put("mail.imap.starttls.enable", "true"); - props.put("mail.imap.auth", "true"); - props.put("mail.imap.auth.mechanisms", "XOAUTH2"); - props.put("mail.imap.user", "imixs@alexander-logistics.com"); + props.put("mail.imap.starttls.enable", "true"); + props.put("mail.imap.auth", "true"); + props.put("mail.imap.auth.mechanisms", "XOAUTH2"); + props.put("mail.imap.user", "imixs@alexander-logistics.com"); - // props.put("mail.imaps.auth.plain.disable","true"); + // props.put("mail.imaps.auth.plain.disable","true"); - props.put("mail.debug", "true"); - props.put("mail.debug.auth", "true"); - try { + props.put("mail.debug", "true"); + props.put("mail.debug.auth", "true"); + try { - String token = getAuthToken(); + String token = getAuthToken(); - Session session = Session.getInstance(props); - session.setDebug(true); - System.out.println("info: properties: " + session.getProperties().toString()); - Store store = session.getStore("imap"); - store.connect("outlook.office365.com", "imixs@alexander-logistics.com", token); - } catch (Exception e) { + Session session = Session.getInstance(props); + session.setDebug(true); + System.out.println("info: properties: " + session.getProperties().toString()); + Store store = session.getStore("imap"); + store.connect("outlook.office365.com", "imixs@alexander-logistics.com", token); +// IMAPFolder inbox = (IMAPFolder) store.getFolder("INBOX"); +// inbox.open(Folder.READ_WRITE); +// Message[] messages = inbox.getMessages(); +// System.out.println("..." + messages.length + " new messages found"); +// messages[0].getSubject(); - e.printStackTrace(); - Assert.fail(); - } - } + } catch (Exception e) { - /** - * Test the getToken method - */ - @Test - public void testGetToken() { - try { - String token = getAuthToken(); - System.out.println("....access token = " + token); - } catch (Exception e) { - e.printStackTrace(); - Assert.fail(); - } - } + e.printStackTrace(); + Assert.fail(); + } + } - /** - * Helper method to receive a Microsoft access Token - * - * https://jwt.ms/ - * - * "OAuth2": { - * - * "Authority": - * https://login.microsoftonline.com/51e2f038-0a96-41be-801d-bb4118aa018e/v2.0, - * - * "ClientId": "39e9eec5-6939-47dc-9729-3438a9898e63", - * - * "ClientSecret": "A6x8Q~EWVUyt~gfyTHtIJf4ig.F9tajUpEEXMaCL" - * - * } - * - * - * - * - * - * Hallo Herr Soika, - * - * - * - * ich habe eine neue App angelegt und hier die Berechtigungen neu gesetzt. - * - * - * - * Hier die Daten dazu: - * - * - * - * "OAuth2": { - * - * "Authority": - * https://login.microsoftonline.com/51e2f038-0a96-41be-801d-bb4118aa018e/v2.0, - * - * "ClientId": "39e9eec5-6939-47dc-9729-3438a9898e63", - * - * "ClientSecret": "A6x8Q~EWVUyt~gfyTHtIJf4ig.F9tajUpEEXMaCL" - * - * } - * - * - * - * Hier noch der Link zu einem Video, welches ganz gut erklärt wie das ganze - * eingebunden werden muss. - * - * Anhand dieser Anleitung bin ich ebefalls vorgegangen. - * - * - * - * https://www.youtube.com/watch?v=bMYA-146dmM&t=356s - * - * - * - * @return - * @throws IOException - * @throws ClientProtocolException - */ - public String getAuthToken() throws ClientProtocolException, IOException { - CloseableHttpClient client = HttpClients.createDefault(); - String tanantId = "51e2f038-0a96-41be-801d-bb4118aa018e"; - String clientId = "39e9eec5-6939-47dc-9729-3438a9898e63"; - String client_secret = "A6x8Q~EWVUyt~gfyTHtIJf4ig.F9tajUpEEXMaCL"; + /** + * Test the getToken method + */ + @Test + public void testGetToken() { + try { + String token = getAuthToken(); + System.out.println("....access token = " + token); + } catch (Exception e) { + e.printStackTrace(); + Assert.fail(); + } + } - HttpPost loginPost = new HttpPost("https://login.microsoftonline.com/" + tanantId + "/oauth2/v2.0/token"); - String scopes = "https://outlook.office365.com/.default"; - // scopes="https://outlook.office365.com/IMAP.AccessAsUser.All"; - // scopes="https://graph.microsoft.com/.default"; - // scopes="openid profile offline_access https://outlook.office365.com/SMTP.Send - // https://outlook.office365.com/POP.AccessAsUser.All - // https://outlook.office365.com/IMAP.AccessAsUser.All"; + /** + * Helper method to receive a Microsoft access Token + * + * https://jwt.ms/ + * + * "OAuth2": { + * + * "Authority": + * https://login.microsoftonline.com/51e2f038-0a96-41be-801d-bb4118aa018e/v2.0, + * + * "ClientId": "39e9eec5-6939-47dc-9729-3438a9898e63", + * + * "ClientSecret": "A6x8Q~EWVUyt~gfyTHtIJf4ig.F9tajUpEEXMaCL" + * + * } + * + * + * + * + * + * Hallo Herr Soika, + * + * + * + * ich habe eine neue App angelegt und hier die Berechtigungen neu gesetzt. + * + * + * + * Hier die Daten dazu: + * + * + * + * "OAuth2": { + * + * "Authority": + * https://login.microsoftonline.com/51e2f038-0a96-41be-801d-bb4118aa018e/v2.0, + * + * "ClientId": "39e9eec5-6939-47dc-9729-3438a9898e63", + * + * "ClientSecret": "A6x8Q~EWVUyt~gfyTHtIJf4ig.F9tajUpEEXMaCL" + * + * } + * + * + * + * Hier noch der Link zu einem Video, welches ganz gut erklärt wie das ganze + * eingebunden werden muss. + * + * Anhand dieser Anleitung bin ich ebefalls vorgegangen. + * + * + * + * https://www.youtube.com/watch?v=bMYA-146dmM&t=356s + * + * + * + * @return + * @throws IOException + * @throws ClientProtocolException + */ + public String getAuthToken() throws ClientProtocolException, IOException { + CloseableHttpClient client = HttpClients.createDefault(); + String tanantId = "51e2f038-0a96-41be-801d-bb4118aa018e"; + String clientId = "39e9eec5-6939-47dc-9729-3438a9898e63"; + String client_secret = "A6x8Q~EWVUyt~gfyTHtIJf4ig.F9tajUpEEXMaCL"; - String encodedBody = "client_id=" + clientId + "&scope=" + scopes + "&client_secret=" + client_secret - + "&grant_type=client_credentials"; + HttpPost loginPost = new HttpPost("https://login.microsoftonline.com/" + tanantId + "/oauth2/v2.0/token"); + String scopes = "https://outlook.office365.com/.default"; + // scopes="https://outlook.office365.com/IMAP.AccessAsUser.All"; + // scopes="https://graph.microsoft.com/.default"; + // scopes="openid profile offline_access https://outlook.office365.com/SMTP.Send + // https://outlook.office365.com/POP.AccessAsUser.All + // https://outlook.office365.com/IMAP.AccessAsUser.All"; - loginPost.setEntity(new StringEntity(encodedBody, ContentType.APPLICATION_FORM_URLENCODED)); + String encodedBody = "client_id=" + clientId + "&scope=" + scopes + "&client_secret=" + client_secret + + "&grant_type=client_credentials"; - loginPost.addHeader(new BasicHeader("cache-control", "no-cache")); - CloseableHttpResponse loginResponse = client.execute(loginPost); + loginPost.setEntity(new StringEntity(encodedBody, ContentType.APPLICATION_FORM_URLENCODED)); - InputStream inputStream = loginResponse.getEntity().getContent(); - byte[] response = readAllBytes(inputStream); - ObjectMapper objectMapper = new ObjectMapper(); - JavaType type = objectMapper.constructType( - objectMapper.getTypeFactory().constructParametricType(Map.class, String.class, String.class)); - Map parsed = new ObjectMapper().readValue(response, type); - String result = parsed.get("access_token"); + loginPost.addHeader(new BasicHeader("cache-control", "no-cache")); + CloseableHttpResponse loginResponse = client.execute(loginPost); - System.out.println("....access token = " + result); - return result; - } + InputStream inputStream = loginResponse.getEntity().getContent(); + byte[] response = readAllBytes(inputStream); + ObjectMapper objectMapper = new ObjectMapper(); + JavaType type = objectMapper.constructType( + objectMapper.getTypeFactory().constructParametricType(Map.class, String.class, String.class)); + Map parsed = new ObjectMapper().readValue(response, type); + String result = parsed.get("access_token"); - public static byte[] readAllBytes(InputStream inputStream) throws IOException { - final int bufLen = 4 * 0x400; // 4KB - byte[] buf = new byte[bufLen]; - int readLen; - IOException exception = null; + System.out.println("....access token = " + result); + return result; + } - try { - try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { - while ((readLen = inputStream.read(buf, 0, bufLen)) != -1) - outputStream.write(buf, 0, readLen); + public static byte[] readAllBytes(InputStream inputStream) throws IOException { + final int bufLen = 4 * 0x400; // 4KB + byte[] buf = new byte[bufLen]; + int readLen; + IOException exception = null; - return outputStream.toByteArray(); - } - } catch (IOException e) { - exception = e; - throw e; - } finally { - if (exception == null) - inputStream.close(); - else - try { - inputStream.close(); - } catch (IOException e) { - exception.addSuppressed(e); - } - } - } + try { + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + while ((readLen = inputStream.read(buf, 0, bufLen)) != -1) + outputStream.write(buf, 0, readLen); + + return outputStream.toByteArray(); + } + } catch (IOException e) { + exception = e; + throw e; + } finally { + if (exception == null) + inputStream.close(); + else + try { + inputStream.close(); + } catch (IOException e) { + exception.addSuppressed(e); + } + } + } } \ No newline at end of file diff --git a/office-alexander-logistics-app/src/test/resources/datev/EXTF_OPD_migration_2022-test-1.csv b/office-alexander-logistics-app/src/test/resources/datev/EXTF_OPD_migration_2022-test-1.csv index ea28a01..ba9adde 100644 --- a/office-alexander-logistics-app/src/test/resources/datev/EXTF_OPD_migration_2022-test-1.csv +++ b/office-alexander-logistics-app/src/test/resources/datev/EXTF_OPD_migration_2022-test-1.csv @@ -6,3 +6,6 @@ Umsatz (ohne Soll-/Haben-Kennzeichen);Soll-Haben-Kennzeichen;WKZ Umsatz;Kurs;Bas 76,56;"S";"EUR";0,000000;0,00;;8011;10211;;1412;"188448";;;"G LA-ZEL-2208-060";0;;;0;;;;;Faelligkeit;20230125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 76,56;"H";"EUR";0,000000;0,00;;8011;10211;;1412;"188450";;;"SG LA-ZEL-2208-060";0;;;0;;;;;Faelligkeit;20221228;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 10080,00;"H";"USD";1,019129;9890,80;"EUR";8010;10211;;1612;"188733";;;"R EX-SAL-2211-127";0;;;0;;;;;Faelligkeit;20221230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +450,00;"H";"USD";0,977500;460,36;"EUR";8017;15259;;1111;"185815";;;"R EX-GCA-2209-116";0;;;0;;;;;Faelligkeit;20221211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +1098,08;"H";"EUR";0,000000;0,00;;8017;15259;;1511;"186307";;;"R EX-GCA-2211-016";0;;;0;;;;;Faelligkeit;20221215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +2288,54;"H";"USD";0,977800;2340,50;"EUR";8010;15259;;1711;"186547";;;"R EX-LUF-2211-017";0;;;0;;;;;Faelligkeit;20221217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/pom.xml b/pom.xml index 89d1cd8..8ccfd64 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 4.5.3 2.3.1 - 2.3.0 + 2.3.1-SNAPSHOT 1.0.22 1.1.6-SNAPSHOT 2.2