OpenCart-Hellas 

Η Ελληνική κοινότητα υποστήριξης του Opencart

Αναφορές νέων & επίλυση γνωστών bugs.
#8230
Καλησπέρα σας,
Εχω ένα opencart 3.0.3.3 και έχω ρυθμίσει για email τη SMTP διότι η MAIL είναι disable από τον server λογο ασφαλείας.
Το πρόβλημα είναι οταν ενας πελάτης καταχωρήσει μια παραγγελία αλλά εχει κανει λάθος το email πχ [email protected] αντι για [email protected] o smtp επιστέφει σφάλμα
Uncaught Exception: Error: RCPT TO not accepted from server! in system/library/mail/smtp.php:259
με συνέπεια η παραγγελία να μην ολοκληρώνετε ποτέ και να μένει στο status missing.
Θα μπορούσα με κάποιο τρόπο να κανω εγκλωβισμού του σφάλματος και να μην σταματάει η παραγγελία διότι δεν βρίσκω κάποιο τρόπο να κανω validate αν το email είναι real σε ολες τις επεκτάσεις του πχ .com .gr .eu .de κλπ

Ευχαριστώ πολύ
#8231
Καλησπέρα,

Δοκίμασε να τροποποιήσεις το /library/mail/smtp.php στη γραμμή 259 που πετάει το σφάλμα,να το κάνεις comment out το throw new \Exception κλπ ... και στη θέση του να βάλεις κάτι σαν το παρακάτω:
Κώδικας: Επιλογή όλων
// throw new \Exception ... 
fclose($handle);
return;
#8243
Alexandra έγραψε: 31 Ιαν 2023, 17:07 Καλησπέρα,

Δοκίμασε να τροποποιήσεις το /library/mail/smtp.php στη γραμμή 259 που πετάει το σφάλμα,να το κάνεις comment out το throw new \Exception κλπ ... και στη θέση του να βάλεις κάτι σαν το παρακάτω:
Κώδικας: Επιλογή όλων
// throw new \Exception ... 
fclose($handle);
return;
Καλησπέρα σας,
Τελικά αυτό έκανα χωρίς το fclose($handle); που πολύ σωστά αναφέρατε και δεν έχω πρόβλημα, τώρα ψάχνω ένα τρόπο να έχω πρόσβαση στη βάση από την class της SMTP έτσι ώστε να κάνω ένα log table, νομίζω μόνο άμα στo return επιστρέφει κάτι και το χειρίζομαι στον controller.

Δεν ξέρω αν το βλέπω εγώ έτσι αλλά είναι πολύ λάθος γραμμένη όλοι η class, δεν μπορεί να θεωρούν σωστό flow ότι αν δεν σταλεί το email δεν θα ολοκληρωθεί η παραγγελία.

Ευχαριστώ πολύ για την απάντηση.
#8245
Καλημέρα,

@Nikos Gioumatzidis

Για πρόσβαση στη βάση, θα μπορούσες θεωρητικά να του περάσεις το registry από constructor που θα προσέθετες στον controller του order και μετά από constructor σε constructor να προσθέσεις τις μεταβλητές για να φτάσει στο επίμαχο class, αλλά είναι περισσότερη δουλειά και αρκετά επεμβατική ενέργεια. Προτείνω το ακόλουθο που είναι πιο clean:

