phpmailer gởi mail SMTP bằng Gmail/Google Apps

trong danh mục PHP, Web Programming


Hôm qua chiến hữu có liên lạc nhờ fix cái vụ mail SMTP gởi thông qua tài khoản email host trên Google app, sau một hồi mò mẫm thì ra vấn đề không phải trong code triển khai của mình mà là do bug trong class phpmailer cũ, nên cách giải quyết đơn giản là download phiên bản mới (phpmailer 5.1).

Thấy cái này có lẽ nhiều đồng chí gặp nên post lên để chia sẽ những gì đã làm. Số là script gởi mail của phpmailer sử dụng SMTP thì các bạn search trên mạng cũng khá đầy, nhưng post lại đây cho bạn nào quan tâm.

Thông số chính để chạy được SMTP thì đòi hỏi tối thiểu 3 tham số là SMTP Host, SMTP Username, SMTP Password:
– SMTP Host: thì nếu nhà cung cấp dịch vụ mail nào đưa ra SMTP thì họ cũng sẽ đưa cho mình cái địa chỉ, cụ thể của bác Gmail và các mail sử dụng cơ chế Google Apps thì có địa chỉ Host là smtp.gmail.com
– SMTP Username và SMTP Password chính là account email.

Các SMTP khác sao thì không biết, nhưng đối với Google thì chúng ta phải cấu hình SSL và Port 465 để có thể authen được.
Nếu bạn nào đã quen với OOP rồi thì việc sử dụng class phpmailer khá đơn giản, nó cung cấp khá nhiều property và method cho các vấn đề của chúng ta, kể cả attachment trong mail.

Dưới đây là đoạn script gởi mail mà mình test, các bạn có thể tham khảo sơ qua cách sử dụng 1 số method và property của phpmailer class.

?Download download.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?
include "class.phpmailer.php"; 
include "class.smtp.php"; 
 
$mail = new PHPMailer();
$mail->IsSMTP(); // set mailer to use SMTP
$mail->Host = "smtp.gmail.com"; // specify main and backup server
$mail->Port = 465; // set the port to use
$mail->SMTPAuth = true; // turn on SMTP authentication
$mail->SMTPSecure = 'ssl';
$mail->Username = "username@gmail.com"; // your SMTP username or your gmail username
$mail->Password = "passwordhere"; // your SMTP password or your gmail password
$from = "fromemail@somemail.com"; // Reply to this email
$to="emailnguoinhan@domain.com"; // Recipients email ID
$name="Vo Duy Tuan"; // Recipient's name
$mail->From = $from;
$mail->FromName = "Your From Name"; // Name to indicate where the email came from when the recepient received
$mail->AddAddress($to,$name);
$mail->AddReplyTo($from,"Vo Duy Tuan");
$mail->WordWrap = 50; // set word wrap
$mail->IsHTML(true); // send as HTML
$mail->Subject = "Test mail script from bloghoctap.com";
$mail->Body = "<b>Mail nay duoc goi bang phpmailer class. - <a href='http://bloghoctap.com'>bloghoctap.com</a></b>"; //HTML Body
$mail->AltBody = "Mail nay duoc goi bang phpmailer class. - bloghoctap.com"; //Text Body
//$mail->SMTPDebug = 2;
if(!$mail->Send())
{
	echo "<h1>Loi khi goi mail: " . $mail->ErrorInfo . '</h1>';
}
else
{
	echo "<h1>Send mail thanh cong</h1>";
}
?>

Các bạn có thể download file zip dưới đây gồm 3 file (class.phpmailer.php, class.smtp.php và send.php) bỏ vào localhost, thay đổi thông tin username,password cho đúng rồi test thử xem thế nào. Chúc vui!

Download: Test Gmail SMTP with PHP Mailer (testgmail-bloghoctap.com_.zip)

