GithubHelp home page GithubHelp logo

wpexpertsio / post-smtp Goto Github PK

View Code? Open in Web Editor NEW
53.0 12.0 27.0 15.1 MB

Next generation SMTP mailer plugin for WordPress. Trusted by over 300,000 sites by WPExperts.io

Home Page: https://wordpress.org/plugins/post-smtp/

PHP 96.86% JavaScript 2.41% CSS 0.70% Batchfile 0.01% Shell 0.01% HTML 0.03%
smtp wordpress gmail-api sendgrid-api mailgun-api email woocommerce email-deliverability emails sendinblue

post-smtp's People

Contributors

evrpress avatar furqanfazal1 avatar jsilvermist avatar nielsdeblaauw avatar smusman98 avatar smusmanobjects avatar syedaliobjects avatar uzair-ahmed29 avatar uzairahmed29 avatar wpexpertsio avatar yehudah avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

post-smtp's Issues

develop here on GitHub

Hi @yehudah

I would love to help you with the plugin (I sent you a mail already).
If you add the latest code to the repo I could start coding and sending you PRs to show you what I have in mind.

Cheers,
Chris

Add callback for Mailgun

This is an Enhancement suggestion.
This relates to use of Post SMTP with Mailgun, but might be just as applicable to other mail service provides/systems.

It would be great if the Post SMTP logs pulled through the actual result from Mailgrid. I've never had an issue with Post SMTP logging that a message failed to send, as it always makes it through to the Mailgrid SMTP server. But after that, it's not uncommon for Mailgrid to fail to deliver the message, typically due to their IP addresses being blacklisted.