Πριν το:
Κώδικας: Επιλογή όλων
class Smtp {

Πρόσθεσε αυτά:
Κώδικας: Επιλογή όλων
require_once(DIR_SYSTEM . '/library/db.php');
require_once(DIR_SYSTEM . '/library/db/mysqli.php');

Όπου θες, μετά το:
Κώδικας: Επιλογή όλων
public function send() {

Προσθέτεις το ακόλουθο και το query σου:
Κώδικας: Επιλογή όλων
$db = new \DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT);

// Test Query
$query = $db->query("SELECT language_id FROM " . DB_PREFIX . "language");

Εναλλακτικά, φτιάχνεις ένα constructor πριν το send(), δημιουργείς το object της βάσης εκεί και τρέχεις τα queries μετά το send().

@sxint Αυτή η συζήτηση είναι αρκετά τεχνική. Επειδή η κάθε έκδοση έχει διαφορές, χρειάζονται κάποιες γνώσεις προγραμματισμού σε PHP για να προσαρμόσεις τις τροποποιήσεις σε κάθε περίπτωση. Πες μας αν θες τι έκδοση OpenCart έχεις. Επίσης, έλεγξε τον φάκελο storage/modification αν το αρχείο smtp.php τροποποιείται από κάποιο OCMOD και παρεμβάλλεται κώδικας. Σε αυτήν την περίπτωση, οι γραμμές κώδικα που συζητάμε παραπάνω δεν θα είναι οι ίδιες.
#8248
Για 3.0.3.7, το system/library/mail/smtp.php γραμμή 169 και 178.

Γενικά η λογική είναι να κάνεις αναζήτηση το λεκτικό του σφάλματος στο αρχείο smtp.php, πχ "Error: RCPT TO not accepted from server!" και το κάνεις έτσι:
Κώδικας: Επιλογή όλων
// throw new \Exception('Error: RCPT TO not accepted from server!');
fclose($handle);
return;
#8258
Alexandra έγραψε: 11 Φεβ 2023, 9:27 Καλημέρα,

@Nikos Gioumatzidis

Για πρόσβαση στη βάση, θα μπορούσες θεωρητικά να του περάσεις το registry από constructor που θα προσέθετες στον controller του order και μετά από constructor σε constructor να προσθέσεις τις μεταβλητές για να φτάσει στο επίμαχο class, αλλά είναι περισσότερη δουλειά και αρκετά επεμβατική ενέργεια. Προτείνω το ακόλουθο που είναι πιο clean:

Πριν το:
Κώδικας: Επιλογή όλων
class Smtp {

Πρόσθεσε αυτά:
Κώδικας: Επιλογή όλων
require_once(DIR_SYSTEM . '/library/db.php');
require_once(DIR_SYSTEM . '/library/db/mysqli.php');

Όπου θες, μετά το:
Κώδικας: Επιλογή όλων
public function send() {

Προσθέτεις το ακόλουθο και το query σου:
Κώδικας: Επιλογή όλων
$db = new \DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT);

// Test Query
$query = $db->query("SELECT language_id FROM " . DB_PREFIX . "language");

Εναλλακτικά, φτιάχνεις ένα constructor πριν το send(), δημιουργείς το object της βάσης εκεί και τρέχεις τα queries μετά το send().

@sxint Αυτή η συζήτηση είναι αρκετά τεχνική. Επειδή η κάθε έκδοση έχει διαφορές, χρειάζονται κάποιες γνώσεις προγραμματισμού σε PHP για να προσαρμόσεις τις τροποποιήσεις σε κάθε περίπτωση. Πες μας αν θες τι έκδοση OpenCart έχεις. Επίσης, έλεγξε τον φάκελο storage/modification αν το αρχείο smtp.php τροποποιείται από κάποιο OCMOD και παρεμβάλλεται κώδικας. Σε αυτήν την περίπτωση, οι γραμμές κώδικα που συζητάμε παραπάνω δεν θα είναι οι ίδιες.
Ευχαριστώ πολύ, θα το δοκιμάσω.
#8259
Καλησπέρα,

Επειδή η εμβόλιμη συζήτηση μας ενδέχεται να μπερδέψει κάποιους χρήστες που δεν είναι developers, θα προσπαθήσω να πάρω τα τμήματα των απαντήσεων που αφορούν την πρόσβαση στη βάση και να τα κάνω νέο thread.

Καλησπέρα στην ομάδα, θέλω να ρωτήσω το εξής: Σε O[…]

Σας ευχαριστώ πολύ για την απάντηση, σκεφτείτε η ε[…]

Έλεγξε αν έχεις πολύ μεγάλα αρχεία εικόνων και αν […]

Κάνε ένα restart τον σερβερ. (βασικα την λειτουργι[…]

Πριν ζητήσετε βοήθεια στο φόρουμ, παρακαλούμε ελέγξτε αν υπάρχει έτοιμη λύση στο OpenCart Extension Marketplace!