PDA

View Full Version : Gửi e-mail thông qua SMTP với PHPMailer sử dụng tài khoản Gmail


hoangth
09-12-2009, 20:02
Ngày trước mình hay gặp vấn đề về việc gởi mail vào các tài khoản mail free. đa phần các server gởi đi đều dính dô spam. rồi test tại máy local thi ko gởi được mail ra ngoài để test cho nó tiện. với việc tạo server home chạy code nhiều bạn cũng gặp vấn nạn ở chổ cái mail là gởi dô yahoo hay gmail nó ko chạy luôn. dân web mà học cấu hình lại server giả này cũng cực. Mới ngâm được cái PHPMailer thấy rất hay dù biết lâu rồi nhưng chưa có thời gian viết 1 cái hàm cụ thể.
Hi tại sao mình lại hướng dẫn gmail mà ko phải là yahoo hay cái khác :
Trước hết it's FREE! Mà các SMPT hay host của việt nam IP lõm quá chạy thua xa Gmail. mà google lại hỗ trợ quá tuyệt hình như là 500 mail cho 1 ngày thì phải gởi đã đời. đối với web nhỏ như chúng ta thôi nha. chứ vài nghìn mình ko nghĩ tới.

Bắt đầu.
1. Bạn phải sử dụng PHP5 nha và port 465 chắc chắn được phép chạy vì nó sẽ kết nối với Gmail
2. Download PHPMailer (http://sourceforge.net/projects/phpmailer/files/phpmailer%20for%20php5_6/PHPMailer%20v5.1/PHPMailer_v5.1.zip/download)
3. Vào : http://gmail.com đăng ký cái tài khoản (chắc ai cũng có 1 cái rồi nhỉ :D)

Include file phpmailer chứa class làm việc này vào file mà bạn cần sử lý gởi mail :
require_once('phpmailer/class.phpmailer.php');Đinh nghĩa biến cho tài khoản Gmail của bạn
define('GUSER', 'you@gmail.com'); // tài khoản đăng nhập Gmail
define('GPWD', 'password'); // mật khẩu cho cái mail nàyRồi hàm nãy đã viết sẳn bạn chỉ việc dùng hay viết lại thêm cái gì đó theo ý bạn thôi. nhúng nó vào file gởi mail của bạn rồi chạy


function smtpmailer($to, $from, $from_name, $subject, $body) {
global $error;
$mail = new PHPMailer(); // tạo một đối tượng mới từ class PHPMailer
$mail->IsSMTP(); // bật chức năng SMTP
$mail->SMTPDebug = 0; // kiểm tra lỗi : 1 là hiển thị lỗi và thông báo cho ta biết, 2 = chỉ thông báo lỗi
$mail->SMTPAuth = true; // bật chức năng đăng nhập vào SMTP này
$mail->SMTPSecure = 'ssl'; // sử dụng giao thức SSL vì gmail bắt buộc dùng cái này
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465;
$mail->Username = GUSER;
$mail->Password = GPWD;
$mail->SetFrom($from, $from_name);
$mail->Subject = $subject;
$mail->Body = $body;
$mail->AddAddress($to);
if(!$mail->Send()) {
$error = 'Gởi mail bị lỗi: '.$mail->ErrorInfo;
return false;
} else {
$error = 'thư của bạn đã được gởi đi ';
return true;
}
}
Cách sử dụng hàm đã viết bên trên như thế nào (ai ko biết code sẽ hỏi nhỉ :D)

smtpmailer('goiden@gmail.com', '', 'goitu@mail.com', 'yourName', 'Tiêu đề Thư', 'Nội dung thư');
bạn có thể thay thế các giá trị bên trên thành 1 biến lấy từ Form của bạn nhé
$_POST hay $_GET gì gì đóVà hơn 1 chút thay vì chỉ gởi mà lặng lẽ rôi im ru


if (smtpmailer('to@mail.com', 'from@mail.com', 'yourName', 'test mail message', 'Hello World!')) {
// gởi xong rồi thông báo gì đó cho ngươi dùng :D viết ở đây
}
if (!empty($error)) echo $error;

TheShinichi
10-12-2009, 05:04
Bài viết hay, mạn phép stick lên cho mọi người dễ theo dõi. Chắc để viết 1 tut gửi mail qua google trên ASP.NET :D

quangdongst
16-12-2009, 12:56
cho em hỏi lỗi này khi chạy thử
Invalid address: SMTP Error: Could not connect to SMTP host. Gởi mail bị lỗi: SMTP Error: Could not connect to SMTP host.

hoangth
16-12-2009, 14:20
Chú ý phải Bật cURL + SSL của php và mod SSL của apache mới dùng được cái này. hầu hết tất cả các host đều chạy ổn chỉ có điều ở localhost phải cấu hình.
Khuyến cáo nên sài Wamp thay vài appserver kể cả Xampp cũng ko ok vì cấu hình lại khá cực mình đã thử rồi

TheShinichi
07-02-2010, 18:18
Bài viết hay, mạn phép stick lên cho mọi người dễ theo dõi. Chắc để viết 1 tut gửi mail qua google trên ASP.NET :D

Giữ lời hứa hôm trước nè:

Ví dụ về gửi mail trong ASP.NET dùng tài khoản GMail:

http://vietcoding.com/gui-email-trong-aspnet-thong-qua-tai-khoan-gmail/ (http://blog.anhdung.info/gui-email-trong-aspnet-thong-qua-tai-khoan-gmail/)

http://nhatnghe.com/forum/showthread.php?p=376860#post376860

hoangth
12-03-2010, 18:25
Sử dụng với class POP3

<?php
require_once('class.phpmailer.php');
require_once('class.pop3.php'); // required for POP before SMTP
function popmailer($to, $from, $from_name, $subject, $body) {
global $error;

$pop = new POP3();
$pop->Authorise('123.30.220.111', 110, 30, 'hoangth', 'hoangth', 1);
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 0;
$mail->Host = '123.30.50.181';
$mail->SetFrom($from, $from_name);
$mail->AddReplyTo($from, $from_name);
$mail->Subject = $subject;
$mail->AltBody = $body; // optional, comment out and test
$mail->MsgHTML($body);
$mail->IsHTML(true);

$address = $to;
$mail->AddAddress($address);



if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
}

}