Mailgrid offer a callback feature, to report the status of a message. Perhaps their API also has something similar (I don't know).

It would be great if Post SMTP made use of the Mailgrid callback, to provide true logging of the end result of each message that was sent... as in what eventually happened to the message. Was it delivered? Did it have a permanent fail, etc.

Fork is approved!?

Heya,

The readme still says "Until this fork will be approved by the plugins team, we have this fork.", but checking out https://wordpress.org/plugins/post-smtp/ I guess it has been approved in the meantime?

Also the readme here states version 1.7.10 on WP.org it is version 1.8.9. Is this repo outdated?

Thank you for your hard work!

1.9.8 Breaks Slack Notifications

This is a cross post of this ongoing issue on WordPress.org:

https://wordpress.org/support/topic/call-to-undefined-method-postmanoptionsgetslacktoken/

Since 1.9.8 at least, when the Slack Notification feature is enabled, this triggers a fatal error when SMTP fails and the plugin attempts to notify Slack:

An error of type E_ERROR was caused in line 11 of the file /home4/airrudd/public_html/wp-content/plugins/post-smtp/Postman/Extensions/Core/Notifications/PostmanSlackNotify.php. Error message: Uncaught Error: Call to undefined method PostmanOptions::getSlackToken() in /home4/airrudd/public_html/wp-content/plugins/post-smtp/Postman/Extensions/Core/Notifications/PostmanSlackNotify.php:11
Stack trace:
#0 /home4/airrudd/public_html/wp-content/plugins/post-smtp/Postman/Extensions/Core/Notifications/PostmanNotify.php(209): PostmanSlackNotify->send_message(‘You getting thi…’, Object(PostmanEmailLog))
#1 /home4/airrudd/public_html/wp-includes/class-wp-hook.php(288): PostmanNotify->notify(Object(PostmanEmailLog), Object(PostmanMessage), ‘220-cloud189.ho…’, Object(PostmanSmtpModuleTransport), ‘No recipient fo…’)
#2 /home4/airrudd/public_html/wp-includes/class-wp-hook.php(312): WP_Hook->apply_filters(”, Array)
#3 /home4/airrudd/public_html/wp-includes/plugin.php(478): WP_Hook->do_action(Array)
#4 /home4/airrudd/public_html/wp-content/plugins/post-smtp/Postman/PostmanWpMail.php(276): do_action(‘post_smtp_on_fa…’, Object(PostmanEmailLog), Object(PostmanMessage), ‘220-cloud189.ho…’, Object(PostmanSmtp)

Autoloading

autoloading should result in a smaller footprint. Could be an improvement for the future.

Notification: Slack as webhook

If you use slack in the free version you have a limit for the "Slack Apps" you can register to your organization.

I would like to add a 4th notification option: Slack via Webhook

The webhook app needs to be activated once for the org and can receive simple notifications from multiple external services.

Remove .idea folder

could you please remove the .idea folder? I also use phpstorm and if the folder is in the git repo I constantly have uncommitted changes!
@yehudah

[Feature Request] Please support pre_wp_mail filter.

I would like to interact with mail sending process using pre_wp_mail, but your wp_mail is not applying the filter. Would you be so kind and do something similar to vanilla wp_mail. Thx!

                /**
		 * Filters whether to preempt sending an email.
		 *
		 * Returning a non-null value will short-circuit {@see wp_mail()}, returning
		 * that value instead. A boolean return value should be used to indicate whether
		 * the email was successfully sent.
		 *
		 * @since 5.7.0
		 *
		 * @param null|bool $return Short-circuit return value.
		 * @param array     $atts {
		 *     Array of the `wp_mail()` arguments.
		 *
		 *     @type string|string[] $to          Array or comma-separated list of email addresses to send message.
		 *     @type string          $subject     Email subject.
		 *     @type string          $message     Message contents.
		 *     @type string|string[] $headers     Additional headers.
		 *     @type string|string[] $attachments Paths to files to attach.
		 * }
		 */
		$pre_wp_mail = apply_filters( 'pre_wp_mail', null, $atts );

		if ( null !== $pre_wp_mail ) {
			return $pre_wp_mail;
		}

WARNING: Version 2.4.4

I just tried this version and it has the ISSUE with sending a malformed email that is completely unreadable. Do not use this version if you want your mail to be read correctly on the other side.

Grammar change on postmansmtp.com

Great work taking over the plugin @yehudah .
The users thank you!

Just a small grammar change recommendation for the home page

Unfortunately the plugin didn't maintained properly for two years but still doing a great job.

Unfortunately the plugin wasn't maintained properly for two years however it was still doing a great job.

Have a great day.

Mail-Log default to off

I know that the logger is a big plus of the plugin but I believe that most people never use it.
Also there might be privacy concerns. You are logging/saving stuff that can be privacy sensitive and it sits there when a leak is happening. Maybe the user is not aware because he never activated it himself.

So I would suggest deactivating it on default.

Multisite behaviour

Many thanks for taking up and continuing the development of this very useful plugin, Yehudah! I have adopted the plugin for a few sites (all running in multisite mode) I run due to the bug in the default WP wp_mail function which (for some reason) duplicates the MIMEMAIL header in all outgoing emails which results in all messages sent to be rejected by Amazon's Simple Email Service (SES) which we use.
The only problem I've discovered with Post-SMTP is that it doesn't seem to work nicely with multisite configurations... Ideally, it'd be great if the plugin could a) sense that it's been installed on a multisite implementation and b) allow for a "default" network configuration which would apply to all sites that don't have specific individual configurations. At present, it seems to fall back to wp_mail (i.e. failing outgoing email) for any subsites which don't have a configuration... not helpful behaviour for my use case.

Move external libraries from repository to composer

First the easy ones. Some seem to have been edited, so it is necessary to check out if these edits break anything.

  • sendgrid/sendgrid (^6.0)
  • mailgun/mailgun-php (^2.3)
  • google/apiclient (^2.0)

the mandrill-api-php library is probably harder, as it is on bitbucket and hasn't been maintained since 2015.

The Zend-1.12.10dependency is weird, but probably also isn't trivial to replace.

Typo in PostmanViewController

Small typo in /Postman/PostmanViewController.php line 226

__( 'Check the detailes here', 'post-smtp')

Should be

__( 'Check the details here', 'post-smtp')

Ajax Error

