sargue / mailgun Goto Github PK
View Code? Open in Web Editor NEWJava library to easily send emails using the Mailgun service
License: MIT License
Java library to easily send emails using the Mailgun service
License: MIT License
Caused by: java.lang.NoClassDefFoundError: java.util.Objects
this error occur.
Please help!
I dont know if inline attachments is supported.
This would be a great feature to add?
Please see link below on inline attachments
https://documentation.mailgun.com/user_manual.html#inline-image
Currently if you provide a name of a template that does not exist in mailgun it returns a success response, however the message is never sent as the template does not exist. This can be implemented using the GET /domain/templates endpoint which returns a list of the templates that exist for your domain.
Hello @sargue, I would like to send email with mailgun using your library, I am using mail gun for the first time and I am still blocked during the configuration step:
This is what you recon:
Configuration configuration = new Configuration()
.domain("somedomain.com")
.apiKey("key-xxxxxxxxxxxxxxxxxxxxxxxxx")
.from("Test account", "[email protected]");
This is is my configuration values picked from mailgun, I would like to start with the sandbox, and later in production use something else:
mail-gun:
base-url: https://api.mailgun.net/v3/sandbox33b1xxxxxxxxxxxxxxxb808d.mailgun.org
domain: myd0main.com
api-key: 771adeexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxace86
from-name: Excited User
from: [email protected]
This is how I configure the plugin:
@Configuration
public class MailGunConfig {
@Autowired
private MailGunProperties mailGunProperties;
@Bean
public net.sargue.mailgun.Configuration mailGunConfiguration() {
return new net.sargue.mailgun.Configuration()
.domain(mailGunProperties.getDomain())
.apiKey(mailGunProperties.getApiKey())
.from(mailGunProperties.getFromName(), mailGunProperties.getFrom());
}
}
This is how I trigger the test send mail:
@RestController
@RequestMapping("/public/mailgun")
public class MailGunController {
@Autowired
private net.sargue.mailgun.Configuration configuration;
@GetMapping
public void testMail() {
Mail.using(configuration)
.to("[email protected]")
.subject("This is the subject")
.text("Hello world!")
.build()
.send();
}
}
When I run curl http://localhost/public/mailgun
, the function get triggered, but I do not get any email not error.
This is Mailgun tutorial to use their sandbox:
API key: 771adeexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxace86
API base URL: > https://api.mailgun.net/v3/sandbox33b1xxxxxxxxxxxxxxxb808d.mailgun.org
Here’s the basic code you need. Plug in your API info from above and modify the from address, to address, and other content to give Mailgun a good old test drive.
import java.io.File;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
public class MGSample {
// ...
public static JsonNode sendSimpleMessage() throws UnirestException {
HttpResponse<JsonNode> request = Unirest.post("https://api.mailgun.net/v3/" + YOUR_DOMAIN_NAME + "/messages"),
.basicAuth("api", API_KEY)
.queryString("from", "Excited User <[email protected]>")
.queryString("to", "[email protected]")
.queryString("subject", "hello")
.queryString("text", "testing")
.asJson();
return request.getBody();
}
}
I have enabled DEBUG
logging with logging.level.net.sargue.mailgun=DEBUG
, logging.level.org=DEBUG
and logging.level.com=DEBUG
and this is the debug log I had:
Creating new transaction with name [null]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT
Acquired Connection [ProxyConnection[PooledConnection[org.postgresql.jdbc.PgConnection@7aca4144]]] for JDBC transaction
Switching JDBC Connection [ProxyConnection[PooledConnection[org.postgresql.jdbc.PgConnection@7aca4144]]] to manual commit
Executing prepared SQL update
Executing prepared SQL statement [DELETE FROM SPRING_SESSION WHERE MAX_INACTIVE_INTERVAL < (? - LAST_ACCESS_TIME) / 1000]
SQL update affected 0 rows
Initiating transaction commit
Committing JDBC transaction on Connection [ProxyConnection[PooledConnection[org.postgresql.jdbc.PgConnection@7aca4144]]]
Releasing JDBC Connection [ProxyConnection[PooledConnection[org.postgresql.jdbc.PgConnection@7aca4144]]] after transaction
Returning JDBC Connection to DataSource
Cleaned up 0 expired sessions
findResources(META-INF/services/org.glassfish.jersey.spi.HeaderDelegateProvider)
findResources(META-INF/services/org.glassfish.jersey.internal.spi.AutoDiscoverable)
findResources(META-INF/services/org.glassfish.jersey.internal.spi.ForcedAutoDiscoverable)
Selected ExecutorServiceProvider implementation [org.glassfish.jersey.client.DefaultClientAsyncExecutorProvider] to be used for injection of executor qualified by [org.glassfish.jersey.client.ClientAsyncExecutor] annotation.
Restricted headers are not enabled using [sun.net.http.allowRestrictedHeaders] system property (setting only takes effect on connections created after the property has been set/changed).
I do not see anything related to my email being send.
It work fine when I use the
curl
code sample to send email.
Now I am wondering:
baseUrl
for and why is it missing in your configuration?Can you please provide an example of attaching iCal messages?
This C# based example show how to send iCal messages via maligun, but there are no java equivalent.
https://stackoverflow.com/questions/38840101/how-to-send-a-ical-invite-with-mailgun-rest-api-c
Glassfish is a huge dependency that I would rather not have to deal with. Without looking too much through your code, I bet I can be removed. See https://github.com/GoogleCloudPlatform/java-docs-samples/blob/master/managed_vms/mailgun/src/main/java/com/example/managedvms/mailgun/MailgunServlet.java and consider:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.19.1</version>
</dependency>
The Response object has properties for the responseType and responseCode, but does not handle the message body, which is returned in JSON format from POST requests.
e.g:
On successfully submitting a message (i.e. responseCode 200), the following response message is returned:
{ "id": "<[email protected]>", "message": "Queued. Thank you." }
This is useful as it returns the message id. Retrieving this is necessary as I wish to store email events and use webhooks to update the email state.
Revised version of Response.java:
`
package net.sargue.mailgun;
/**
Represents a response from the Mailgun service.
*/
public class Response {
public enum ResponseType {
OK, BAD_REQUEST, UNAUTHORIZED, REQUEST_FAILED, NOT_FOUND, SERVER_ERROR
}
private ResponseType responseType;
private int responseCode;
private String responseMessage;
Response(javax.ws.rs.core.Response response) {
responseCode = response.getStatus();
responseMessage = response.readEntity(String.class);
switch (responseCode) {
case 200:
responseType = ResponseType.OK;
break;
case 400:
responseType = ResponseType.BAD_REQUEST;
break;
case 401:
responseType = ResponseType.UNAUTHORIZED;
break;
case 402:
responseType = ResponseType.REQUEST_FAILED;
break;
case 404:
responseType = ResponseType.NOT_FOUND;
break;
default:
responseType = ResponseType.SERVER_ERROR;
}
}
/**
/**
/**
/**
Hello!
First off, thank you for this library, it has immensely sped up my development time!
I'm trying to include this library in my Android app. When building for development, everything works fine, but when I build my release APK, I get this error:
Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Ljavax/inject/Inject;
When I run gradle -q dependencies
, I see that there is multiple Inject
s defined:
+--- net.sargue:mailgun:1.0.0
| +--- org.glassfish.jersey.media:jersey-media-multipart:[2.22,) -> 2.22.2
| | +--- org.glassfish.jersey.core:jersey-common:2.22.2
| | | +--- javax.ws.rs:javax.ws.rs-api:2.0.1
| | | +--- javax.annotation:javax.annotation-api:1.2
| | | +--- org.glassfish.jersey.bundles.repackaged:jersey-guava:2.22.2
| | | +--- org.glassfish.hk2:hk2-api:2.4.0-b34
| | | | +--- javax.inject:javax.inject:1
| | | | +--- org.glassfish.hk2:hk2-utils:2.4.0-b34
| | | | | \--- javax.inject:javax.inject:1
| | | | \--- org.glassfish.hk2.external:aopalliance-repackaged:2.4.0-b34
| | | +--- org.glassfish.hk2.external:javax.inject:2.4.0-b34
| | | +--- org.glassfish.hk2:hk2-locator:2.4.0-b34
| | | | +--- org.glassfish.hk2.external:javax.inject:2.4.0-b34
Is there a way around this?
The documentation (README.md) shows the below example:
Configuration configuration = new Configuration()
.domain("somedomain.com")
.apiURL("https://api.eu.mailgun.net/v3")
.apiKey("key-xxxxxxxxxxxxxxxxxxxxxxxxx")
.from("Test account", "[email protected]");
but the apiURL
method does not exist. Use the apiUrl
method instead.
I try to send the email using this lib it run error.
java.lang.ClassNotFoundException: jakarta.ws.rs.client.ClientBuilder
Is there any advice?
Thanks
I have this error:
java.lang.ClassNotFoundException: jakarta.ws.rs.client.ClientBuilder
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
I add these libs
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.25</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>3.0.6</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>6.1.0.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.sargue</groupId>
<artifactId>mailgun</artifactId>
<version>1.10.0</version>
</dependency>
Any suggestion?
Thanks
Hi,
Each time i try to send an email it is delayed by few minutes until i receive it and i get the following error message (it doesn't crash, only appears):
W/Errors: The following warnings have been detected: WARNING: HK2 service reification failed for [org.glassfish.jersey.message.internal.DataSourceProvider] with an exception:
MultiException stack 1 of 4
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: javax.activation.DataSource
at org.glassfish.hk2.utilities.cache.LRUHybridCache.compute(LRUHybridCache.java:315)
at org.glassfish.hk2.utilities.reflection.internal.ClassReflectionHelperImpl.getAllMethods(ClassReflectionHelperImpl.java:108)
at org.jvnet.hk2.internal.Utilities.findInitializerMethods(Utilities.java:1341)
at org.jvnet.hk2.internal.DefaultClassAnalyzer.getInitializerMethods(DefaultClassAnalyzer.java:107)
at org.glassfish.jersey.internal.inject.JerseyClassAnalyzer.getInitializerMethods(JerseyClassAnalyzer.java:242)
at org.jvnet.hk2.internal.Utilities.getInitMethods(Utilities.java:218)
at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:145)
at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:180)
at org.jvnet.hk2.internal.SystemDescriptor.internalReify(SystemDescriptor.java:740)
at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:694)
at org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:461)
at org.jvnet.hk2.internal.ServiceLocatorImpl.narrow(ServiceLocatorImpl.java:2288)
at org.jvnet.hk2.internal.ServiceLocatorImpl.access$1200(ServiceLocatorImpl.java:125)
at org.jvnet.hk2.internal.ServiceLocatorImpl$9.compute(ServiceLocatorImpl.java:1373)
at org.jvnet.hk2.internal.ServiceLocatorImpl$9.compute(ServiceLocatorImpl.java:1368)
at org.glassfish.hk2.utilities.cache.internal.WeakCARCacheImpl.compute(WeakCARCacheImpl.java:116)
at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetAllServiceHandles(ServiceLocatorImpl.java:1430)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getAllServiceHandles(ServiceLocatorImpl.java:1355)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getAllServiceHandles(ServiceLocatorImpl.java:1344)
at org.glassfish.jersey.internal.inject.Providers.getServiceHandles(Providers.java:354)
at org.glassfish.jersey.internal.inject.Providers.getCustomProviders(Providers.java:201)
at org.glassfish.jersey.message.internal.MessageBodyFactory.(MessageBodyFactory.java:221)
at java.lang.reflect.Constructor.newInstance(Native Method)
at org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1375)
at org.jvnet.hk2.internal.ClazzCreator.createMe(ClazzCreator.java:272)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:366)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:487)
at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:83)
at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:71)
at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at org.jvnet.hk2.internal.SingletonContext.findOrCreate(SingletonContext.java:122)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022)
at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:774)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getUnqualifiedService(ServiceLocatorImpl.java:786)
at org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:111)
at org.glassfish.jersey.client.RequestProcessingInitializationStage.apply(RequestProcessingInitializationStage.java:97)
at org.glassfish.jersey.client.RequestProcessingInitializationStage.apply(RequestProcessingInitializationStage.java:67)
at org.glassfish.jersey.process.internal.Stages$LinkedStage.apply(Stages.java:308)
at org.glassfish.jersey.process.internal.Stages.process(Stages.java:171)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:25
Is there any example that Send With Email Template or MailGun Template?
I need to change default configuration of rest client, at least timeouts.
How can I change client configuration using your mailgun library?
I found this part of code:
void configureClient(Client client) {
//defaults to no-op
}
private Invocation.Builder request() {
Client client = JerseyClientBuilder.newClient();
configureClient(client);
return client
.register(configuration.httpAuthenticationFeature())
.target(configuration.apiUrl())
.path(configuration.domain())
.path("messages")
.request();
}
JerseyClientBuilder.newClient()
can take javax.ws.rs.core.Configuration
as argument, but method is private and I cannot override it. Method configureClient
is package-private like its class itself and I cannot extend MailForm
or MailMultipart
.
I need to do smth like this:
ClientConfig configuration = new ClientConfig();
configuration.property(ClientProperties.CONNECT_TIMEOUT, 10000);
configuration.property(ClientProperties.READ_TIMEOUT, 30000);
Client client = ClientBuilder.newClient(configuration);
Hi admin ,
i have consumed many hours to merge and implement this library , but no success.
i followed almost all documentation but still this warning is coming and no success.
Gradle :
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
implementation 'net.sargue:mailgun:1.9.0'
configurations { // its must require if you use "net.sargue:mailgun:1.9.0"
all*.exclude group: 'org.glassfish.hk2.external', module:'javax.inject'
}
Java Code :
private class HeavyTask extends AsyncTask<String, Void, Void> {
protected Void doInBackground(String... args) {
Configuration configuration = new Configuration()
.domain("somedomain.com")
.apiKey("key-685e54***********b18cc3c480da9b98***************")
.from("Test account", "[email protected]");
Mail.using(configuration)
.to("[email protected]")
.subject("This is the subject")
.text("Hello world!")
.build()
.send();
return null;
}
protected void onPostExecute(Void results) {
Toast.makeText(MainActivity.this, "Mail sent", Toast.LENGTH_SHORT).show();
}
}
WARNING IS :
01-23 13:07:22.699 30917-31016/com.bin.mailsender W/Errors: The following warnings have been detected: WARNING: HK2 service reification failed for [org.glassfish.jersey.message.internal.DataSourceProvider] with an exception:
MultiException stack 1 of 4
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/activation/DataSource;
at org.glassfish.hk2.utilities.cache.LRUHybridCache.compute(LRUHybridCache.java:315)
at org.glassfish.hk2.utilities.reflection.internal.ClassReflectionHelperImpl.getAllMethods(ClassReflectionHelperImpl.java:108)
at org.jvnet.hk2.internal.Utilities.findInitializerMethods(Utilities.java:1341)
at org.jvnet.hk2.internal.DefaultClassAnalyzer.getInitializerMethods(DefaultClassAnalyzer.java:107)
at org.glassfish.jersey.internal.inject.JerseyClassAnalyzer.getInitializerMethods(JerseyClassAnalyzer.java:242)
at org.jvnet.hk2.internal.Utilities.getInitMethods(Utilities.java:218)
at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:145)
at org.jvnet.hk2.internal.ClazzCreator.initialize(ClazzCreator.java:180)
at org.jvnet.hk2.internal.SystemDescriptor.internalReify(SystemDescriptor.java:740)
at org.jvnet.hk2.internal.SystemDescriptor.reify(SystemDescriptor.java:694)
at org.jvnet.hk2.internal.ServiceLocatorImpl.reifyDescriptor(ServiceLocatorImpl.java:461)
at org.jvnet.hk2.internal.ServiceLocatorImpl.narrow(ServiceLocatorImpl.java:2288)
at org.jvnet.hk2.internal.ServiceLocatorImpl.access$1200(ServiceLocatorImpl.java:125)
at org.jvnet.hk2.internal.ServiceLocatorImpl$9.compute(ServiceLocatorImpl.java:1373)
at org.jvnet.hk2.internal.ServiceLocatorImpl$9.compute(ServiceLocatorImpl.java:1368)
at org.glassfish.hk2.utilities.cache.internal.WeakCARCacheImpl.compute(WeakCARCacheImpl.java:116)
at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetAllServiceHandles(ServiceLocatorImpl.java:1430)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getAllServiceHandles(ServiceLocatorImpl.java:1355)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getAllServiceHandles(ServiceLocatorImpl.java:1344)
at org.glassfish.jersey.internal.inject.Providers.getServiceHandles(Providers.java:354)
at org.glassfish.jersey.internal.inject.Providers.getCustomProviders(Providers.java:201)
at org.glassfish.jersey.message.internal.MessageBodyFactory.(MessageBodyFactory.java:221)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
at org.glassfish.hk2.utilities.reflection.ReflectionHelper.makeMe(ReflectionHelper.java:1375)
at org.jvnet.hk2.internal.ClazzCreator.createMe(ClazzCreator.java:272)
at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:366)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:487)
at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:83)
at org.jvnet.hk2.internal.SingletonContext$1.compute(SingletonContext.java:71)
at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture$1.call(Cache.java:97)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.hk2.utilities.cache.Cache$OriginThreadAwareFuture.run(Cache.java:154)
at org.glassfish.hk2.utilities.cache.Cache.compute(Cache.java:199)
at org.jvnet.hk2.internal.SingletonContext.findOrCreate(SingletonContext.java:122)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2022)
at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:774)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getUnqualifiedService(ServiceLocatorImpl.java:786)
at org.jvnet.hk2.internal.IterableProviderImpl.get(IterableProviderImpl.java:111)
at org.glassfish.jersey.client.RequestProcessingInitializationStage.apply(RequestProcessingInitializationStage.java:97)
at org.glassfish.jersey.client.RequestProcessingInitializationStage.apply(RequestProcessingInitializationStage.java:67)
at org.glassfish.jersey.process.internal.Stages$LinkedStage.apply(Stages.java:308)
at org.glassfish.jersey.process.internal.Stage
01-23 13:07:23.363 30917-30940/com.bin.mailsender I/zygote64: Background concurrent copying GC freed 86937(5MB) AllocSpace objects, 152(7MB) LOS objects, 49% free, 15MB/31MB, paused 135us total 692.443ms
01-23 13:07:23.371 30917-30917/com.bin.mailsender I/Toast: Show toast from OpPackageName:com.bin.mailsender, PackageName:com.bin.mailsender
Plesae help me to sort out this issue
The HTTP client is not explicitly closed, leading to possible leaks. The JAX-RS ClientBuilder
is dynamically resolved, which in my case uses RestEasy instead of Jersey. In that case it uses a finalizer
to log a warning that the client wasn't closed, which is a requirement of the API. It would also be nice if these were pooled.
These issues makes it a little uncomfortable to use this SDK in a production with a reasonable email volume.
* Client is the main entry point to the fluent API used to build and execute client
* requests in order to consume responses returned.
* <p/>
* Clients are heavy-weight objects that manage the client-side communication
* infrastructure. Initialization as well as disposal of a {@code Client} instance
* may be a rather expensive operation. It is therefore advised to construct only
* a small number of {@code Client} instances in the application. Client instances
* must be {@link #close() properly closed} before being disposed to avoid leaking
* resources.
mailgun/src/main/java/net/sargue/mailgun/Mail.java
Lines 143 to 158 in abd667c
in Mail.java a new client is built with:
Client client = ClientBuilder.newClient();
Since MailMultipart depends specifically on Jersey features, it would be better to use:
Client client = JerseyClientBuilder.createClient();
This becomes an issue if you happen to have e.g. RESTEasy in classpath as well. Then you might end up in a situation where a RESTEasy client tries to register a Jersey specific multi part feature:
client.register(MultiPartFeature.class);
hello,
how i can get events like from this document
https://documentation.mailgun.com/api-events.html
so i just need to add some parameter like this
so if i need event that rejected OR failed with begin parameter i can catch them easy
According to maligun documentation, we can send the same message to several recipients.
https://documentation.mailgun.com/en/latest/user_manual.html#batch-sending
Is there a way we can leverage that in your library? It doesn't make sense to make N http calls for N clients.
May be the code already exists and I am not aware. But I couldn't locate it. Any help will be greatly appreciated.
I am using JDK21 with Spring Boot 3.2.1.
I have this Error:
java.lang.NoSuchMethodError: 'javax.ws.rs.client.Client org.glassfish.jersey.client.JerseyClientBuilder.newClient()'
Configuration config = new Configuration("xx.xxxxx.xx", "key-xxxxxxx4", "saikiran<[email protected]>");
Response res = Mail.using(config).to("[email protected]").subject("Testing Mail").text("Invoking Mail API from Java ").build().send();
System.out.println(res.responseMessage());
I'm running above code on stand alone Gradle Application, I've added all the jars, but still getting below Exception, could you guide me where I'm doing wrong.
Exception in thread "main" javax.ws.rs.ProcessingException: javax.ws.rs.core.Response$Status$Family.familyOf(I)Ljavax/ws/rs/core/Response$Status$Family;
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:261)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:684)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:681)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:681)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:437)
at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:343)
at net.sargue.mailgun.Mail.send(Mail.java:40)
at cloudseed.wishkarma.services.MailingService.sendMail(MailingService.java:40)
at cloudseed.wishkarma.app.ChatApp.main(ChatApp.java:59)
Caused by: java.lang.NoSuchMethodError: javax.ws.rs.core.Response$Status$Family.familyOf(I)Ljavax/ws/rs/core/Response$Status$Family;
at org.glassfish.jersey.message.internal.Statuses$StatusImpl.<init>(Statuses.java:63)
at org.glassfish.jersey.message.internal.Statuses$StatusImpl.<init>(Statuses.java:54)
at org.glassfish.jersey.message.internal.Statuses.from(Statuses.java:143)
at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:402)
at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:285)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:252)
... 12 more
Mailgun supports sending MIME messages calling /messages.mime instead of /messages. To build a Mail object, it should be just a matter of passing the MIME-formatted message to MailBuilder.text(), or if there is some handling that would break the format, then adding a new MailBuilder.mime(). Also in this case no subject is needed.
What do you think, worth considering?
Thanks for the good library!
Add this lines to gradle dependencies and configurations modules.
That is it. So after this steps you can use this library on android.
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'net.sargue:mailgun:1.3.2'
}
configurations {
compile.exclude group: 'javax.inject', module: 'javax.inject'
}
Following #33, I can see that there's no way to log the request send to mail gun.
This issue is about adding logging capability for troubleshooting without wireshark/charles proxy (and it's https...).
Hi Sargue,
I am able to send mail with a single attachment . But I don't know to add the multiple attachments.Please help with this.
Thanks in advance.
Hi,
I'm having problems to send my e-mails since the SSL update from mailgun. I've followed the instructions on this post at Stack overflow: https://stackoverflow.com/questions/48417338/during-post-request-on-send-email-api-of-mailgun-it-shows-error-using-java-web-a/48425037#48425037. But still having the same problem.
Thanks.
Hi @sargue,
I am importing a String
that is an HTML builded with thymeleaf, I'd like to send the email with HTML content, but not sure how I can do, I have tried to use Body.builder().p(myHtml)
, also tried .text(myHtml)
, I always end up with text.
How can I send the html myself?
I have used the Mailgun api ,net.sargue.mailgun
there is only provision of setting the APIKEY
Configuration configuration = new Configuration()
.domain("https://sgout-dv.allstate.com/sg/b2b/SMCE/AgencyEmail/SGE/")
.apiKey("bce4e20axxxxxxxxxxx27-b6183ad4-ae0c0de6");
I supposed to pass the "Authorization" Header along with above APIkey, but configuration is only limited to pass apikey.
Is there any way to pass the Headers.
Sergi, Firstly thank you for writing this first class wrapper. Well written and documented.
What would be the best way for me to debug a message I'm trying to send that has a response of 400? I am obviously providing some duff information somewhere. Is it possible to return what I am trying to post in some way? It is not complicated. In fact very much like your most simple example.
Dear creator,
I really appreciate your library, I use it in my projects since long ago
I've been wondering why I wasn't able to send mails, until I finally solved it
Please add a warning or example in configuration for EU mailgun API, as I'm sure I won't be the last one to find this issue. This can be a rather invisible issue, making you wonder what's wrong for a long time
.apiUrl("https://api.eu.mailgun.net/v3")
Thank you
Best regards
not set has errer?
I would like to ask you if the library supports mailgun templates?
Hi
Thank you very much for this library.
It seems that some (all?) of your dependencies are now compiled with java 8?
I have used your library for about 2 months, but suddenly i get this error:
java.lang.IllegalArgumentException: Class file is Java 8 but max supported is Java 7: javax/ws/rs/ApplicationPath.class in build/exploded-app/WEB-INF/lib/javax.ws.rs-api-2.1-m02.jar
To me it looks like gradle downloaded new "versions" of your dependencies and now they are compiled using java 8. I know this isn't an error in your library per se, but I don't know how to fix this. Do you?
Let me know if you need more info
Thank you in advance
I appreciate this is more than likely something I am doing as aposed to a bug with your system.
I am having difficulty sending emails with attachments. I am successfully sending the email but the attachment does not come thorugh.
MailBuilder builder = new MailBuilder(this.configuration);
builder.from((!from.isEmpty() ? from : Settings.Retrieve("MAILGUN_FROM_NAME") + " <" + Settings.Retrieve("MAILGUN_FROM_ADDRESS") + ">"));
builder.to(to);
if(!cc.isEmpty()) {
builder.cc(cc);
}
if(!bcc.isEmpty()) {
builder.bcc(bcc);
}
builder.subject(subject);
builder.html(html);
if (!files.isEmpty()) {
String[] attachedFiles = files.split(",");
for (String file: attachedFiles) {
URL url = new URL(file);
String tDir = System.getProperty("java.io.tmpdir");
String path = tDir + "tmp" + ".txt";
File newFile = new File(path);
FileUtils.copyURLToFile(url, newFile);
builder.multipart().attachment(newFile);
newFile.deleteOnExit();
}
}
builder.build().send();
Here is an example of my code. I am moderately new to Java so may have done something completely incorrect. The attachment is an external URL.
I receive no errors when debugging.
Any help would be greatly appreciated.
Thanks,
Jamie
Code snippet
log.info("Sending info to email...");
Configuration config = new Configuration()
.domain(env.getProperty("mailgun.domain"))
.apiKey(env.getProperty("mailgun.apiKey"))
.from(request.getSender());
Mail
.using(config)
.to(request.getEmail())
.subject(request.getSubject())
.template(request.getTemplate())
.build()
.send();
Error
java.lang.NoSuchMethodError: 'void javax.ws.rs.core.MultivaluedMap.addAll(java.lang.Object, java.util.List)'
at net.sargue.mailgun.MailForm.prepareSend(MailForm.java:42) ~[mailgun-1.10.0.jar:na]
at net.sargue.mailgun.Mail.send(Mail.java:69) ~[mailgun-1.10.0.jar:na]
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dost1services</artifactId>
<groupId>ph.gov.dost.region1</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<groupId>io.ryan</groupId>
<artifactId>notification</artifactId>
<dependencies>
<dependency>
<groupId>io.ryan</groupId>
<artifactId>clients</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.ryan</groupId>
<artifactId>amqp</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>net.sargue</groupId>
<artifactId>mailgun</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.210</version>
<scope>test</scope>
</dependency>
</dependencies>
when i upgrade project to spring boot 3, there is an error which realated with mailgun configuration,
Caused by: java.lang.ClassNotFoundException: javax.ws.rs.core.MultivaluedMap
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
... 56 common frames omitted
Spring boot 3 change javax. to jakarta. package, does anyone have a solution ?
hello,
can i add header on email? if yes, how to add?
thankyou
Whenever I sent emails using this library, my email client showed that I was sending emails "on behalf of" someone else.
[email protected] on behalf of John Smith <[email protected]>
To fix this, I had to add a sender parameter
Mail.using(configuration).parameter("h:sender", "John Smith <[email protected]>)
It would be nice if there was a Java method call in the Configuration builder instead of this.
I am using Glassfish 4.0 with Java 8.x and JEE 7.0. I get the following exception when I try to build and create a war file.
Exception:
remote failure: Error occurred during deployment: Exception while loading the app :
CDI deployment failure:WELD-001408 Unsatisfied dependencies for type [Providers] with qualifiers [@Default] at injection point [[BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedConstructor] @Inject public org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide(@Context Providers, Provider<CloseableService>)]. Please see server.log for more details.
Command deploy failed.
Here is my POM.xml
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.25</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>2.25</version>
</dependency>
<dependency>
<groupId>net.sargue</groupId>
<artifactId>mailgun</artifactId>
<version>1.5.0</version>
</dependency>
I would appreciate any help. Thanks in advance.
Was looking to try this out but the 1.1.0 is not available via standard maven repositories:
<dependency>
<groupId>net.sargue</groupId>
<artifactId>mailgun</artifactId>
<version>1.1.0</version>
</dependency>
1.0.0
is, but it seems like a lot changed between these two versions.
I create new repo to run this libs.
Spring Boot 2.4.4 version
JDK 11
It show error as follow:
Here is my controller
@GetMapping("/sendMailGun2")
public void sendEmail() {
Configuration configuration = new Configuration()
.domain("example.org")
.apiKey(apiKeyStr)
.from("Test MailGun Lib", "[email protected]");
Mail.using(configuration)
.to("[email protected]")
.subject(subjectStr)
.text(textStr)
.build()
.send();
}
Error:
2021-04-08 16:47:05.617 ERROR 11322 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: InjectionManagerFactory not found.] with root cause
java.lang.IllegalStateException: InjectionManagerFactory not found.
at org.glassfish.jersey.internal.inject.Injections.lambda$lookupInjectionManagerFactory$0(Injections.java:74) ~[jersey-common-2.32.jar:na]
at org.glassfish.jersey.internal.inject.Injections$$Lambda$1023/000000000000000000.get(Unknown Source) ~[na:na]
at java.base/java.util.Optional.orElseThrow(Optional.java:408) ~[na:na]
at org.glassfish.jersey.internal.inject.Injections.lookupInjectionManagerFactory(Injections.java:74) ~[jersey-common-2.32.jar:na]
at org.glassfish.jersey.internal.inject.Injections.createInjectionManager(Injections.java:44) ~[jersey-common-2.32.jar:na]
at org.glassfish.jersey.client.ClientConfig$State.initRuntime(ClientConfig.java:412) ~[jersey-client-2.32.jar:na]
at org.glassfish.jersey.client.ClientConfig$State$$Lambda$1005/000000000000000000.get(Unknown Source) ~[na:na]
at org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:317) ~[jersey-common-2.32.jar:na]
at org.glassfish.jersey.client.ClientConfig.getRuntime(ClientConfig.java:814) ~[jersey-client-2.32.jar:na]
at org.glassfish.jersey.client.ClientRequest.getClientRuntime(ClientRequest.java:219) ~[jersey-client-2.32.jar:na]
at org.glassfish.jersey.client.ClientRequest.getInjectionManager(ClientRequest.java:610) ~[jersey-client-2.32.jar:na]
at org.glassfish.jersey.client.JerseyWebTarget.onBuilder(JerseyWebTarget.java:364) ~[jersey-client-2.32.jar:na]
at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:192) ~[jersey-client-2.32.jar:na]
at org.glassfish.jersey.client.JerseyWebTarget.request(JerseyWebTarget.java:36) ~[jersey-client-2.32.jar:na]
at net.sargue.mailgun.Mail.request(Mail.java:138) ~[mailgun-1.10.0.jar:na]
at net.sargue.mailgun.Mail.send(Mail.java:70) ~[mailgun-1.10.0.jar:na]
at com.hendisantika.springbootexportimportexcelpoi.controller.MailGunController.sendEmail(MailGunController.java:122) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.5.jar:5.3.5]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.5.jar:5.3.5]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.5.jar:5.3.5]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.5.jar:5.3.5]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.5.jar:5.3.5]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.5.jar:5.3.5]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.5.jar:5.3.5]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.5.jar:5.3.5]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.5.jar:5.3.5]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.5.jar:5.3.5]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.44.jar:4.0.FR]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.5.jar:5.3.5]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.44.jar:4.0.FR]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.44.jar:9.0.44]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.5.jar:5.3.5]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.5.jar:5.3.5]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.5.jar:5.3.5]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.5.jar:5.3.5]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.5.jar:5.3.5]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.5.jar:5.3.5]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.44.jar:9.0.44]
at java.base/java.lang.Thread.run(Thread.java:836) ~[na:na]
Any advice?
Thanks
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.