//send message to customer
popmailer("hoangscp@gmail.com", "hoangscp@gmail.com","hoang", "Tieu De Email", "test");

?>

thebluestar136
20-04-2010, 18:42
Minh đã thử như bài post of bạn nhưng nó vẫn thông báo lỗi:
Invalid address: SMTP Error: Could not authenticate. sending email DONE!sending error: SMTP Error: Could not authenticate.
Dòng này của mình có sai gì ko?
smtpmailer('lehoa.fit@gmail.com', '', 'linhnguyen.nmt@mail.com', 'linh', 'subject', 'content');
if (smtpmailer) {
echo "sending email DONE!";
}
if (!empty($error)) echo $error;
bạn xem giúp mình với.
Mình có cần chỉnh smpt port trong file php.ini ko? vì mình thấy trong đó nó la 25 còn trong PHPMailer nó là 456

shuramita
24-05-2010, 13:48
Cho mình hỏi với, là khi gởi đến email đến gmail or yahoo chẳng hạn, Mình muốn bắt cái lỗi khi email không đến được đính thì có cách nào không nhỉ. Thanks nhiều!

tctshare
26-09-2010, 13:33
Cho mình hỏi với, là khi gởi đến email đến gmail or yahoo chẳng hạn, Mình muốn bắt cái lỗi khi email không đến được đính thì có cách nào không nhỉ. Thanks nhiều!không gửi được phải đợi phản hồi bên server nhận! không thể biết liền được! :diablo:

Để gửi cho mail yahoo các bạn nên cấu hình ngày giờ và timezone của server chính xác nhé :yahoo!:

insert
01-11-2010, 23:36
Bài viết này rất hay, nhưng tôi có một câu hỏi này muốn thỉnh giáo mọi người, nếu trường hợp mình muốn gửi mail cho nhiều địa chỉ mail khác nhau có trong cơ sở dữ liệu (cỡ vài trăm, hoặc vài nghìn hoặc nhiều hơn nữa. Đại loại kiểu như spam mail) cùng một lúc thì sao, tôi đã thử làm nhưng mà mỗi lần gửi thì nó chỉ gửi đi được cho 5,6 địa chỉ rồi không gửi nữa, mặc dù để vòng lặp for chạy hết các địa chỉ mail trong CSDL. Vậy có bạn nào có cách nào để gửi cho nhiều địa chỉ mail cùng một lúc không

changsangoc
22-11-2010, 09:13
em post lên host sao khi chạy file này nó lại báo lỗi này anh Hoàng ơi:

Oops! This page appears broken. DNS Error - Server cannot be found.
code file sendmail trên host free: summerhost.info

code file sendmail:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>


</head>
<?php
require_once('PHPMailer/class.phpmailer.php');
require_once('PHPMailer/class.pop3.php');
function popmailer($to, $from, $from_name, $subject, $body) {
global $error;

$pop = new POP3();
$pop->Authorise('123.30.220.111', 110, 30, 'hoangth', 'hoangth', 1);
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 0;
$mail->Host = '123.30.50.181';
$mail->SetFrom($from, $from_name);
$mail->AddReplyTo($from, $from_name);
$mail->Subject = $subject;
$mail->AltBody = $body; // optional, comment out and test
$mail->MsgHTML($body);
$mail->IsHTML(true);

$address = $to;
$mail->AddAddress($address);



if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
}

}