———————–
LƯU Ý: Nếu script báo lỗi không connect được tới SMTP host chắc có lẽ PHP.INI chưa enable extension “extension=php_openssl.dll”, hãy bỏ dấu “;” ở trước dòng đó đi và restart lại Server là ok. Nếu vẫn không được nữa thì hãy kiểm tra account gmail xem có chính xác không, hoặc kiểm tra xem account gmail đã enable chế POP trong Setting chưa. Và lưu ý cái version của class phpmailer nhé, nên download phiên bản mới từ địa chỉ mình để ở trên từ trang http://phpmailer.worxware.com.

46 bình luận

  1. Trần Đăng Khoa says:

    Chào anh, rất cảm ơn vì bài viết của anh, e rất thích blog của anh.
    Sẵn đây a có thể chỉ e làm sao để trình bày code trong bài viết giống như a vậy đó, nhìn rất hay. E cũng đang tập tành làm 1 blog, nếu được a giúp đỡ thì rất may ^^. Nếu được thì a có thể cho nick yahoo để e add hợac add nick YH e nha. khoatd21.
    THanks..

    [Reply]

  2. Chin Lee says:

    Chào anh admin, em vừa thực hiện y chang bài viết của anh và đã gửi mail thành công. Nhưng bị một chút rắc rối, là thế này:

    domain của em là abc.com, em đã tạo tài khoản google app và tạo tài khoản mail là xxx@abc.com, thì khi gửi mail vào xxx@abc.com, mail nó ko vào hòm mail của google, mà nó đi thẳng vào webmail của cpanel, giờ em muốn nó vào hòm mail của google thì mình cấu hình thế nào ạ, mong anh giúp cho

    [Reply]

    Lê Hậu Reply:

    @Chin Lee,

    cpanel quản lý hosting mà. bạn thử xem lại phần MX trong domain xem nó trỏ về MDA nào. ah, anh Tuấn xóa dùm em phần comment ở dưới nha.

    [Reply]

  3. Thanks, bài viết hay đáy, làm hoài vụ này ko duoc.

    mail() trong php ko giải quyết duoc.

    [Reply]

  4. Henry Thai says:

    Thân chào bạn!
    Mình đã nghiên cứu send mail by php hơn 1 tuần rồi mà không được. Tìm thấy bài của bạn mình như nắng hạn gặp mưa. Nhưng mình đang gặp một vài vấn đề xin bạn test lại giúp mình tí nha:
    - Khi $mail->SMTPSecure = ‘ssl’; => SMTP Error: Could not connect to SMTP host.
    - Khi // $mail->SMTPSecure = ‘ssl’; =>SMTP Error: Could not authenticate.
    Mình cần gấp lắm! Xin cảm ơn bạn rất nhiều!

    [Reply]

    admin Reply:

    Kiểm tra lại SMTP server có hỗ trợ SSL không và kiểm tra port. Nếu Gmail SMTP thì những cấu hình trên là chạy được (tất nhiên là phải enable SMTP cho account gmail). Tùy cơ ứng biến. Save yourself!

    [Reply]

  5. Henry Thai says:

    Thân chào bạn!

    Yeah!!!! Do xampp chưa enable ssl! Cảm ơn bạn rất nhiều. Mình vui lắm! Không biết phải tả như thế nào! :-) Nếu bạn ở SG thì hôm nào đi nhậu một bửa đi! Ok?

    Best regard,

    [Reply]

    admin Reply:

    Hihi, chắc không coi phần LƯU Ý nhỉ :D . Dù sao cũng là một bài học. Mình cũng từng bị như vậy nên lưu ý đó. Mình ở SG, nhậu thì không dám, rảnh rỗi thì cafe tán dốc PHP cũng được. Rất vui được làm quen!

    [Reply]

  6. Henry Thai says:

    Thân chào bạn Duy Tuấn!

    Quả thật “kinh nghiệm” có giá trị vô cùng :-)
    Có! Mình có xem kỹ lắm đó chứ! Nhưng ai ngờ là cái ssl ;) ) Ok! :-) Sắp tới mình sẽ call mời bạn cafe.
    Yaoo: anhtungo19.. Hãy Buzz mình cái nha! Mình cũng rất vui được làm quen với bạn! :-)

    See you soon,

    [Reply]

  7. Vincentle says:

    Nó báo vầy là sao vậy bạn? fix hoài không được
    “Loi khi goi mail: The following From address failed: Mymail@gmail.com

    [Reply]

    admin Reply:

    Nó báo vậy chắc là do địa chỉ email của bạn sai kìa. From address fail đó. Tốt nhất là nhập các thông số cho đúng trước khi gởi email.

    [Reply]

  8. admin ơi xem hộ mình tại sao mình gửi mail ở dưới localhost thì được. Còn khi up lên mạng nó lại báo “Could not connect to SMTP host.” Trong khi giao thức ssl ở trên host cũng đã được enable. Mình có cần thay đổi thông số gì khi up lên host không bạn

    [Reply]

  9. nessy says:

    Chào anh em đã cấu hình như send mail ko dc , anh có thể nói rõ từng bước dc ko ..Em đuối quá rùi hic.Thanks

    [Reply]

    admin Reply:

    Mình viết như vậy quá rõ ràng rồi. Hãy thử từng bước và làm lại. Một số điểm cần xem xét là cái tài khoản SMTP có hoạt động không, vì cấu hình cái send mail này copy vô là chạy thôi. Với lại coi cái chỗ ghi chú để enable cái ssl. Thân.

    [Reply]

  10. pig113 says:

    Chào bạn!
    Bạn cho mình hỏi: Mình làm theo bạn và đã gửi mail thành công.
    Tuy nhiên, khi người nhận nhấn “Trả lời” thì địa chỉ trong hộp “To:” lại là địa chỉ của người mình đã gửi mail đến.

    Bạn kiểm tra dùm mình nha!

    [Reply]

    admin Reply:

    Tự tìm hiểu thêm lib đó đi bạn. Cái gì tự mày mò cũng có cái hay của nó.

    [Reply]

  11. Thu Hà says:

    BẠn ơi, dùng php chay thì mình dùng được rồi, còn nếu dùng cakkephp thì dùng ntn? hả bạn, tại mình đang học cakephp, Bạn có thể chỉ sớm giúp mình được không, mình đang cần gấp lắm

    [Reply]

    admin Reply:

    Hihi, bạn tự nghiên cứu để nhúng vô code đi, không thôi copy y chang vô cái chỗ nào xử lý gởi mail là nó chạy thôi. Good luck!

    [Reply]

  12. Tài Nguyễn says:

    admin cho mình hỏi, mình dùng code của bạn gửi trên host Godaddy không được. Nó báo là “SMTP Error: Could not connect to SMTP host.”

    [Reply]

    admin Reply:

    Bạn coi thêm phần LƯU Ý cuối bài viết để thử tìm nguyên nhân hoặc liên hệ trực tiếp với godaddy để họ hỗ trợ. Ngoài ra, có thể do tài khoản gmail của bạn chưa được cấu hình để sử dụng SMTP vì mặc định chưa dùng được liền đâu, vào setting của gmail bật lên mới được. Google thêm nhé.

    [Reply]

  13. Ha` MC says:

    Admin oi minh muon hoi 1 chut la 3 file tai ve de test gui mail thi minh day vao localhost (minh dung XAMPP) hay minh up len host a,vi minh up 3 file nay len host de chay thu thi no bao ko ket noi duoc smtp host,minh cung ko biet chinh php.ini o dau vi minh tren host cua minh ko thay co file nay,thanks Admin

    [Reply]

    admin Reply:

    Bạn xem thêm phần ghi chú để biết cần cấu hình cái gì. 99% trường hợp gởi mail không thành công là do tài khoản SMTP không hợp lệ vì các config kia hầu như được bật sẵn. Còn làm sao để biết SMTP có run không thì thử add email đó vào Outlook (hoặc Thunderbird) để biết có được hay không, nếu Outlook không kết nối được nghĩa là acc SMTP có vấn đề.

    [Reply]

  14. Mèo con bướng bỉnh says:

    Cám ơn bạn nhiều. Mình làm theo bạn ok hết.
    Tuy nhiên khi nhận mail thì bị lỗi font unicode.
    Mình chưa fix được. Bạn biết chỉ mình với nghen.
    Thanks

    [Reply]

  15. Doan Thich says:

    Cám ơn bạn. Bài viết của bạn rất hay. :D

    [Reply]

  16. hùng says:

    sao toàn thế này vậy?
    “Warning: mail() [function.mail]: Failed to connect to mailserver at “localhost” port 25, verify your “SMTP” and “smtp_port” setting in php.ini or use ini_set() in C:\wamp\www\PHP\dangky.php on line 63″
    chán quá. mà cái code đó thì đặt ở chỗ nào vậy?

    [Reply]

  17. Toànbk says:

    Thannk bạn nhiều lắm, mình làm mãi mà không được, nhờ có hướng dẫn của bạn mình đã làm được rồi,hjhj, thank thnak thank bạn.

    [Reply]

  18. Thân chào !
    chân thành cám ơn anh vì đã post bài này, rất hữu ích, qua máy ngày nghiên cứu và chỉnh sửa tôi ko gửi mail được, từ khi vô tình tìm được bài viết này và làm theo hướng dẫn thì đã ok! chân thành cám ơn !!!!!

    [Reply]

  19. Cảm ơn bạn, mình đã thử send mail được rồi. Nhưng mình muốn cái subject hiển thị được tiếng việt unicode thôi thì phải cấu hình như thế nào?
    BS Phạm Thị Vân Thanh

    My Blog

    [Reply]

  20. Trần Đình Trọng says:

    Chào anh Tuấn, tut của anh em đã đọc, cảm ơn anh đã chia sẻ. Tuy nhiên khi test em gặp trường hợp như sau :
    $mail->Password = “passwordhere”; // your SMTP password or your gmail password
    $from = “fromemail@somemail.com”; // Reply to this email
    $to=”emailnguoinhan@domain.com”; // Recipients email ID

    Theo em hiểu là from là biến chứa địa chỉ nếu ta reply, nhưng khi nhấn relpy thì lại gửi đến chính địa chỉ mà ta dùng để gửi

    Làm cách nào để reply là nó gửi về địa chỉ mà chứa trong biến $from được không anh
    Thanks anh

    [Reply]

  21. Hòa says:

    mình muốn đính kèm theo tập tin thì sao nhỉ

    [Reply]

  22. sua dieu hoa says:

    THank bạn mình đang cần code này !

    [Reply]

  23. trung says:

    SMTP Error: Could not connect to SMTP host.
    mình đã làm đủ cách như enable extension “extension=php_openssl.dll”…bật xampp thì thấy SMTP Service đã activated…nhưng vẫn bị lỗi như trên hoài.bạn có cách nào giúp mình k :( (

    [Reply]

  24. admin says:

    @trung, nếu vậy thì thử test account SMTP bằng một số phần mềm đọc mail hỗ trợ SMTP như Thunderbird hoặc Outloook coi có connect được vào SMTP server không. Có thể do SMTP account có vấn đề hoặc setup thông tin connect không đúng rồi.

    [Reply]

  25. ntpnhan says:

    Ok, thank you.
    Tuy nhiên cho mình hỏi 1 vấn đề nhỏ. Nếu gửi mail có attacth file thì không được thì phải.
    Gửi bằng mail của host thì được, nhưng khi mình sử dụng gửi bằng gmail thì ko thể attact file từ host của mình.
    Any ideas?

    [Reply]

  26. Canh says:

    Forum này của em không gửi được Email mong anh giúp với ạ. E có chụp ảnh lại một số lỗi ở đây.
    http://i.imgur.com/ja57Q.png
    http://i.imgur.com/3sS0F.png
    http://i.imgur.com/ocZDX.png
    thank anh!

    [Reply]

  27. Huy says:

    Cùng thắc mắc với bạn Trần Đình Trọng, người nhận sẽ thấy địa chỉ gmail của mình chứ không phải địa chỉ trong $from.Có cách nào thay đổi không anh?

    [Reply]

  28. Dũng Nguyễn says:

    Hi bạn, Giúp mình tý nha. Mình có làm như bạn, (có tải file demo về chạy) mà sao cứ báo lỗi là SMTP Error: Could not connect to SMTP host.
    mình cho chạy trên server và trên localhost nó cũng báo lỗi như vậy. Chạy trên localhost mình cũng đã chỉnh file php.ini rồi.
    Giờ phải làm sao đây, bạn giúp mình với.
    Mình cám ơn.

    [Reply]

  29. Dũng says:

    Chào bạn.

    Cho mình hỏi, cái này chỉ gửi được port 465 hay có thể gửi được các port khác. Với lại cho mình hỏi tốc độ port nào là nhanh nhất, vì mình cần gửi nhiều Email một lần.

    Mình cám ơn.

    [Reply]

  30. nguyen thúy says:

    Hi anh em muốn sửa code nội dung mail được gửi đi trong mantis. vì khi nào gửi mail đi cùng có gạch ========================= rất dài và xấu. em muốn bỏ nó đi mà tìm mãi ko biết nằm trong file nào để sửa. giúp em với ạ

    [Reply]

  31. Lê Trường Giang says:

    Cảm ơn bác rất nhiều về bài viết :) )

    [Reply]

  32. Minh Tiến says:

    Mình gửi mail với nội dụng bằng ckeditor có chèn hình ảnh.
    khi luôn xuống csdl thì có hình nhưng khi gửi mail nhận được thì không có hình.
    Mong mọi người giúp đỡ

    [Reply]

  33. Bạn ơi. Mình dùng phpmailer gởi mail mà ko vào inbox. NÓ toàn vào spam. Giờ sao để gửi đc vào inbox nhỉ ?

    [Reply]

  34. hongdiep says:

    SMTP Error: Could not connect to SMTP host.

    cho em hỏi các anh chị , nhờ anh chị giúp em,

    vấn đề gửi mail, khi em test ở localhost thì vẫn gửi đc bình thường , nhưng khi up lên host nó ko gửi dc mail và báo lỗi như trên.

    - Thêm vấn đề nữa là upload ảnh , em chạy localhost thì upload bình thường, nhưng lên host thì ko dc. cả phần upload ảnh và gửi email điều trên gặp vấn đề trên cùng 1 host. Nhưng những cái code này lúc trước em chạy host khác vẫn bình thường ko có lỗi gì cả, chỉ khi up lên host mới này thì có lỗi trên..

    Mong các anh chị giúp em

    [Reply]

  35. Cấu hình trên trong 1 số trường hợp bị lỗi authenticate (mặc dù info rất chính xác) đó nha bác Tuấn. Nếu ai gặp lỗi này thì đổi:

    $mail->Host = “smtp.gmail.com”;
    $mail->Port = 465;

    thành

    $mail->Host = ‘ssl://smtp.gmail.com:465′;

    Là ok ngay, cái hay bị lắm, mà các hướng dẫn trên mạng ít thấy nhắc đến. Tốt nhất là đổi luôn đi cho nó lành.

    [Reply]

  36. nokia 6110 says:

    một số hosting bây giờ để chống spam họ đã chặn luôn cả phpmailer.

    [Reply]

  37. Ha Ha Ha says:

    Làm được rồi

    [Reply]

Gởi bình luận