Η σελίδα μας αναβαθμίστηκε, γι' αυτό τον λόγο τα μέλη μας θα πρέπει να ζητήσουν νέο κωδικό πρόσβασης από την υπηρεσία "Αποστολή κωδικού πρόσβασης".
Εάν το email με τον νέο κωδικό δεν έρθει στο inbox κοιτάξτε και στο spam folder. Ο server είναι φρέσκος και δεν έχει το reputation που του αξίζει.

Gmail SMTP Class

Μια περιοχή όπου τα μέλη μας μπορούν να βάζουν τα PHP scripts που έχουν φτιάξει και θέλουν να τα μοιραστούν με τα υπόλοιπα μέλη.

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Gmail SMTP Class

Δημοσίευση από MaZz » 06 Ιουν 2008 16:04

Το script αυτό επιτρέπει την αποστολή E-Mails μέσω της PHP χρησιμοποιώντας τον smtp server του Gmail

Το συγκεκριμένο script είναι χρήσιμο για όσους επιθυμούν να στείλουν e-mails μέσω της php όταν ο web server που φιλοξενούν την ιστοσελίδα τους δεν υποστηρίζει την αντίστοιχη υπηρεσία αποστολής ηλεκτρονικών μηνυμάτων (mail server) - πράγμα σπάνιο - και θέλουν να χρησιμοποιήσουν το λογαριασμό τους στο gmail για την αποστολή e-mails μέσω της υπηρεσίας smtp. Αρχικά, έγραψα αυτό το script για να κάνω δοκιμές σε php scripts τα οποία εκτελούσα σε τοπικό επίπεδο (localhost) αλλά αργότερα σκέφτηκα να το μοιραστώ με τα μέλη του freestuff γιατί πιστεύω ότι είναι αρκετά χρήσιμο (τουλάχιστον για μένα). Βασική προϋπόθεση για να λειτουργήσει το script είναι να έχει μεταγλωττιστεί η php με ενεργοποιημένη την ssl υποστήριξη (--with-openssl), δεδομένου ότι το gmail χρησιμοποιεί ssl συνόδους επικοινωνίας. Αν η php τρέχει σε windows το ssl ενεργοποιείται μέσα από το php.ini (extension=php_openssl.dll).
Σημειώνω ότι το script αυτό, το οποίο είναι γραμμένο σε OOP, λειτουργεί σωστά MONO για τη συγκεκριμένη υπηρεσία gmail smtp και δεν έχει δοκιμαστεί σε άλλους smtp servers όπως του yahoo, του hotmail κτλ. Επομένως δε συνιστώ να το χρησιμοποιήσετε σε άλλους smtp servers παρά μόνο αν είστε καλός γνώστης της php και κάνοντας τις κατάλληλες μετατροπές στον κώδικα του script.

Ακολουθεί ο κώδικας της κλάσης:

Κώδικας: Επιλογή όλων

