PHPMailer STARTTLS

PHPMailer là một trong những mã nguồn mở phổ biến nhất được viết bằng PHP để gửi email. Mặc dù rất dễ triển khai và bắt đầu gửi email, nhưng có một lỗi phổ biến mà hầu hết chúng ta có thể gặp phải

Trong tài liệu này, tôi đã cố gắng chia sẻ câu trả lời cho một số lỗi xảy ra nhiều nhất với PHPMailer

#Lỗi. PHPMailer. Lỗi SMTP. Không thể kết nối với máy chủ SMTP

Tùy thuộc vào trường hợp của bạn, có thể có nhiều lý do dẫn đến lỗi này. Vì vậy, vui lòng thử xem qua các tình huống khác nhau bên dưới và chọn tình huống gần nhất với trường hợp sử dụng của bạn

Vấn đề có thể xảy ra 1. Sự cố với phiên bản mới nhất của PHP

Tôi đã thử sử dụng PHPMailer trong nhiều dự án trước đây và nó hoạt động trơn tru. Nhưng, khi tôi cập nhật phiên bản PHP lên 5. 6, tôi bắt đầu gặp lỗi kết nối SMTP. Sau đó, tôi quan sát thấy rằng vấn đề này xảy ra với phiên bản mới nhất của PHP

Tôi nhận thấy rằng trong phiên bản mới hơn, PHP đã triển khai hành vi SSL nghiêm ngặt hơn, điều này đã gây ra sự cố này

Đây là tài liệu trợ giúp về có một phần xung quanh vấn đề này

Và, đây là cách giải quyết nhanh được đề cập trong wiki ở trên, sẽ giúp bạn khắc phục sự cố này

$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);

Bạn cũng có thể thay đổi các cài đặt này trên toàn cầu, trong tệp php. ini nhưng đó thực sự là một ý tưởng tồi vì PHP đã thực hiện nghiêm ngặt mức SSL này chỉ vì những lý do rất chính đáng

Giải pháp này sẽ hoạt động tốt với PHPMailer v5. 2. 10 và cao hơn

Vấn đề có thể xảy ra 2. Sử dụng Godaddy làm nhà cung cấp dịch vụ lưu trữ

Nếu bạn đang chạy mã của mình trên Godaddy và cố gắng kết nối với một số nhà cung cấp SMTP bên thứ ba như smtp. tiêu bản. com hoặc smtp. lưới gửi. com và gặp một số lỗi như thế này;

Mailer Error: SMTP connect() failed.

sau đó không có gì để thực sự gỡ lỗi thêm, bởi vì đó là do Godaddy áp đặt một quy tắc khó hiểu đối với người dùng của mình, trong đó Godaddy đã chặn rõ ràng kết nối SMTP gửi đi tới các cổng 25, 587 và 465 tới tất cả các máy chủ bên ngoài ngoại trừ máy chủ của chính họ. Godaddy chủ yếu muốn người dùng của họ sử dụng SMTP của riêng họ thay vì SMTP của bất kỳ bên thứ ba nào, đây hoàn toàn không phải là một động thái có thể chấp nhận được đối với cộng đồng nhà phát triển và nhiều người cũng đã bày tỏ sự thất vọng của họ về các vấn đề trên StackOverflow.

Mã PHPmailer của bạn có thể hoạt động hoàn toàn tốt trên máy cục bộ nhưng mã tương tự khi được triển khai trên máy chủ Godaddy có thể không hoạt động và đó là tất cả vì quy tắc ngớ ngẩn này do Godaddy triển khai

Dưới đây là một số cách giải quyết để tránh các sự cố kết nối SMTP trong Godaddy

#1- Sử dụng Godaddy SMTP thay vì bất kỳ bên thứ ba nào

Trong trường hợp bạn đang gửi email được cá nhân hóa 1-1, thì sử dụng Godaddy SMTP sẽ hợp lý. Đối với điều đó, chỉ cần thực hiện các thay đổi sau trong mã PHPMailer của bạn và bạn sẽ hoàn thành;