Hi! On our webshop we get "Ajax Error" with no description or any error logs indicating whats wrong. I had to rollback to version 2.1.10 in order to fix it, i also tried to update php from 7.4 to 8.0 and 8.1 with no better luck (stayed on 8.0 for now). Is there any way i can check even more what issues i run in to.

The server is running Nginx 2.2, PHP 8.0 and either log file shows any errors, i also tried WP_DEBUG but error log is empty there as well after sending test email that receives Ajax Error.

Support multiple headers with same key

Hello,

Headers with same key declared as this for example :

    $headers[] =    'X-Mailgun-Tag: mh_category_account';
    $headers[] =    'X-Mailgun-Tag: mh_account_reset_password';

Are merged and results in only the last tag "mh_account_reset_password" to be send to mailgun. This is the official and only way to add multiples mailgun tag to a mail using mailgun.

Is there a way to add the same header multiple times with different values?

The RFC allows for duplicate optional-field headers, which means any header name other than then ones specified by the RFC.

Ajax Error Sending Test Email

Hi,

I'm having issues with this plugin, I've been asked by Bluehost to reach out with my issue. they have provided me with a config update that needs to updated by the plugin provider, I'm not sure how true this but any help from the developer would be appreciated.

I'm new to git hub so apologies for the noob post.

additionally, I would be happy to make a donation if this issue can be resolved.

Cheers

Sean

Adding embedded image.

Hey,

I need to add an embedded image into the email, but I can't get a hold of the class "PostmanMessage" to use the function addEmbeddedImage.

How do I manipulate the instance of the class before the mail gets send?

The only actions I see in your plugin are the ones for "failed smtp, succes and wp_mail_fail".

Could you please give me a head with this?

Invalid and or bounced email addresses

Scenario..a user inputs an incorrect email or fat fingers their email address. How can we capture and trap these invalid emails so that we can contact the user to enter the correct email address or correct it for them. Perhaps adding a field to forward all bounced emails to the email address in that filed. Scenario, a user is purchasing an item and goes through the quick checkout which requires that they enter an email address. They do so but they type the wrong letter or so. POSTMAN returns an invalid email address and that's it versus letting the application admin know that there is a bounced/invalid email that needs to be corrected. In this case the user will call the customer using the number on file or in certain cases, they can correct such addresses

Dismiss admin notice 'Postman is not configured and is mimicking out-of-the-box WordPress email delivery'

There should be a way to dismiss or disable the global admin notice that displays when Postman is not configured.

Dashboard:
2019-03-20 at 9 42 AM
Posts:
2019-03-20 at 9 43 AM
etc... etc... etc...

Post SMTP is amazing and we use it on nearly every site we build. However, many of those sites have no need for a transaction email service. We still use Post SMTP on them because it's logging ability is incredibly helpful in troubleshooting when things go wrong.

There should either be an standard "dismiss" button on this admin notice (preferred), or
There should be a setting on the settings page to permanently hide it, or
It could just hide itself if the setup screen had been completed and saved with the option of 'default'.

UI + UX improvements

I would love to send you PRs to improve on the UI and UX.
Before I start give me some feedback on these items!

  • move settings to "Settings > SMTP"

  • Replicate Core Styling for admin pages: tabbed layout (like on site-info.php)

Consider using 'phpmailer_init' hook.

Hello @yehudah !

I'm working on a mail logger/archiver (MailArchiver) which, obviously, use wp_mail, wp_mail_failed to catch emails and archive them.
The next version of this archiver plugin will try to use phpmailer_init to obtain more detailed information about the sent mail. But, in reading your code, I see you've commented the action call in the PostmanWpMail class...
I was wondering for what reason you've done this and if there's a chance you can reconsider it...

Thanks in advance for your time - and for this great plugin I use on all my sites ;)

Correct language in Notifications

Notifications read as follows

"You getting this message..."

Please update language to read correctly.

"You are getting this message..."

Postman > Extensions > Core > Notifications > PostmanNotify.php
line 186

Block outgoing email when not from whitelisted domain

Most of us have some kind of MailCatcher running on our local development boxes. Some staging environments have something similar.