<?php
	/*
	** $Id&#58; Gmail SMTP Class
	** $Author&#58; MaZz
	** $E-Mail&#58; rfalse@gmail.com
	*
	*	This program is free software&#58; you can redistribute it and/or modify
	*	it under the terms of the GNU General Public License as published by
	*	the Free Software Foundation, either version 3 of the License, or
	*	&#40;at your option&#41; any later version.
	*
	*	This program is distributed in the hope that it will be useful,
	*	but WITHOUT ANY WARRANTY; without even the implied warranty of
	*	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	*	GNU General Public License for more details.
	*
	*	You should have received a copy of the GNU General Public License
	*	along with this program.  If not, see <http&#58;//www.gnu.org/licenses/>.
	*/

	class gmail &#123;
		var $con;
		var $receiver;				//Send to email address
		var $lineterm = "\r\n";

		/******************************
		** Set receiver
		*/
		function setReceiver&#40;$receiver&#41; &#123;
			$this->receiver = $receiver;
		&#125;

		/******************************
		** Connect to gmail SMTP Server
		*/
		function gmail&#40;&#41; &#123;
			$this->con = @fsockopen&#40;'ssl&#58;//smtp.gmail.com', 465, $errno, $errstr, 2&#41;;
			if &#40;!$this->con&#41; 
				die&#40;'Σφάλμα&#58; Αδυναμία σύνδεσης με τον smtp server του gmail'&#41;;
		&#125;

		/******************************
		** Get server response
		*/
		function getData&#40;&#41; &#123;
			$data = '';
			while &#40;!feof&#40;$this->con&#41;&#41; &#123;
				$data .= fgets&#40;$this->con, 128&#41;;
				if &#40;strpos&#40;$data, "\n"&#41;&#41;
					break;
			&#125;

			return $data;
		&#125;

		/******************************
		** Send data
		*/
		function sendData&#40;$data&#41; &#123;
			fputs&#40;$this->con, $data&#41;;
		&#125;

		/******************************
		** Check code
		*/
		function checkCode&#40;$code&#41; &#123;
			if &#40;substr&#40;$this->getData&#40;&#41;, 0, 3&#41; == $code&#41;
				return true;

			return false;
		&#125;
		/******************************
		** Send greeting
		*/
		function sendGreet&#40;&#41; &#123;
			$this->sendData&#40;'HELO localhost' . $this->lineterm&#41;;
			if &#40;!$this->checkCode&#40;250&#41;&#41;
				return false;

			return true;
		&#125;
	
		/******************************
		** Auth Login
		*/
		function auth&#40;$user, $pass&#41; &#123;
			$this->sendData&#40;'AUTH LOGIN' . $this->lineterm&#41;;
			if &#40;!$this->checkCode&#40;334&#41;&#41;
				return false;
		
			$this->sendData&#40;base64_encode&#40;$user&#41; . $this->lineterm&#41;;
			if &#40;!$this->checkCode&#40;334&#41;&#41;
				return false;

			$this->sendData&#40;base64_encode&#40;$pass&#41; . $this->lineterm&#41;;
			if &#40;!$this->checkCode&#40;235&#41;&#41;
				return false;
		
			return true;
		&#125;

		/******************************
		** Send e-mail
		*/
		function sendMail&#40;$user, $pass, $headers, $text&#41; &#123;

			if &#40;!$this->checkCode&#40;220&#41;&#41;
				die&#40;'Σφάλμα&#58; Αδυναμία σύνδεσης με τον smtp server του gmail'&#41;;

			if &#40;!$this->sendGreet&#40;&#41;&#41;
				die&#40;'Σφάλμα&#58; Πρόβλημα επικοινωνίας με τον smtp server του gmail'&#41;;

			if &#40;!$this->auth&#40;$user, $pass&#41;&#41;
				die&#40;'Σφάλμα&#58; Λανθασμένα στοιχεία λογαριασμού gmail'&#41;;

			$this->sendData&#40;'MAIL FROM&#58;<>' . $this->lineterm&#41;;
			if &#40;!$this->checkCode&#40;250&#41;&#41;
				return false;

			$this->sendData&#40;'RCPT TO&#58;<' . $this->receiver . '>' . $this->lineterm&#41;;
			if &#40;!$this->checkCode&#40;250&#41;&#41;
				return false;
			
			$this->sendData&#40;'DATA' . $this->lineterm&#41;;	
			if &#40;!$this->checkCode&#40;354&#41;&#41;
				return false;

			$this->sendData&#40;implode&#40;$this->lineterm, $headers&#41; . $this->lineterm&#41;;
			$this->sendData&#40;$this->lineterm&#41;;
			$this->sendData&#40;$text . $this->lineterm&#41;;
			$this->sendData&#40;'.' . $this->lineterm&#41;;
			if &#40;!$this->checkCode&#40;250&#41;&#41;
				return false;
			
			return true;
		&#125;
	&#125;
?>
Highlighted version: http://scripting.gr/s/gmail.html

Αφού αποθηκεύσετε τον παραπάνω κώδικα σε ένα αρχείο, έστω με όνομα gmail.class.php, θα δημιουργήσετε ένα δεύτερο αρχείο το οποίο θα χρησιμοποιεί την κλάση gmail για την αποστολή των e-mails, έστω με όνομα mail.php.

Ακολουθεί παράδειγμα του αρχείου mail.php:

Κώδικας: Επιλογή όλων

<?php
	//Χρησιμοποιούμε το αρχείο της κλάσης &#40;αλλάξτε το όνομα με αυτό που δώσατε στο προηγούμενο αρχείο&#41;
	require_once 'gmail.class.php';

	//Τα στοιχεία του λογαριασμού μας.
	$username = 'username';		//Όνομα χρήστη gmail
	$password = 'password';		//Κωδικός πρόσβασης gmail

	//Δημιουργούμε ένα στιγμιότυπο του αντικειμένου gmail
	$gmail = new gmail;

	//Ορίζουμε την ηλεκτρονική διεύθυνση του παραλήπτη
	$gmail->setReceiver&#40;"web@site.com"&#41;;

	//Ορίζουμε τα headers του e-mail &#40;σε array&#41;
	$headers = array&#40;
		'to&#58; ' . $gmail->receiver, //Το header 'to&#58;' πρέπει να πάρει το ίδιο e-mail με αυτό που ορίστηκε στην $gmail->setReceiver&#40;&#41;;
		'subject&#58; Δοκιμαστικό e-mail', //Το θέμα του e-mail
		'Content-type&#58; text/plain', //Ο τύπος του e-mail. &#40;Για αλλαγή του character set προσθέστε ';charset=&#91;charset&#93;' π.χ. ';charset=utf8'
	&#41;;

	//Το κείμενο του e-mail &#40;αν το email έχει τη μορφή text/plain η αλλαγή γραμμής γίνεται με τον χαρακτήρα '\n'
	//ενώ αν έχει τη μορφή text/html η αλλαγή γραμμής γίνεται με την ετικέτα '<br />' της html
	$text = "Αυτό είναι ένα δοκιμαστικό ηλεκτρονικό μήνυμα που στάλθηκε μέσω της php\n;&#41;";

	//Η $gmail->sendMail&#40;&#41; επιστρέφει boolean &#40;true/false&#41; και δέχεται τα ακόλουθα arguments&#58;
	//1 -> string $username
	//2 -> string $password
	//3 -> array $headers
	//4 -> string $text
	//Οπότε ένας τρόπος για να μάθουμε αν το e-mail στάλθηκε είναι ο εξής&#58;
	if &#40;$gmail->sendMail&#40;$username, $password, $headers, $text&#41;&#41; &#123;
		echo "Το e-mail στάλθηκε με επιτυχία!";
	&#125;