//send message to customer
popmailer("hoangscp@gmail.com", "hoangscp@gmail.com","hoang", "Tieu De Email", "test");
?>
<body>
</body>
</html>

link test:
http://tinphatco.co.cc/sendmail.php

tctshare
25-11-2010, 22:08
Bài viết này rất hay, nhưng tôi có một câu hỏi này muốn thỉnh giáo mọi người, nếu trường hợp mình muốn gửi mail cho nhiều địa chỉ mail khác nhau có trong cơ sở dữ liệu (cỡ vài trăm, hoặc vài nghìn hoặc nhiều hơn nữa. Đại loại kiểu như spam mail) cùng một lúc thì sao, tôi đã thử làm nhưng mà mỗi lần gửi thì nó chỉ gửi đi được cho 5,6 địa chỉ rồi không gửi nữa, mặc dù để vòng lặp for chạy hết các địa chỉ mail trong CSDL. Vậy có bạn nào có cách nào để gửi cho nhiều địa chỉ mail cùng một lúc khôngđẩy khoảng 30s/1 em đi là vừa! nhanh quá không ổn!
có thể dùng code xen kẻ các dịch vụ mail như yahoo 1 em, gmail 1 em, hotmail 1 em như thế tụi nó mới ko chặn :dance:

itthuyloi
17-06-2011, 12:33
Mình gặp 1 vấn đề này. Khi dùng class mail này xài trên host linux thì vô tư không lỗi gì hết, cả local host cũng vậy. Nhưng trên host window thì lại lỗi SSL:

SMTP -> ERROR: Failed to connect to server: Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP? (24)
SMTP Error: Could not connect to SMTP host. Mailer Error: SMTP Error: Could not connect to SMTP host.

Trong quản lí host, vào modify domai thì có 1 mục là switch on ssl suport, mìh chọn swich on rồi tí vào lại thấy ko thay đổi gì, mọi người có thể giúp đỡ ko ah, thanks alot. Mình xài Virtual Host Plesk.

tctshare
20-12-2011, 00:02
bài viết khá hay và cụ thể về giao thức sendmail
--------
trung tâm gia sư (http://giasuductri.com) - máy tính chủ (http://maytinhao.blogspot.com/2011/09/giai-phap-ncomputing-office-in-box.html) - ncomputing (http://maytinhao.blogspot.com)quảng cáo khá hay! giao thức... spam :|

dat12012
07-08-2012, 11:27
mình cũng muốn forward bằng phpmailler mà chưa biết cấu hình ở đâu, ai biết chỉ cho mình với

hunghoavtt
07-08-2012, 12:24
Hay quá! E thich bai nay roi do!

Rảnh vào Vkool xem phim nhé!

ngocluantdt
24-08-2012, 15:56
Mọi người cho em hỏi, mail của em gửi được nhưng sao nó lại vào mail box spam vậy? làm thế nào để nó vào inbox ạ?

maxnguyen82
09-01-2013, 19:06
bài cũ lôi lên..hiện tại em chưa biết cấu hình tạo cái from để gửi mail thế nào, ai biết chỉ em với.thank

rex_star95
18-02-2013, 11:35
hình như chủ top ko còn online nữa. có ai biết fix lỗi SMTP Error: Could not connect to SMTP host ko?

hoangtumacarong
05-06-2013, 14:24
rất hay nhưng không gửi được số lượng lớn ...

tainguyenvan
13-08-2013, 21:58
Có hướng dẫn hay hơn, send đi tiêu đề thư bị mất định dạng tiếng việt: http://masterit.vn/index.php/top10/176-huong-dan-su-dung-phpmailer mọi người xem tham khảo, mình đã làm thử vào chạy tốt. thanks

thiensulongan
21-10-2013, 17:45
cảm ơn thầy:JFBQ00171070307A:

onapthanh
24-01-2014, 23:52
phải Bật cURL + SSL của php và mod SSL của apache mới dùng được cái này. hầu hết tất cả các host đều chạy ổn chỉ có điều ở localhost phải cấu hình.
Khuyến cáo nên sài Wamp thay vài appserver kể cả Xampp cũng ko ok

trungproab
12-06-2014, 21:28
Làm theo chủ thớt thì gửi được nhưng vẫn có vấn đề không hiểu tại sao mong mọi người giúp:
- khi để $mail->AddAddress(abc@gmail.com); thì gởi thành công nhưng đổi abc@gmail.com thành:
$email = $_POST['emailnhan'];
$mail->AddAddress($email); thì lại không gửi được mặt dù thông báo gửi thành công nhưng không nhân được mail. mong mọi người giúp. xin cảm ơn