kamax-matrix / matrix-appservice-email Goto Github PK
View Code? Open in Web Editor NEWMatrix <--> E-mail Bridge
License: GNU Affero General Public License v3.0
Matrix <--> E-mail Bridge
License: GNU Affero General Public License v3.0
Following #28, see if the suggestion to block the possibility to enable encryption is doable, since we do not support it, and in which context.
It repeats this hundreds of times per second:
2017-10-03 00:31:39.420 INFO 18441 --- [receiver-daemon] i.k.m.b.email.model.email.EmailFetcher : Got email with key TOKEN
2017-10-03 00:31:39.420 INFO 18441 --- [receiver-daemon] i.k.m.b.e.m.email.EmailFormatterInbound : Email is from [email protected]
2017-10-03 00:31:39.427 INFO 18441 --- [receiver-daemon] i.k.m.b.e.m.email.EmailFormatterInbound : Transfer encoding is quoted-printable, decoding
2017-10-03 00:31:39.427 WARN 18441 --- [receiver-daemon] i.k.m.b.e.m.email.EmailFormatterInbound : Content transfer encoding is set to quoted-printable but enable to decode: Invalid URL encoding: not a valid digit (radix 16): 34
2017-10-03 00:31:39.427 INFO 18441 --- [receiver-daemon] i.k.m.b.e.m.email.EmailFormatterInbound : Found HTML content
2017-10-03 00:31:39.427 INFO 18441 --- [receiver-daemon] i.k.m.b.e.m.email.EmailFormatterInbound : Inbound formatter gmail did not match
2017-10-03 00:31:39.427 INFO 18441 --- [receiver-daemon] i.k.m.b.e.m.email.EmailFormatterInbound : Inbound formatter thunderbird did not match
2017-10-03 00:31:39.427 WARN 18441 --- [receiver-daemon] i.k.m.b.email.model.email.EmailManager : DROP: Received e-mail with invalid sender: from [email protected] but supposed to be [email protected]
2017-10-03 00:31:39.427 INFO 18441 --- [receiver-daemon] i.k.m.b.email.model.email.EmailManager : Injecting e-mail from [email protected] with key TOKEN
2017-10-03 00:31:39.427 INFO 18441 --- [receiver-daemon] i.k.m.b.email.model.email.EmailEndPoint : Email message was injected into end point TOKEN - [email protected] - TOKEN
2017-10-03 00:31:39.427 INFO 18441 --- [receiver-daemon] i.k.matrix.bridge.email.model.AEndPoint : Sending message event to 1 listeners
2017-10-03 00:31:39.427 INFO 18441 --- [receiver-daemon] i.k.m.b.e.model.matrix.MatrixEndPoint : Forwarding e-mail TOKEN to Matrix from [email protected] with plain content
2017-10-03 00:31:39.427 ERROR 18441 --- [receiver-daemon] i.k.m.b.email.model.email.EmailFetcher : Error in e-mail fetcher
java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:135) ~[na:1.8.0_144]
at io.kamax.matrix.bridge.email.model.matrix.MatrixEndPoint.sendMessageImpl(MatrixEndPoint.java:91) ~[classes!/:na]
at io.kamax.matrix.bridge.email.model.matrix.MatrixEndPoint.sendMessageImpl(MatrixEndPoint.java:39) ~[classes!/:na]
at io.kamax.matrix.bridge.email.model.AEndPoint.sendMessage(AEndPoint.java:91) ~[classes!/:na]
at io.kamax.matrix.bridge.email.model.subscription.BridgeSubscription.lambda$new$1(BridgeSubscription.java:58) ~[classes!/:na]
at io.kamax.matrix.bridge.email.model.AEndPoint.fireMessageEvent(AEndPoint.java:123) ~[classes!/:na]
at io.kamax.matrix.bridge.email.model.email.EmailEndPoint.inject(EmailEndPoint.java:123) ~[classes!/:na]
at io.kamax.matrix.bridge.email.model.email.EmailManager.lambda$afterPropertiesSet$0(EmailManager.java:75) ~[classes!/:na]
at io.kamax.matrix.bridge.email.model.email.EmailFetcher.lambda$connect$0(EmailFetcher.java:137) ~[classes!/:na]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_144]
cause i hate check new messages it a few differents apps one after another
Currently on t2bot.io there's an image that is being sent out to everyone about once every 10 minutes. No logs available to troubleshoot the issue, sadly.
After a user leave, if only bridge virtual users remain, belonging to the bridge, all the subscription should be terminated and all virtual users should leave the room.
Unknown cause.
java.lang.IllegalArgumentException: @:jki.re is not a valid Matrix ID
at io.kamax.matrix.MatrixID.<init>(MatrixID.java:45) ~[matrix-java-sdk.jar!/:na]
at io.kamax.matrix.client.MatrixHttpRoom.getJoinedUsers(MatrixHttpRoom.java:276) ~[matrix-java-sdk.jar!/:na]
at io.kamax.matrix.bridge.email.model.matrix.MatrixApplicationService.pushMessageEvent(MatrixApplicationService.java:161) ~[classes!/:na]
at io.kamax.matrix.bridge.email.model.matrix.MatrixApplicationService.push(MatrixApplicationService.java:143) ~[classes!/:na]
at io.kamax.matrix.bridge.email.controller.ApplicationServiceController.getTransaction(ApplicationServiceController.java:143) ~[classes!/:na]
at sun.reflect.GeneratedMethodAccessor45.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) ~[spring-webmvc-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:883) ~[spring-webmvc-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:664) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105) [spring-web-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) [spring-web-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.8.RELEASE.jar!/:4.3.8.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.14.jar!/:8.5.14]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]
Notification for a new message in room:
X-Spam-Status: Yes, score=5.036 tagged_above=-999 required=5
tests=[DKIM_SIGNED=0.1, HTML_IMAGE_ONLY_08=1.781, HTML_MESSAGE=0.001,
MISSING_HEADERS=1.207, REPLYTO_WITHOUT_TO_CC=1.946,
T_DKIM_INVALID=0.01, T_RP_MATCHES_RCVD=-0.01, URIBL_BLOCKED=0.001]
Synapse has an annoying bug where the invite can hit the appservice/client before it is capable of responding to that invite, and often throws back either a 500 or "You are not invited to that room" error. To work around this, the best approach is to retry accepting the invite on some sort of schedule. I'd recommend max 5 retries, 30 seconds apart.
HI, i just played around a little bit in Riot and enabled encrytion for a room. After enabling the communication was broken. The log:
Processing /transactions/114
22.883 INFO 963 --- [nio-8091-exec-5] i.k.m.b.e.m.m.MatrixApplicationService : HS provided valid credentials
22.883 INFO 963 --- [nio-8091-exec-5] i.k.m.b.e.m.m.MatrixApplicationService : Unknown event type m.room.encryption from @vmario89:matrix.fablabchemnitz.de
27.760 INFO 963 --- [nio-8091-exec-6] i.k.m.b.e.c.ApplicationServiceController : Processing /transactions/115
27.761 INFO 963 --- [nio-8091-exec-6] i.k.m.b.e.m.m.MatrixApplicationService : HS provided valid credentials
27.761 INFO 963 --- [nio-8091-exec-6] i.k.m.b.e.m.m.MatrixApplicationService : Unknown event type m.room.encrypted from @vmario89:matrix.fablabchemnitz.de
i was able to reset the communication by leaving the room and reinvite the email user.
I think the encryption enable button should be disabled like mautrix-whatsapp does it too (there the button in Riot is grey/forbidden). Or at least it maybe should be documented that its not a good idea to use.
kind regards, Mario
This could lead to simpler deployments, as all you'd have to do is set up an MX record.
Additionally, it would mean that inbound mail to a room (ie: mailing lists) could be handled more gracefully, as you could manage the email address for a specific room.
Currently, the bridge treats each user individually when processing events, regardless of which room users are in.
Incoming e-mails require a token and an active subscription to accept incoming bridge message which will be posted in Matrix.
Therefore, it is not possible to simulate the behavior of a mailing list, where people can just subscribe with their e-mail address and reach other people also subscribed to that list.
This feature will map an e-mail address to a Matrix room and forward messages between the two.
Only Plumbed functional mode will be supported: The bridge has ownership of the mailing list, which means it has the responsibility to direct forward Matrix messages to subscribed e-mail users.
Once Matrix has a way to support some kind of thread mechanism within a single room, Portal rooms will be considered.
Edit: Include comments feedback and only support Plumbed rooms.
It's easy to grasp the context and follow the conversation in Riot because you can see several messages at once and in order. It'd be nice if each email included some message history, maybe 8-12 messages, so the email user can better grasp what's happening. It really sucks to only see one message at a time, and then have to back out and select the next message, especially on a mobile client.
This would normally be used by Scalar (matrix.org), however it also allows for third-party bridge runners to more easily operate their bridge.
There's no set standard for provisioning APIs on bridges: it's just a collection of (normally) web endpoints that control various functions. For example /_matrix/provision/:roomId/:emailAddress
could invite the email address into the given room.
In case of catching up or in a burst of event, we end up sending the notification to people who joined after the said event, or not sending to people who left after the event.
We should fetch the room state at the time of the event and process that instead.
Hey,
i am trying to test the email bridge and made it working 50%. Inviting a person who is not registered works. The person gets an email and i am able to send messages to him. I am also able to manage the subscriptions. But repyling from Mail to Matrix does not work. My SMTP rejects it.
How does this thing work in general? As far as i understand it, matrix-appservice-email should create a mailbox for the specific user matrix-appservice-email+%KEY%@domain.tld to receive mails from external, right? The SMTP server ignored it because it does not exist:
warning: 19.15.227.212.combined.njabl.org: RBL lookup error: Host or domain name not found. Name service error for name=19.15.227.212.combined.njabl.org type=A: Host not found, try again
Mar 5 17:25:48 h2606131 postfix/smtpd[7893]: NOQUEUE: reject: RCPT from [212.227.15.19]: 550 5.1.1 [email protected]: Recipient address rejected: User unknown in virtual mailbox table; from=[email protected] to=[email protected] proto=ESMTP helo=
I know that this should work like some virtual mailbox lookup because i understand that it would make no sense to create a real mailbox for each request.
Do you have some hint how to configure MTA accordingly? I am using Postfix. It provides different options on how to handle unknown mails: redirect them to another mailbox, bounce them, ignore them. But none of these 3 options makes sense on how to deal with virtual.
kind regards and thanks for this great module! It definetely will help to make longterm bindings from mail-only yet users to Matrix users :-)
Or at least drop the token parameter from them. This is to help the user not accidentally send their link to a public room.
Ie: 404/500 on display names, avatars, etc.
Logs: https://gist.github.com/turt2live/ba75da9d449a900276d11d650fc059c1
To reduce the chance of spam from a bridge, there should be a way for email users to approve/deny their participation in a room.
The new flow would be:
I wouldn't make this configurable, because having it be an option reduces the effort required for a spammer.
Eg: @_email_someone=2bmatrix=40gmail.com:t2bot.io
should resolve to [email protected]
.
Currently, the full avatar picture is sent in the notification e-mail. This avatar can be arbitrarily big, leading to potentially massive e-mails.
Notifications should only contain thumbnails of those avatar, using the appropriate API, with a configurable max size on the bridge size.
In higher population rooms, spamming joined_members every couple milliseconds leads to higher than normal load on the server.
Here's a snippet from the log:
2017-10-03 00:11:16,995 - synapse.access.http.8008 - 91 - INFO - GET-3042- - - 8008 - {@_email:t2bot.io} Processed request: 5ms (7ms, 0ms) (0ms/0) 20864B 200 "GET /_matrix/client/r0/rooms/!UcYsUzyxTGDxLBEvLz:matrix.org/joined_members?access_token=<redacted> HTTP/1.1" "Apache-HttpClient/4.5.3 (Java/1.8.0_144)"
2017-10-03 00:11:17,023 - synapse.access.http.8008 - 91 - INFO - GET-3043- - - 8008 - {@_email:t2bot.io} Processed request: 6ms (0ms, 0ms) (0ms/0) 20864B 200 "GET /_matrix/client/r0/rooms/!UcYsUzyxTGDxLBEvLz:matrix.org/joined_members?access_token=<redacted> HTTP/1.1" "Apache-HttpClient/4.5.3 (Java/1.8.0_144)"
2017-10-03 00:11:17,033 - synapse.access.http.8008 - 91 - INFO - GET-3044- - - 8008 - {@_email:t2bot.io} Processed request: 5ms (0ms, 3ms) (0ms/0) 20864B 200 "GET /_matrix/client/r0/rooms/!UcYsUzyxTGDxLBEvLz:matrix.org/joined_members?access_token=<redacted> HTTP/1.1" "Apache-HttpClient/4.5.3 (Java/1.8.0_144)"
2017-10-03 00:11:17,159 - synapse.access.http.8008 - 91 - INFO - GET-3032- - - 8008 - {@_email:t2bot.io} Processed request: 503ms (56ms, 0ms) (115ms/12) 85749B 200 "GET /_matrix/client/r0/rooms/!DgvjtOljKujDBrxyHk:matrix.org/joined_members?access_token=<redacted> HTTP/1.1" "Apache-HttpClient/4.5.3 (Java/1.8.0_144)"
2017-10-03 00:11:17,588 - synapse.access.http.8008 - 91 - INFO - GET-3050- - - 8008 - {@_email:t2bot.io} Processed request: 5ms (8ms, 0ms) (0ms/0) 20864B 200 "GET /_matrix/client/r0/rooms/!UcYsUzyxTGDxLBEvLz:matrix.org/joined_members?access_token=<redacted> HTTP/1.1" "Apache-HttpClient/4.5.3 (Java/1.8.0_144)"
2017-10-03 00:11:17,799 - synapse.access.http.8008 - 91 - INFO - GET-3047- - - 8008 - {@_email:t2bot.io} Processed request: 569ms (60ms, 7ms) (163ms/12) 85749B 200 "GET /_matrix/client/r0/rooms/!DgvjtOljKujDBrxyHk:matrix.org/joined_members?access_token=<redacted> HTTP/1.1" "Apache-HttpClient/4.5.3 (Java/1.8.0_144)"
2017-10-03 00:11:17,867 - synapse.access.http.8008 - 91 - INFO - GET-3053- - - 8008 - {@_email:t2bot.io} Processed request: 5ms (4ms, 0ms) (0ms/0) 20864B 200 "GET /_matrix/client/r0/rooms/!UcYsUzyxTGDxLBEvLz:matrix.org/joined_members?access_token=<redacted> HTTP/1.1" "Apache-HttpClient/4.5.3 (Java/1.8.0_144)"
2017-10-03 00:11:18,182 - synapse.access.http.8008 - 91 - INFO - GET-3056- - - 8008 - {@_email:t2bot.io} Processed request: 6ms (4ms, 0ms) (0ms/0) 20864B 200 "GET /_matrix/client/r0/rooms/!UcYsUzyxTGDxLBEvLz:matrix.org/joined_members?access_token=<redacted> HTTP/1.1" "Apache-HttpClient/4.5.3 (Java/1.8.0_144)"
2017-10-03 00:11:18,552 - synapse.access.http.8008 - 91 - INFO - GET-3058- - - 8008 - {@_email:t2bot.io} Processed request: 6ms (4ms, 0ms) (0ms/0) 20864B 200 "GET /_matrix/client/r0/rooms/!UcYsUzyxTGDxLBEvLz:matrix.org/joined_members?access_token=<redacted> HTTP/1.1" "Apache-HttpClient/4.5.3 (Java/1.8.0_144)"
2017-10-03 00:11:18,616 - synapse.access.http.8008 - 91 - INFO - GET-3054- - - 8008 - {@_email:t2bot.io} Processed request: 732ms (55ms, 0ms) (555ms/12) 85749B 200 "GET /_matrix/client/r0/rooms/!DgvjtOljKujDBrxyHk:matrix.org/joined_members?access_token=<redacted> HTTP/1.1" "Apache-HttpClient/4.5.3 (Java/1.8.0_144)"
Like other existing bridge, provide a way to generate the HS registration file from command line, reading tokens and other variable from the bridge config.
java.lang.NullPointerException: null
at io.kamax.matrix.bridge.email.model.email.EmailFormatterInbound.get(EmailFormatterInbound.java:126) ~[classes!/:na]
at io.kamax.matrix.bridge.email.model.email.EmailManager.lambda$afterPropertiesSet$0(EmailManager.java:57) ~[classes!/:na]
at io.kamax.matrix.bridge.email.model.email.EmailFetcher.lambda$connect$0(EmailFetcher.java:137) ~[classes!/:na]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_192]
Quoted fragments can cause extra spam in rooms - these should be handled gracefully.
As it is, in my experience anyway, emails are coming in independently. So I can't reasonably just enter a thread and click the left-arrow to get to the next message. That might take me to a different thread, or it might take me to some other unrelated email. It'd be a great convenience to email users if rooms would thread together.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.