?>
Στην πράξη:
Εικόνα
Τελευταία επεξεργασία από το μέλος MaZz την 07 Ιουν 2008 13:37, έχει επεξεργασθεί 3 φορές συνολικά.
If nothing in the world can change our children will inherit nothing.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Gmail SMTP Class

Δημοσίευση από soteres2002 » 06 Ιουν 2008 20:31

Πολύ καλός! Γιατί όμως δεν χρησιμοποιείς κατευθείαν imap_* functions και παλεύεις με το protocol μέσω sockets? Το έχω κάνει κι εγώ με imap_* απλά πρέπει να αρχικοποιήσεις connection στην πόρτα 995 στο pop.gmail.com. Και πάλι συγχαρητήρια όμως!!

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Gmail SMTP Class

Δημοσίευση από MaZz » 06 Ιουν 2008 20:48

Ευχαριστώ soteres2002. Μου αρέσει να δουλεύω σε lower level γιατί έχω περισσότερες δυνατότητες :P
If nothing in the world can change our children will inherit nothing.

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

Gmail SMTP Class

Δημοσίευση από soteres2002 » 06 Ιουν 2008 20:54

Ωραίος, keep up!! :)

Άβαταρ μέλους
giannis19
Δημοσιεύσεις: 38
Εγγραφή: 11 Ιουν 2006 14:12
Τοποθεσία: London, UK

Gmail SMTP Class

Δημοσίευση από giannis19 » 21 Ιουν 2008 00:04

mia kai tixea simera xriastika to idio paratheto ton tropo pou xrisimopoiisa:P
sto php.ini prosthetoume

Κώδικας: Επιλογή όλων

&#91;mail function&#93;
SMTP = smtp.gmail.com
sendmail_from = apostoleas@gmail.com
smtp_port = 465
username = apostoleas@gmail.com
password = ******
kai gia na steiloume email apo mail.php

Κώδικας: Επιλογή όλων

<?php

$to = "dektis@gmail.com";
$subject = "You sexy thing";
$message = "You are very sexy! I LOVE YOU! I NEED YOU";
$from = "apostoleas@gmail.com";
$headers = "From&#58; $from";
mail&#40;$to,$subject,$message,$headers&#41;;
echo "Mail Sent.";?>
ennoite pos mporei na tropopoiithei analoga me tin peristasi

sibas
Honorary Member
Δημοσιεύσεις: 1848
Εγγραφή: 21 Φεβ 2003 01:21
Τοποθεσία: Μια εδώ.. Μια εκεί.. Σήμερα είμαι εδώ!!!
Επικοινωνία:

Gmail SMTP Class

Δημοσίευση από sibas » 21 Ιουν 2008 03:25

Ωραιός MaZz :clap:

Ευχαριστούμε που το μοιράστηκες :)

Άβαταρ μέλους
MaZz
Script Master
Δημοσιεύσεις: 345
Εγγραφή: 20 Ιούλ 2005 19:41
Τοποθεσία: Beyond the dark sun
Επικοινωνία:

Gmail SMTP Class

Δημοσίευση από MaZz » 21 Ιουν 2008 11:39

@giannis19
Σωστή και αυτή η λύση αλλά δεν έχουν όλοι πρόσβαση στο php.ini

@sibas
Δεν κάνει τίποτα :D
If nothing in the world can change our children will inherit nothing.

Άβαταρ μέλους
giannis19
Δημοσιεύσεις: 38
Εγγραφή: 11 Ιουν 2006 14:12
Τοποθεσία: London, UK

Gmail SMTP Class

Δημοσίευση από giannis19 » 21 Ιουν 2008 15:19