$mail->isSMTP();
$mail->Host = 'localhost';
$mail->SMTPAuth = false;
$mail->SMTPAutoTLS = false; 
$mail->Port = 25; 

Ghi chú. Godaddy cũng hạn chế sử dụng bất kỳ tên miền miễn phí nào như gmail, yahoo, hotmail, outlook, live, aim hoặc msn làm tên miền người gửi/Địa chỉ từ. Điều này chủ yếu là do các miền này có chính sách SPF và DKIM riêng và một số miền thực sự có thể giả mạo địa chỉ gửi nếu được phép mà không cần có SPF và DKIM tùy chỉnh

Tuy nhiên, trong trường hợp bạn muốn gửi số lượng lớn/email trên quy mô lớn thì điều đó sẽ trở thành nút thắt cổ chai với khả năng cao là email của bạn bị đưa vào thư rác và tên miền/địa chỉ IP của bạn bị đưa vào danh sách đen. Trong trường hợp như vậy, tôi khuyên bạn nên kiểm tra trạng thái danh sách đen email của mình và chọn tùy chọn số 2

#2- Sử dụng API Email thay vì bất kỳ SMTP nào

Godaddy có thể chặn các cổng SMTP gửi đi nhưng thực sự không thể chặn các cổng HTTP gửi đi (80, 8080) 😀 Vì vậy, tôi khuyên bạn nên sử dụng một số nhà cung cấp dịch vụ email bên thứ ba cung cấp API email để gửi email. Hầu hết các nhà cung cấp này đều có thư viện mã/SDK như PHPMailer mà bạn có thể cài đặt và đưa vào mã của mình để bắt đầu gửi email. Không giống như sử dụng SMTP cục bộ của Godaddy, sử dụng API email sẽ giúp bạn kiểm soát tốt hơn khả năng gửi email của mình

Vấn đề có thể xảy ra 3. Gặp lỗi kết nối SMTP trên nhà cung cấp dịch vụ lưu trữ được chia sẻ

Nếu bạn đang chạy mã của mình trên nhà cung cấp dịch vụ lưu trữ được chia sẻ và cố gắng kết nối với một số nhà cung cấp SMTP bên thứ ba như smtp. tiêu bản. com hoặc smtp. lưới gửi. com và gặp một số lỗi như thế này;

SMTP connect() failed.

sau đó, điều này chủ yếu là do các quy tắc tường lửa trên cơ sở hạ tầng của họ đã chặn rõ ràng kết nối SMTP gửi đi tới các cổng 25, 587 và 465 tới tất cả các máy chủ bên ngoài. Quy tắc này chủ yếu để bảo vệ cơ sở hạ tầng khỏi gửi thư rác, nhưng cũng là một tình huống thực sự khó chịu đối với các nhà phát triển như chúng tôi

Giải pháp duy nhất cho vấn đề này là, giống như tôi đã đề xuất ở trên trong  (Sử dụng API email thay cho bất kỳ SMTP nào) hoặc liên hệ với nhà cung cấp dịch vụ lưu trữ để cho phép kết nối với các cổng SMTP

Làm cách nào để kiểm tra xem cổng ra của bạn (25, 587 hoặc 465) có thực sự bị chặn hay không?

1. Đang thử làm telnet
Sử dụng lệnh telnet, bạn thực sự có thể kiểm tra xem cổng đã được mở hay chưa

//Type the following command to see if Port 25 is blocked on your network. 
telnet pepipost.com 25


Nếu Cổng 25 không bị chặn, bạn sẽ nhận được phản hồi 220 thành công (văn bản có thể thay đổi)

Trying 202.162.247.93.. 
Connected to pepipost.com. 
Escape character is '^]'. 
220 pepipost.com ESMTP Postfix


Nếu Cổng 25 bị chặn, bạn sẽ gặp lỗi kết nối hoặc hoàn toàn không có phản hồi

Trying 202.162.247.93...
telnet: connect to address 202.162.247.93: Connection refused
telnet: Unable to connect to remote host