All of these prevent SMTP email from being sent, but API connections to services like SendGrid often bypass those email blocks.

It would be ideal if Post SMTP had a simple setting:
Only send email from this domain: domain.com

Then if/when a site was copied to domain.test or domain.local, or domain.dev.cc, or domaindev.com, domain.staging.wpengine.com or whatever... Post SMTP would know to log the email, but not to actually process it for sending though SMTP or APIs.

PHP Notice: Use of undefined constant d

Hi,

Just a small one that got into the version published on the repo:

PHP Notice: Use of undefined constant d - assumed 'd' in /postman-smtp/Postman/Postman-Mail/PostmanMyMailConnector.php on line 212

Thanks

Michael

Reconsider use of 'wp_localize_string'

There a lot of calls like this in the code:

wp_localize_script( PostmanViewController::POSTMAN_SCRIPT, 'postman_input_basic_password', '#input_' . PostmanOptions::BASIC_AUTH_PASSWORD );

The third argument should be an array, but the bigger problem is this feels like abuse of the localize function to do something the script should do itself.

Development Workflow

Let's make this plugin the de-facto standard for SMTP in WordPress

I suggest development in the open. I am committed to invest at least 3 hours per week in Post-SMTP!

To streamline this repo a few things need to be restructured:

  • master branch with a stable version

  • add a develop branch with the unstable code for testing

