mettle / sendportal-core Goto Github PK
View Code? Open in Web Editor NEWCore functionality for SendPortal
Home Page: https://sendportal.io
License: MIT License
Core functionality for SendPortal
Home Page: https://sendportal.io
License: MIT License
I get this error when try to use the package.
Environment - php8.1, Larevel 8.75
Error:
Problem 1
- mettle/sendportal-core[v2.0.2, ..., v2.0.3] require kriswallsmith/buzz ^1.2 -> satisfiable by kriswallsmith/buzz[1.2.0].
- mettle/sendportal-core[v2.0.0, ..., v2.0.1] require php ^7.3 -> your php version (8.1.0) does not satisfy that requirement.
- kriswallsmith/buzz 1.2.0 requires symfony/options-resolver ^3.4 || ^4.0 || ^5.0 -> found symfony/options-resolver[v3.4.0-BETA1, ..., 3.4.x-dev, v4.0.0-BETA1, ..., 4.4.x-dev, v5.0.0-BETA1, ..., 5.4.x-dev] but the package is fixed to v6.0.0 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
- Root composer.json requires mettle/sendportal-core ^2.0 -> satisfiable by mettle/sendportal-core[v2.0.0, v2.0.1, v2.0.2, v2.0.3].
Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
As Sendportal is a modern open-source self-hosted email marketing tool, it would feel naturaual to not load assets from CDNS as those would ping pack the IP and the URL of the instance to third party Organsiations and other 7-reasons-not-to-use-a-cdn add to such the opinion / motivation to do so.
A individual that evaluates sendportal for the implementation would (possibly) be grateful to have the option 'out of box' to control asset loading.
Would you and the community be interested in a PR that handles the third-party js and css assets to be self hosted?
package.json
{
"private": true,
"scripts": {
"dev": "npm run development",
"development": "mix",
"watch": "mix watch",
"watch-poll": "mix watch -- --watch-options-poll=1000",
"hot": "mix watch --hot",
"prod": "npm run production",
"production": "mix --production"
},
"devDependencies": {
"axios": "^0.21",
"@fortawesome/fontawesome-free": "^5.13.0",
"bootstrap": "^4.4.1",
"jquery": "^3.2",
"laravel-mix": "^6.0.6",
"popper.js": "^1.16",
"postcss": "^8.2.13",
"resolve-url-loader": "^3.1.2",
"sass": "^1.15.2",
"sass-loader": "^8.0.0",
"@fontsource/nunito": "^4.2.2",
"chart.js": "^2.9.3"
},
"dependencies": {}
}
webpack.mix.js
const mix = require('laravel-mix');
/*
|--------------------------------------------------------------------------
| Mix Asset Management
|--------------------------------------------------------------------------
|
| Mix provides a clean, fluent API for defining some Webpack build steps
| for your Laravel application. By default, we are compiling the Sass
| file for the application as well as bundling up all the JS files.
|
*/
mix.js('resources/js/app.js', 'public/js')
.extract(['jquery', 'bootstrap', 'popper.js']);
mix.copy('node_modules/chart.js/dist/Chart.js', 'public/js/chart.js');
mix.sass('resources/sass/app.scss', 'public/css');
app.scss
// Fonts
// Fontawesome
@import '~@fortawesome/fontawesome-free/scss/fontawesome';
@import '~@fortawesome/fontawesome-free/scss/regular';
@import '~@fortawesome/fontawesome-free/scss/solid';
@import '~@fortawesome/fontawesome-free/scss/brands';
// Nunito Font
@import "~@fontsource/nunito/latin-300.css";
@import "~@fontsource/nunito/latin-300-italic.css";
@import "~@fontsource/nunito/latin-400.css";
@import "~@fontsource/nunito/latin-400-italic.css";
@import "~@fontsource/nunito/latin-600.css";
@import "~@fontsource/nunito/latin-600-italic.css";
@import "~@fontsource/nunito/latin-700.css";
@import "~@fontsource/nunito/latin-700-italic.css";
// Variables
@import 'variables';
@import 'utilities.scss';
@import 'typography.scss';
@import 'borders';
@import 'forms.scss';
@import 'buttons.scss';
@import 'pages.scss';
@import 'modals.scss';
@import 'tables.scss';
// Bootstrap
@import '~bootstrap/scss/bootstrap';
(...)
blade.php
<!---css-->
<link href="{{ asset(mix('css/app.css')) }}" rel="stylesheet">
<!--js-->
<script src="{{asset(mix('js/manifest.js'))}}"></script>
<script src="{{asset(mix('js/vendor.js'))}}"></script>
<script src="{{asset(mix('js/app.js'))}}"></script>
<!--chartjs only where needed (e.g. dasboard) -->
@push('js')
<script src="{{asset(mix('js/chart.js'))}}"></script>
(...)
@endpush
Many hosting providers and SMTP servers limit the number of emails to be sent per hour, day. Can you add a setting for SMTP servers so as not to exceed the limit?
Thank you for your hard work on this product
We have set up various workspaces with us.
The sub/unsubscriber and webview links are always linked to the hostname.
The goal would be to be able to point different URLs to the same instance and adjust the webview link accordingly.
Actual:
Host | Pointed to | Workspace | Webview Link |
---|---|---|---|
host1.com | host1.com | WS 1 | host1.com/webview/.... |
host2.com | host1.com | WS 2 | host1.com/webview/.... |
Goal:
Host | Pointed to | Workspace | Webview Link |
---|---|---|---|
host1.com | host1.com | WS 1 | host1.com/webview/.... |
host2.com | host1.com | WS 2 | host2.com/webview/.... |
Or is this already possible?
thanks a lot
ruvus11
Can u make the laravel 9 support.
I am trying to run the package in a multi-tenant environment using Tenancy for Laravel. The task that is added to the scheduler is not aware of this, as it has no context.
As such, when the cron job fires, it does not do anything. Both of the below scenarios do not work:
schedule:run
or schedule:work
in local environmentstenants:run schedule:run
or tenants:run schedule:work --tenants={tenant_id}
in local environments (where tenant_id is the unique UUID of the tenant)The only thing that does work is tenants:run sp:campaigns:dispatch
, which makes it tenant aware at command level.
As such, it would be good if the scheduler built into the package could be disabled so that custom tenant logic could be added instead.
In the meantime, I'll move SendPortal out of the tenant scope – as much as I would like it to be there (for the purposes of separating concerns at tenant level), it is not absolutely crucial yet.
PS: Would be a nice first-option in that empty config file 😉
Hi, i don't see any SMTP bounce processing or am i looking in the wrong places? how can i set it up?
I suggest to add other fields like Date (perhaps Blade can be hooked up?) apart from {{content}}
First of all, thanks for the nice package. I am trying to do category-base lists (tags). Once user subscribe through the form, they will be added under the tag named after the category they are subscribing to.
After reading the docs and this issue, I realized that this can only be done through API calls.
But since I am using the package version (Sendportal Core), it feels like I am going around unnecessarily. It would be nice to have the facades and do the CRUD directly.
Is there any direct ways to do the CRUD?
I created a campaign, selected the segment to be send and it says sent successfully but when i check the recipients, there are none.
I tried testing; created test segment, added my email, tried sending, did not receive and email, test email works fine.
This is related to lines 77 and 273 which contain don't
and haven't
respectively. Re-wording this to remove the apostrophes fixed the issue.
Could be implemented via pixel tracking
From Name which is set in campaign isnt included in the email, From Name is displayed as the letters before the '@' when received in Gmail
Since meta is a json field it could be used to add additional information to the subscribers,
example the Company (workplace)
Hi,
We have few offline data collection sales points, we get that data on weekly basis in CSV files and upload them into the sendportal to send campaigns.
The issue we are facing is that sometimes there are customers who have unsubscribed from getting emails but if the same email is listed in our CSV files, these are updated automatically and they again start to receive these campaigns.
We had this issue referred to us by those customers.
Is there any way to skip import of emails which are already in the system and are unsubscribed?
Thanks.
I installed and configured Sendportal as standalone application. I sent some campaigns earlier with 50+ subscribers. Total I tried to send a campaign to around 15K subscribers. I used Tags to select these 15K subscribers.
It has been about 3 hours and the campaign status page showing as the following. What can i do to send the remaining subscribers? I faced this issue once in the previous version of sendportal and after that I stopped using the application. The new version have the same issue. How can I debug and fix the issue?
Laravel :8.50.0
PHP :8.0.8
Error
- mettle/sendportal-core[v2.0.2, ..., v2.0.3] require aws/aws-sdk-php-laravel ^3.6 -> satisfiable by aws/aws-sdk-php-laravel[3.6.0].
- aws/aws-sdk-php-laravel 3.6.0 requires aws/aws-sdk-php ~3.0 -> satisfiable by aws/aws-sdk-php[3.0.0-beta.1, ..., 3.185.13].
- aws/aws-sdk-php 3.0.x-dev is an alias of aws/aws-sdk-php dev-master and thus requires it to be installed too.
- mettle/sendportal-core[v2.0.0, ..., v2.0.1] require php ^7.3 -> your php version (8.0.8) does not satisfy that requirement.
- aws/aws-sdk-php[dev-master, 3.173.20, ..., 3.185.13] require guzzlehttp/psr7 ^1.7.0 -> found guzzlehttp/psr7[1.7.0, ..., 1.x-dev] but the package is fixed to 2.0.0 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
- aws/aws-sdk-php 3.0.0-beta.1 requires guzzlehttp/guzzle ~5.0 -> found guzzlehttp/guzzle[5.0.0, ..., 5.3.x-dev] but it conflicts with your root composer.json require (^7.0.1).
- aws/aws-sdk-php 3.0.0 requires guzzlehttp/guzzle ^5.3 || ^6.0.1 -> found guzzlehttp/guzzle[5.3.0, ..., 5.3.x-dev, 6.0.1, ..., 6.5.x-dev] but it conflicts with your root composer.json require (^7.0.1).
- aws/aws-sdk-php[3.0.1, ..., 3.3.4] require guzzlehttp/psr7 ~1.0 -> found guzzlehttp/psr7[1.0.0, ..., 1.x-dev] but the package is fixed to 2.0.0 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
- aws/aws-sdk-php[3.3.5, ..., 3.18.28] require guzzlehttp/guzzle ~5.3|~6.0.1|~6.1 -> found guzzlehttp/guzzle[5.3.0, ..., 5.3.x-dev, 6.0.1, ..., 6.5.x-dev] but it conflicts with your root composer.json require (^7.0.1).
- aws/aws-sdk-php 3.18.29 requires guzzlehttp/guzzle ~5.3.1|~6.2.1 -> found guzzlehttp/guzzle[5.3.1, ..., 5.3.x-dev, 6.2.1, 6.2.2, 6.2.3] but it conflicts with your root composer.json require (^7.0.1).
- aws/aws-sdk-php[3.18.30, ..., 3.69.10] require guzzlehttp/guzzle ^5.3.1|^6.2.1 -> found guzzlehttp/guzzle[5.3.1, ..., 5.3.x-dev, 6.2.1, ..., 6.5.x-dev] but it conflicts with your root composer.json require (^7.0.1).
- aws/aws-sdk-php[3.69.11, ..., 3.130.3] require guzzlehttp/guzzle ^5.3.3|^6.2.1 -> found guzzlehttp/guzzle[5.3.3, 5.3.4, 5.3.x-dev, 6.2.1, ..., 6.5.x-dev] but it conflicts with your root composer.json require (^7.0.1).
- aws/aws-sdk-php[3.131.0, ..., 3.173.19] require guzzlehttp/psr7 ^1.4.1 -> found guzzlehttp/psr7[1.4.1, ..., 1.x-dev] but the package is fixed to 2.0.0 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
- Root composer.json requires mettle/sendportal-core ^2.0 -> satisfiable by mettle/sendportal-core[v2.0.0, v2.0.1, v2.0.2, v2.0.3].
Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.
Installation failed, reverting ./composer.json and ./composer.lock to their original content.
Newsletters tend to have a 'view in browser' link that leads to a linkable version of the newsletter.
wouldn't it be nice sendportal could render the newsletter with an uuid oder md5 URL ?
maybe this is best reserved for API consumption, e.g. a JAM stack site could consume the data from the API to display the newsletter
Add a way to use FastExcel configureCsv in SubscribersImportController
https://github.com/rap2hpoutre/fast-excel#import
for now 'only' some placeholders are available
https://sendportal.io/docs/v2/features/templates
{{email}} – The subscriber's email
{{first_name}} – The subscriber's first name (if set)
{{last_name}} – The subscriber's last name (if set)
{{unsubscribe_url}} – A URL generated to allow the subscriber to unsubscribe
{{webview_url}} – A URL generated to allow the subscriber to view the message in a web view
as per my reserach a lot of email templates contain sections like
Email preheader is the summary text that follows a subject line when the email is viewed in an inbox. In many cases, it’s used to provide a short summary of the email, and is typically one sentence long.
https://www.campaignmonitor.com/resources/glossary/email-preheader/
Is it useful to have a <title>
in the email templat?
only for 'view in browser' as per this litmus thread
The delete functionality is missing from subscriber page, I can only unsub but cant delete a subscriber?
If a settings param by name default_mail_sender
exist or is not empty or null, it should be assigned to the header variable in the postal api.
+ if(!empty(Arr::get($this->config, 'default_mail_sender'))){
+ $message->sender(Arr::get($this->config, 'default_mail_sender'));
+}
This should come before the
$message->send()
Also a modification to resources/views/email_services/options/postal.blade.php
to include default_mail_sender
+ <x-sendportal.text-field name="settings[default_mail_sender]" :label="__('Default Sender Address')" :value="Arr::get($settings ?? [], 'default_mail_sender')" autocomplete="off" />
This will allow postal users send emails using the header parameter as verification for the MTA instead of the FROM.
This will enable users achieve proxy mailing. Example sent from [email protected] via mailer.absolute.com
.
can please hepl on how to setup .....prepare any videos quick setup
thanks
I created a campaign, selected the segment to be send and it says sent successfully but when i check the recipients, there are none.
I tried testing; created test segment, added my email, tried sending, did not receive and email, test email works fine.
Hello,
First I'd like to thank you for this awesome package.
I've integrated it using Mailjet service, and I'm able to create campaigns / Templates / Subscribers from the dashboard, and also I can send test to a given email
But No thing happens in my Mailjet account dashboard, i cannot see any subscriber / campaigns ... etc
Am I missing something to force synchronize between my local project and Mailjet Account ?
Also, if it's possible to provide us a small tutorial (code) how to create a subscription form, because I tried to use the Api but no chance to make it working.
Thanks.
the count of sent item in campaign always smaller than the sum of tags subscribers, when campaign dispatched.
example;
tag A = 8000 subs
tag B = 6000 subs
tag C = 3000 subs
total campaign subs expected is 17,000
campaign scheduled at 9am, after 2 hours total sent is only 5,289 message
latest sendportal, using SES on aws ec2 instance
queue is database, with supervisor
When I generate the API request to store a new subscriber it generates new subscriber rather checking if the subscriber exists in the system under the workspace and then create it.
Also there is no method available to check if the subscriber exists based on an email being sent.
Hi SendPortal!
I'm encountering an issue with the event-listener flow in my application.
Details:
I've confirmed that the MessageDispatchEvent is being dispatched. I have added a dump statement within the constructor of this event, and I see the expected output.
I have also ensured that this event is linked to the MessageDispatchHandler listener in the EventServiceProvider.
When the event is dispatched, I expect the handle method in the MessageDispatchHandler to execute. However, it seems this method is not being called, even though the listener's constructor is.
I've also noticed that the MessageDispatchHandler is queued (implements ShouldQueue). While the constructor is being executed, the queued handle method seems to be the part not working.
What I've tried:
Thank you for your support.
I am using the sendportal git repository, therefore I get sendportal-core import via composer. I notice there is an en.json, after creating an nl.json and updating sendportal-host.php nl is able to be selected, but I don't see it change in the interface. Maybe this is due to the localization preferences in the browser.
diff --git a/config/sendportal-host.php b/config/sendportal-host.php
index df3442b..16733b5 100644
--- a/config/sendportal-host.php
+++ b/config/sendportal-host.php
@@ -12,7 +12,8 @@ return [
*/
'locale' => [
'supported' => [
- 'en' => ['name' => 'English', 'native' => 'English']
+ 'en' => ['name' => 'English', 'native' => 'English'],
+ 'nl' => ['name' => 'Dutch', 'native' => 'Nederlands']
]
],
When a POST request is sent to store subscribers with emails including the character '+', eg. ( [email protected]), the error response is "The email must be a valid email address.".
This is a common way for gmail users to create alias for their account. (https://www.techadvisory.org/2014/08/using-an-alias-in-gmail/)
php -v
PHP 8.0.1 (cli) (built: Jan 13 2021 08:22:35) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.1, Copyright (c) Zend Technologies
with Zend OPcache v8.0.1, Copyright (c), by Zend Technologies
Package mettle/sendportal-core has a PHP requirement incompatible with your PHP version, PHP extensions and Composer version
Hello,
I want to express my gratitude to everyone involved in this project for their efforts in making our lives easier.
Currently, I'm encountering challenges with the Unlayer installation in Sendportal. I placed version 2.0.5 in the vendor/mettle/sendportal-core directory, but it appears that nothing is happening on the frontend.
Could you kindly offer guidance on how to seamlessly integrate Unlayer into the project? Is there a need to install Unlayer externally, and if so, where should it be installed? I'm uncertain about what might be missing, as the Visual Builder isn't operating as expected for me.
I would greatly appreciate it if you could provide additional information on Visual Builder integration.
Thank you in advance.
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.