2. Sử dụng outPorts
outPorts là mã nguồn mở rất tốt trên GitHub để quét tất cả các cổng của bạn và đưa ra kết quả
Sau khi cài đặt outPorts, bạn có thể gõ lệnh sau trong terminal để kiểm tra kết nối cổng 25
cổng ra 25

Vấn đề có thể xảy ra 4. Sự cố chặn SELinux

Trường hợp bạn bị một số lỗi như sau

SMTP -> ERROR: Failed to connect to server: Permission denied (13)

sau đó, rất có thể SELinux của bạn đang ngăn PHP hoặc máy chủ web gửi email

Vấn đề này chủ yếu xảy ra với các máy dựa trên Linux như RedHat, Fedora, Centos, v.v.

Làm cách nào để gỡ lỗi liệu đó có thực sự là sự cố SELinux đang chặn các kết nối SMTP này không?

Bạn có thể sử dụng lệnh getsebool để kiểm tra xem trình nền httpd có được phép tạo kết nối SMTP qua mạng để gửi email hay không

________số 8_______

Lệnh này sẽ bật hoặc tắt boolean. Nếu nó bị tắt, thì bạn sẽ thấy kết quả như thế này;

getsebool. SELinux bị vô hiệu hóa

Chúng ta có thể bật nó lên bằng lệnh sau

sudo setsebool -P httpd_can_sendmail 1
sudo setsebool -P httpd_can_network_connect 1

Nếu bạn đang chạy mã của mình trên nhà cung cấp dịch vụ lưu trữ được chia sẻ và cố gắng kết nối với một số nhà cung cấp SMTP bên thứ ba như smtp. tiêu bản. com hoặc smtp. lưới gửi. com và nhận được một số lỗi như thế này

Vấn đề có thể xảy ra 5. Kết nối SMTP PHPMailer không thành công do sự cố hỗ trợ SSL với PHP

Có nhiều trường hợp phổ biến về lỗi kết nối SMTP trong PHPMailer và thiếu SSL cũng là một trong số đó

Có thể có trường hợp tiện ích mở rộng Open SSL không được bật trong php của bạn. ini đang tạo ra sự cố kết nối

Vì vậy, sau khi bạn bật tiện ích mở rộng=php_openssl. dll trong tệp ini

Kích hoạt đầu ra gỡ lỗi để bạn thực sự có thể thấy rằng SSL có phải là vấn đề thực sự hay không. PHPMailer cung cấp một chức năng mà bạn có thể nhận nhật ký chi tiết về kết nối SMTP

Bạn có thể bật chức năng này bằng cách đưa đoạn mã sau vào tập lệnh của mình;

Mailer Error: SMTP connect() failed.
0

Bằng cách đặt giá trị của thuộc tính SMTPDebug thành 2, bạn sẽ thực sự nhận được cả bảng điểm cấp độ máy chủ và máy khách

Để biết thêm chi tiết về các giá trị tham số khác, vui lòng tham khảo tài liệu chính thức

Trong trường hợp bạn đang sử dụng dịch vụ lưu trữ Godaddy, thì việc bật SSL có thể không khắc phục được sự cố của bạn. Bởi vì có những thách thức nghiêm trọng khác với Godaddy mà bạn có thể tham khảo ở trên

Vấn đề có thể xảy ra 6. PHPMailer không thể kết nối với SMTP do sự cố chặn IPv6

Có một số nhóm công ty lưu trữ mới hơn bao gồm DigitalOcean cung cấp kết nối IPv6 nhưng chặn rõ ràng các kết nối SMTP gửi đi qua IPv6 nhưng cho phép tương tự qua IPv4

Mặc dù đây không phải là vấn đề lớn nhưng có thể giải quyết vấn đề này bằng cách đặt thuộc tính máy chủ lưu trữ thành địa chỉ IPv4 bằng hàm gethostbyname

Mailer Error: SMTP connect() failed.
1

Ghi chú. Theo phương pháp này, bạn có thể gặp sự cố kiểm tra tên chứng chỉ nhưng có thể giải quyết bằng cách tắt kiểm tra, trong SMTPOptions
Tuy nhiên, đây chủ yếu là một trường hợp cực đoan, hầu hết các trường hợp đó là do nhà cung cấp chặn cổng, như DigitalOcean trong trường hợp này
Vì vậy, điều quan trọng trước tiên là phải xác nhận xem cổng có thực sự được mở khóa hay không, trước khi tìm hiểu sâu hơn về giải pháp

Vấn đề có thể xảy ra 7. Gặp lỗi "Không thể khởi tạo chức năng thư"

Sự cố này chủ yếu xảy ra khi cài đặt PHP của bạn không được định cấu hình đúng để gọi hàm mail(). Trong trường hợp này, điều quan trọng là phải kiểm tra sendmail_path trong php của bạn. tập tin ini. Tốt nhất, sendmail_path của bạn nên trỏ đến tệp nhị phân sendmail (thường thì đường dẫn mặc định là/usr/sbin/sendmail)

Ghi chú. Trong trường hợp hệ điều hành Ubuntu/Debian, bạn có thể có nhiều. ini (trong đường dẫn /etc/php5/mods-available), vì vậy hãy đảm bảo rằng bạn đang thực hiện các thay đổi ở tất cả các vị trí thích hợp

Nếu vấn đề cấu hình không phải như vậy, thì hãy thử gỡ lỗi thêm và kiểm tra xem bạn đã cài đặt và định cấu hình máy chủ thư cục bộ đúng cách hay chưa. Bạn có thể cài đặt bất kỳ máy chủ thư tốt nào như Postfix

Ghi chú. Trong trường hợp tất cả những điều trên đều đúng và bạn vẫn gặp lỗi "Không thể khởi tạo chức năng thư", thì hãy thử xem bạn có nhận được thêm thông tin chi tiết về lỗi không. Nếu bạn thấy một số thông báo như "Nhiều người từ một người" trong thông báo lỗi thì điều đó có nghĩa là trong php. ini thuộc tính sendmail_path đã chứa tham số from -f và mã của bạn cũng đang cố gắng thêm phong bì thứ hai từ đó, điều này thực sự không được phép

Công dụng của IsSMTP() là gì?

isSMTP() được sử dụng khi bạn muốn yêu cầu lớp PHPMailer sử dụng cấu hình SMTP tùy chỉnh được xác định thay vì máy chủ thư cục bộ

Đây là một đoạn mã về giao diện của nó;

Mailer Error: SMTP connect() failed.
2

Nhiều lần các nhà phát triển gặp phải lỗi dưới đây

Mailer Error: SMTP connect() failed.
3

Nếu bạn liên tục nhận được thông báo lỗi ở trên, thì chỉ cần thử xác định sự cố như đã nêu trong các phần trên

Thư SMTP StartTLS là gì?

StartTLS là một lệnh giao thức được sử dụng để thông báo cho máy chủ email rằng ứng dụng email muốn nâng cấp từ kết nối không an toàn lên kết nối an toàn bằng TLS hoặc SSL. StartTLS is used with SMTP and IMAP, while POP3 uses the slightly different command for encryption, STLS.

PHPMailer có sử dụng SMTP không?

Sử dụng PHPMailer có an toàn không?

PHPMailer là một thư viện mã và được sử dụng để gửi email một cách an toàn và dễ dàng thông qua mã PHP từ máy chủ web . Gửi email trực tiếp qua mã PHP yêu cầu mức độ quen thuộc cao đối với giao thức tiêu chuẩn SMTP và các vấn đề và lỗ hổng liên quan về việc tiêm Email để gửi thư rác.

Lệnh StartTLS là gì?

STARTTLS là lệnh giao thức email cho máy chủ email biết rằng ứng dụng email, bao gồm ứng dụng email đang chạy trong trình duyệt web, muốn biến kết nối không an toàn hiện tại thành kết nối an toàn. . .