Release workflow for wp.org

  1. merge develop -> master

  2. tag a release

  3. automatic deployment to wp.org (via a deployer service; maybe https://deployer.seravo.com/ but it has some problems at the moment)

Dashboard Widget ID

Hello Yehuda,

I love this plugin and have been using it happily for multiple years.

I noticed that the WP Dashboard meta box has the id example_dashboard_widget which I'm guessing is from some example code that was added. This should be something unique to Post SMTP in order to avoid conflicts and allow precise removal from the dashboard when desired. Suggesting something like postsmtp_dashboard_widget.

Here are the two instances I see where this shows up:

https://github.com/yehudah/Post-SMTP/blob/ca1c75fa508b703971022eeef01869d7f89b7064/Postman/Postman-Controller/PostmanDashboardWidgetController.php#L57

https://github.com/yehudah/Post-SMTP/blob/ca1c75fa508b703971022eeef01869d7f89b7064/Postman/Postman-Controller/PostmanDashboardWidgetController.php#L70

Let me know if you'd like me to file this somewhere else. :)

Thanks again!

Consider automating deploys to WordPress from Github Actions

Let's see if we can automate publishing tags to the WordPress plugin repository. It's fairly simple using GitHub actions and a preset action like 10-up's plugin deployment.

Automating this step would allow us to add build steps and quality control. This allows issues like #26 and #16, and makes it possible to add tools like wpcs.

I have some experience implementing GH Actions, and would love to help work this out. What do you think @yehudah?

Is Post-SMTP no longer open source?

I noticed the latest version (released today) is 2.0.17, but the latest release here is v1.9.8. and nothing has been committed in a couple of years. What's going on?

Missing PostmanMandrillTransport::PROTOCOL

Report from Psalm:

ERROR: UndefinedConstant - Postman/Postman-Mail/PostmanMandrillTransport.php:84:10 - Constant PostmanMandrillTransport::PROTOCOL is not defined
                return self::PROTOCOL;

Replace split() with preg_split() for PHP 7

Hello,

I ran a PHP Compatibility Checker (https://wordpress.org/plugins/php-compatibility-checker/) to check for PHP 7 compatibility. It is listing a couple errors related to Post SMTP. Both are about the use of split instead of preg_split.

On /Postman/Postman-Connectivity-Test/registered-domain-libs-master/generateEffectiveTLDs.php:

Line 153: Replace $lines = split("\n", $list); with $lines = preg_split("\n", $list);

Line 179: Replace $tldParts = split('.', $line); with $tldParts = preg_split('.', $line);

Thanks,

@awijasa

PHP 8 causes emails to arrive showing HTML source

Hi, I've noticed this on a few sites recently, if we upgrade to PHP 8, the emails are received as HTML code, rather than HTML format.

image

Rolling back to PHP 7.4 immediately resolves the issue

Various WP versions.
Various Post-SMTP versions too.

The current one I noticed is WP 5.8 & Post-SMTP 2.0.23 (with emails coming from Gravity Forms)

Records per page does not persist on pagination for email log

Steps to reproduce
Go the the email log

  1. Set "records per page" to 50
  2. Click "Filter/Search"
    At this point you'll see the email log split into 50 items per page, this is good.
  3. Click next page

2019-03-20 at 9 49 AM

At this point you'll see the email log reverted back to 10 items per page, this is bad.

2019-03-20 at 9 50 AM

Pagination should respect the "Records per page" setting.

The provided authorization grant is invalid, expired, or revoked

Hi, I keep getting the error message when sending a test email. Here are the diagnostics:
Hope you can assist.
Thanks

Mailer: postsmtp
HostName: fastertaptics.com
cURL Version: 7.62.0
OpenSSL Version: OpenSSL/1.1.1
OS: Linux h259 4.19.1 #2 SMP Mon Nov 5 00:50:39 CET 2018 x86_64
PHP: Linux 7.2.10 C
PHP Dependencies: iconv=Yes, spl_autoload=Yes, openssl=Yes, sockets=No, allow_url_fopen=Yes, mcrypt=Yes, zlib_encode=Yes
WordPress: 5.2.1 en_US UTF-8
WordPress Theme: Clean Commerce
WordPress Plugins: All In One SEO Pack, Classic Editor, Post SMTP
WordPress wp_mail Owner: /var/www/volumes/xvdf/vhosts/fastertaptics.com/httpdocs/wp-content/plugins/post-smtp/Postman/PostmanWpMailBinder.php
WordPress wp_mail Filter(s): wp_staticize_emoji_for_email
Postman: 2.0.2
Postman Sender Domain (Envelope|Message): fastertaptics.com | fastertaptics.com
Postman Prevent Message Sender Override (Email|Name): Yes | Yes
Postman Active Transport: SendGrid API (https://api.sendgrid.com:443)
Postman Active Transport Status (Ready|Connected): Yes | Yes
Postman Deliveries (Success|Fail): 2 | 0

### Here follows the session transcript
The provided authorization grant is invalid, expired, or revoked

--Raw message follows--

SendGrid\Mail\Mail Object
(
[from:SendGrid\Mail\Mail:private] => SendGrid\Mail\From Object
(
[name:SendGrid\Mail\EmailAddress:private] => Rafael
[email:SendGrid\Mail\EmailAddress:private] => [email protected]
[substitutions:SendGrid\Mail\EmailAddress:private] =>
[subject:SendGrid\Mail\EmailAddress:private] =>
)

[subject:SendGrid\Mail\Mail:private] => SendGrid\Mail\Subject Object
    (
        [subject:SendGrid\Mail\Subject:private] => Postman SMTP Test (fastertaptics.com)
    )

[contents:SendGrid\Mail\Mail:private] => Array
    (
        [0] => SendGrid\Mail\Content Object
            (
                [type:SendGrid\Mail\Content:private] => text/plain
                [value:SendGrid\Mail\Content:private] => Hello!

Sent by Postman 2.0.2 - https://wordpress.org/plugins/post-smtp/

            )

        [1] => SendGrid\Mail\Content Object
            (
                [type:SendGrid\Mail\Content:private] => text/html
                [value:SendGrid\Mail\Content:private] => <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<style type="text/css" media="all"> .wporg-notification .im { color: #888; } /* undo a GMail-inserted style */ </style>
Hello! - 你好 - Bonjour! - नमस्ते - ¡Hola! - Olá - Привет! - 今日は

Image source: poofytoo.com - Used with permission
)
    )

[attachments:SendGrid\Mail\Mail:private] => 
[template_id:SendGrid\Mail\Mail:private] => 
[sections:SendGrid\Mail\Mail:private] => 
[headers:SendGrid\Mail\Mail:private] => 
[categories:SendGrid\Mail\Mail:private] => 
[custom_args:SendGrid\Mail\Mail:private] => 
[substitutions:SendGrid\Mail\Mail:private] => 
[send_at:SendGrid\Mail\Mail:private] => 
[batch_id:SendGrid\Mail\Mail:private] => 
[asm:SendGrid\Mail\Mail:private] => 
[ip_pool_name:SendGrid\Mail\Mail:private] => 
[mail_settings:SendGrid\Mail\Mail:private] => 
[tracking_settings:SendGrid\Mail\Mail:private] => 
[reply_to:SendGrid\Mail\Mail:private] => SendGrid\Mail\ReplyTo Object
    (
        [name:SendGrid\Mail\EmailAddress:private] => 
        [email:SendGrid\Mail\EmailAddress:private] => [email protected]
        [substitutions:SendGrid\Mail\EmailAddress:private] => 
        [subject:SendGrid\Mail\EmailAddress:private] => 
    )

[personalization:SendGrid\Mail\Mail:private] => Array
    (
        [0] => SendGrid\Mail\Personalization Object
            (
                [tos:SendGrid\Mail\Personalization:private] => Array
                    (
                        [0] => SendGrid\Mail\To Object
                            (
                                [name:SendGrid\Mail\EmailAddress:private] => 
                                [email:SendGrid\Mail\EmailAddress:private] => [email protected]
                                [substitutions:SendGrid\Mail\EmailAddress:private] => 
                                [subject:SendGrid\Mail\EmailAddress:private] => 
                            )

                        [1] => SendGrid\Mail\To Object
                            (
                                [name:SendGrid\Mail\EmailAddress:private] => 
                                [email:SendGrid\Mail\EmailAddress:private] => [email protected]
                                [substitutions:SendGrid\Mail\EmailAddress:private] => 
                                [subject:SendGrid\Mail\EmailAddress:private] => 
                            )

                    )

                [ccs:SendGrid\Mail\Personalization:private] => 
                [bccs:SendGrid\Mail\Personalization:private] => 
                [subject:SendGrid\Mail\Personalization:private] => 
                [headers:SendGrid\Mail\Personalization:private] => Array
                    (
                        [X-Mailer] => Postman SMTP 2.0.2 for WordPress (https://wordpress.org/plugins/post-smtp/)
                        [message-id] => [email protected]
                    )

                [substitutions:SendGrid\Mail\Personalization:private] => 
                [dynamic_template_data:SendGrid\Mail\Personalization:private] => 
                [has_dynamic_template:SendGrid\Mail\Personalization:private] => 
                [custom_args:SendGrid\Mail\Personalization:private] => 
                [send_at:SendGrid\Mail\Personalization:private] => 
            )

    )

)

"Security" setting reverts to `None`

I set up a site a few weeks ago (I suspect pre 1.9.x version of Post-SMTP).
Settings: SMTP on Port 25 + STARTTLS.

Today I realize mails can not be delivered because the setting "Security" reverted to None. Server refuses connection because of that.
It was not possible to save a change back to STARTTLS.

That's bad. Even the Connectivity Test shows for Port 25 support for STARTTLS.
The addition to 1.9 concerning encryption detection might be buggy.

Unknown method 'PostmanOptions::getMessageNameEmail'

This is probably a typo and should be getMessageSenderName.

Psalm analysis below:

UndefinedMethod - Postman/PostmanOptions.php:607:18 - Method PostmanOptions::getmessagenameemail does not exist
                        return $this->getMessageNameEmail();

Request: View rendered email instead of html codes in email log

Hi,

Thank you for maintaining this excellent plugin!

Would it be possible to make changes to view rendered email instead of html codes in email log?

Earlier conversation here: https://wordpress.org/support/topic/how-do-i-view-rendered-email-instead-of-html-codes-in-email-log/

Currently I have modified the plugin locally as follows:

Change the below in Postman/Postman-Email-Log/PostmanEmailLogController.php lines 230-232:
//			print '<pre>';
//			print esc_html ( $post->post_content );
				print ( $post->post_content );
//			print '</pre>';

Thanks.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.