an dimiourgithei locally ena php.ini file me afta ta settings pistevo pos pali mporei na doulepsei

Άβαταρ μέλους
Alice_Cooper
Δημοσιεύσεις: 1944
Εγγραφή: 11 Μάιος 2007 00:33
Τοποθεσία: Ioannina
Επικοινωνία:

Gmail SMTP Class

Δημοσίευση από Alice_Cooper » 22 Ιουν 2008 01:10

ipo synthikes mporeis na alakseis kapoia settings tou php.ini apo to home sou ...
px to an tha fenontai ta error kai poia... (alla apo to script sou... ) h
kapoia alla pragmatakia meso .htaccess
alla to script tou MaZz poio "eis vathos" sto zitima ....
ekmetalevete ton tropo pou doulevei o smtp server ...
sthn ousia kanei afto pou kanei gia sena h sendmail

edit: episis sygxaritiria gia to Class(aki) ... (ksexasa na po prin :p)

earentill
Δημοσιεύσεις: 3
Εγγραφή: 03 Νοέμ 2008 13:42

Gmail SMTP Class

Δημοσίευση από earentill » 03 Νοέμ 2008 15:09

Γειά σας παιδιά
Εχω ένα πρόβλημα με τη χρήση της συνάρτησης Mail από την Php και δοκίμασα να κάνω χρήση της ωραιότατης κλάσης σας αλλά απέτυχα. Σαν νέος ακόμα στο scripting θέλω να με βοηθήσετε στο τι μπορεί να φταίει. Εχω τον apache 2.2 και τρέχει. έχω ρυθμίσει στο Php τα εξής

[mail function]
SMTP = ssl://smtp.gmail.com
sendmail_from = earentill@gmail.com
smtp_port = 465
username = earentill@gmail.com
password = *******

και το script που τρέχω μου βγάζει αδύναμία σύνδεσης με τον smtp server

τι κάνω λαθος?

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Gmail SMTP Class

Δημοσίευση από korgr » 03 Νοέμ 2008 22:18

Δοκίμασε να αφαιρέσεις το

Κώδικας: Επιλογή όλων

ssl&#58;// 
από το

Κώδικας: Επιλογή όλων

SMTP = ssl&#58;//smtp.gmail.com

earentill
Δημοσιεύσεις: 3
Εγγραφή: 03 Νοέμ 2008 13:42

Gmail SMTP Class

Δημοσίευση από earentill » 04 Νοέμ 2008 21:16

Μπααα τπτ φίλε μου τα ίδια

Εδώ είναι και το μήνυμα που μου βγάζει.

Σφάλμα: Αδυναμία σύνδεσης με τον smtp server του gmail.

Είμαι πίσω από router αλλά έχω κάνει Port forward την 465.

Δε ξέρω γτ αλλά για κάποιο λόγο δεν συνδέεται με τον smtp του gmail. :-(

Εχω απενεργοποιήσει firewall Και antispam του nod (Smart security) (Κατα κόσμον Νώντα!!!)

Μήπως φταίει ο web server Μου? Δεν είδα πουθενά να έχει καμια ρύθμιση για smtp mail ή οτιδήποτε σχετικό?

mallix
Δημοσιεύσεις: 1
Εγγραφή: 05 Δεκ 2009 19:31

Gmail SMTP Class

Δημοσίευση από mallix » 17 Ιουν 2010 22:23

Η συγκεκριμένη κλάση είναι πολύ καλή και λειτουργεί σωστά όσο την έχω χρησιμοποιήσει.

Πως όμως θα πρέπει να τροποποιηθεί ώστε να μπορεί να λειτουργήσει και σαν mass mailer μέσα απο το ίδιο socket ? Δοκίμασα κάποια πράγματα καθώς και την προσθήκη BCC στον header του mail, αλλά δεν μπόρεσα να το κάνω να δουλέψει.

Γνωρίζει κανείς κάποια σωστή λύση ?

Άβαταρ μέλους
parianos
Δημοσιεύσεις: 79
Εγγραφή: 17 Οκτ 2009 21:04
Επικοινωνία:

Gmail SMTP Class

Δημοσίευση από parianos » 01 Σεπ 2010 03:14

Καλησπέρα παιδιά, δοκίμασα το παρπάνω σκριπτ σε μία δοκιμαστική σελίδα που φτιάχνω αλλά μου γράφει ότι δεν μπορεί να συνδεθεί με τον σερβερ, έχει κανεις καμία ιδέα?? σε κάποιον που να δουλευει?
επίσης και με το PEAR moy ζητάει συνέχεια το αρχείο PEAR.php το οποίο και δεν υπάρχει, καμία γνώμη και σε αυτό??
ΣΑς ευχαριστω πολύ!!!

Απάντηση

Επιστροφή στο “PHP τα δικά μας scripts”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες