ฉันติดตั้ง Ubuntu 11.04, LAMP โดยใช้ taskel
ฉันพบว่า PHP mail()
ไม่ทำงาน
ฉันคิดว่าฉันต้องเปิดใช้งานหรืออะไร ฉันจะทำอย่างไร
ฉันติดตั้ง Ubuntu 11.04, LAMP โดยใช้ taskel
ฉันพบว่า PHP mail()
ไม่ทำงาน
ฉันคิดว่าฉันต้องเปิดใช้งานหรืออะไร ฉันจะทำอย่างไร
คำตอบ:
จากคู่มือเมลของ php:
ความต้องการ
เพื่อให้สามารถใช้งานฟังก์ชันอีเมลได้ PHP ต้องมีระบบอีเมลที่ติดตั้งและใช้งานได้ โปรแกรมที่จะใช้ถูกกำหนดโดยการตั้งค่าการกำหนดค่าในไฟล์ php.ini
หมายความว่าคุณต้องติดตั้งเมลเซิร์ฟเวอร์บางประเภทและกำหนดค่า php เพื่อใช้งาน โดยปกติแล้วเมลเซิร์ฟเวอร์นี้เป็น postfix ใน Ubuntu อย่างไรก็ตาม - ในที่สุดถ้า php ด้านที่คุณกำลังเข้ารหัสจะถูกเก็บไว้ในด้านของบริการโฮสติ้ง (เช่น xmission) เมลเซิร์ฟเวอร์จะถูกติดตั้งที่นั่นแล้ว ในกรณีนี้เพียงทดสอบไซต์ของคุณออนไลน์แทนที่จะเป็นแบบโลคัล
หากคุณต้องการทดสอบบนระบบของคุณเองหรือหมายถึงการโฮสต์บนโฮมเซิร์ฟเวอร์ของคุณเองมากกว่าดำเนินการต่อ:
การติดตั้ง: postfix / sudo apt-get install postfix
ในระหว่างกระบวนการคุณจะถูกถามในโหมดที่คุณต้องการติดตั้ง postfix มีสี่โหมดที่เป็นไปได้:
ส่วนที่เหลือของตัวเลือกการติดตั้งขึ้นอยู่กับตัวเลือกของการกำหนดค่าทั่วไปนี้
ส่วนใหญ่คุณจะเลือกติดตั้งดาวเทียม นั่นหมายถึงจดหมายจะถูกส่งโดยใช้ผู้ให้บริการภายนอก ในฐานะที่เป็น smtp-server (เซิร์ฟเวอร์อีเมลขาออก) คุณจะต้องระบุผู้ให้บริการของคุณ smtp ตัวเลือกที่เหลือเป็นตัวอธิบายตนเอง
เซิร์ฟเวอร์ smtp ส่วนใหญ่ต้องการการรับรองความถูกต้องรหัสผ่านเพื่อส่งจดหมาย ดังนั้น postfix จะต้องรู้รหัสผ่านนั้น นอกจากนี้ยังมีสิ่งต่าง ๆ เช่นการเข้ารหัสที่ต้องพิจารณา (ซึ่งคุณต้องใช้ google) นี่คือวิธีที่คุณกำหนดค่า postfix โดยใช้การพิสูจน์ตัวตนด้วยรหัสผ่าน (sasl):
ติดตั้ง libsasl2 -modules และ sasl2-bin โดยคลิกที่ไอคอน Software Center หรือจาก terminal โดยใช้:
sudo apt-get install libsasl2-2 libsasl2-modules sasl2-bin
เปิดใช้งาน sasl-auth โดยเพิ่มบรรทัดเหล่านี้ไป /etc/postfix/main.cf
# add to /etc/postfix/main.cf
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noplaintext noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
สร้างไฟล์ที่/etc/postfix/sasl_password
มีบรรทัดเหมือน:
smtp.gmail.com USERNAME@gmail.com:USERPASSWORD
แทนรหัสผ่านจริงชื่อผู้ใช้และที่อยู่ smtp
อัปเดต postfix:
sudo chmod 600 /etc/postfix/sasl_password # for safety of your smtp password
sudo postmap hash:/etc/postfix/sasl_password
sudo postmap /etc/postfix/sender_canonical
sudo /etc/init.d/postfix restart
คุณอาจจะต้องหลีกเลี่ยง'อนุญาตปฏิเสธ' ข้อผิดพลาดโดยchown postfix:postfix /etc/postfix
ก่อน
สิ่งนี้ควรทำในกรณีส่วนใหญ่ แต่ผู้ให้บริการ smtp บางรายต้องการที่อยู่เฉพาะในฐานะผู้ส่งหรือการเข้ารหัส
ที่เกี่ยวข้อง: ลูกแพร์ ::ส่วนติดต่อทางจดหมายอาจเป็นที่สนใจของคุณ
Gmail (และอาจเป็นบริการอื่น ๆ ) อาจไม่ชอบที่คุณพยายามส่งจดหมายด้วยวิธีนี้เนื่องจากอาจถือว่าไม่ปลอดภัยตามมาตรฐานของพวกเขาและจะปิดกั้นความพยายามของคุณเช่นไม่มีอะไรเกิดขึ้นบนหน้าจอหรือบางแห่งของกระบวนการทั้งหมดจะปิดกั้น การตรวจสอบของคุณ ด้วย POP3 ของคุณจะต้องเปิดใช้งาน
ไปที่เคาน์เตอร์ที่นี่ (หากคุณต้องการอยู่ในด้านที่ปลอดภัยให้สร้างบัญชี Gmail จำลอง)
ดังที่ระบุไว้แล้ว postfix จะ overkill ถ้าคุณเพียงแค่ต้องส่งอีเมลจาก php ในขณะที่การพัฒนาโปรแกรมประยุกต์บนคอมพิวเตอร์ที่บ้านของคุณ
ส่วนตัวแล้วผมใช้ ssmtp ที่เรียบง่ายและเบามาก มันจะใช้เซิร์ฟเวอร์ smtp ใด ๆ เพื่อส่งอีเมลขาออก ติดตั้งโดยใช้:
sudo apt-get install ssmtp
จากนั้นแก้ไข/etc/ssmtp/ssmtp.conf
ไฟล์ใส่เครื่องหมายความคิดเห็นบรรทัด mailhub ที่มีอยู่และเพิ่มบรรทัดต่อไปนี้ (ตัวอย่างนี้ใช้สำหรับเซิร์ฟเวอร์ gmail smtp):
mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
AuthUser=<YOUR-EMAIL>@gmail.com
AuthPass=<YOUR-PASSWORD>
(ระบุชื่อผู้ใช้และรหัสผ่าน gmail ของคุณแน่นอนว่าคุณสามารถใช้เซิร์ฟเวอร์ SMTP อื่น ๆ ได้)
ตอนนี้ให้แน่ใจว่า php.ini sendmail_path
ของคุณมีที่ถูกต้อง มันควรอ่านเป็น:
sendmail_path = /usr/sbin/sendmail -t
( จากความคิดเห็นของ @ dima-L และ @ omar-SABIC : คุณไม่ต้องระบุssmtp
ที่นี่เพราะการติดตั้งควรจะมีการสร้าง symlink สำหรับ/usr/sbin/sendmail
ที่ถูกต้องชี้ไปssmtp
มิฉะนั้นคุณต้องระบุ. sendmail_path = /usr/sbin/ssmtp -t
)
โหลด apache ใหม่และ php ของคุณควรจะสามารถส่งอีเมลออกได้ในขณะนี้
sendmail_path = /usr/sbin/ssmtp -t
ฉันคิดว่าคุณหมายถึง ทำงานได้ดีขอบคุณ
/usr/sbin/sendmail
ซึ่งชี้ไปที่ ssmtp อย่างถูกต้อง ดังนั้นการใช้sendmail_path = /usr/sbin/sendmail -t
ควรจะทำงานได้เป็นอย่างดี
ssmtp
(พบบันทึกที่มีประโยชน์): วิธีการตั้งค่าจดหมาย PHP ใน Debian - คำถามนี้ + ลิงก์นี้ช่วยในการตั้งค่าโปรแกรม
FromLineOverride=YES
เพื่อหลีกเลี่ยงข้อผิดพลาดต่อไปนี้:550 5.7.60 SMTP; Client does not have permissions to send as this sender
PHP ต้องการไคลเอ็นต์ SMTP ในการส่งจดหมาย คุณสามารถติดตั้ง Mail Transfer Agent (MTA) เต็มรูปแบบเช่นPostfixเพื่อใช้งานฟังก์ชั่นนี้ แต่จะเกินความจำเป็นหากคุณต้องการส่งเมลผ่าน PHP เท่านั้น ติดตั้งmsmtpแทน มันมีน้ำหนักเบาและตั้งค่าได้ง่ายกว่ามาก
ติดตั้ง msmtp
sudo apt-get install msmtp-mta ca-certificates
กำหนดค่า
สร้างไฟล์กำหนดค่าใหม่:
sudo vi /etc/msmtprc
... ด้วยข้อมูลการกำหนดค่าต่อไปนี้:
# Set defaults.
defaults
# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL
คุณต้องแทนที่ข้อมูลการกำหนดค่าที่แสดงโดยทุกอย่างภายใน "<" และ ">" (รวมให้ลบข้อมูลเหล่านี้) สำหรับโฮสต์ / ชื่อผู้ใช้ / รหัสผ่านให้ใช้ข้อมูลประจำตัวปกติของคุณในการส่งจดหมายผ่านผู้ให้บริการอีเมลของคุณ
บอก PHP ให้ใช้
sudo vi /etc/php5/apache2/php.ini
เพิ่มบรรทัดเดียวนี้:
sendmail_path = /usr/bin/msmtp -t
cat <<EOF | msmtp <receiver@test.com> Subject: test This is a test! EOF
ควรจะแก้ไขง่าย ๆ คุณเพียงแค่ต้องติดตั้ง Postfix ซึ่งจะส่งอีเมลจริง
sudo apt-get install postfix
คุณต้องการเรียกใช้จากเทอร์มินัล (ไม่ใช่ศูนย์ซอฟต์แวร์) เนื่องจากต้องถามคำถามการตั้งค่าเล็กน้อย คุณควรจะยอมรับเพียงแค่ยอมรับค่าเริ่มต้นทั้งหมด (เฉพาะในท้องถิ่นและอื่น ๆ )
นี่เป็นคำถามเก่าและมีคำตอบที่สมควร แต่ข้างต้น แต่ฉันต้องการexim
สำหรับสภาพแวดล้อมของฉัน และยืนยันว่าคุณติดตั้ง sendmail ตั้งแต่แรก ( $ which sendmail
- ควรส่งคืนสิ่งที่ต้องการ / usr / sbin / sendmail) ฉันพบแนวทางที่ดีที่linode.comแต่สาระสำคัญคือ:
apt-get install exim4-daemon-light mailutils
ติดตามโดย:
dpkg-reconfigure exim4-config
ซึ่งจะนำคุณไปสู่โปรแกรมแก้ไขเชิงโต้ตอบ
คำตอบที่ดีใช้กับผู้อื่น
ฉันมีสิ่งหนึ่งที่จะเพิ่มเกี่ยวกับ "บัญชี dummy gmail":
ขอแนะนำอย่างยิ่งเพราะคุณต้องกำหนดค่าบัญชี gmail ของคุณเพื่ออนุญาตแอปพลิเคชันที่ปลอดภัยน้อยกว่า: https://www.google.com/settings/u/0/security/lesssecureapps
มิฉะนั้นคุณจะได้รับ "กรุณาลงชื่อเข้าใช้ด้วยเว็บเบราว์เซอร์ของคุณ แล้วลองอีกครั้ง "ข้อผิดพลาดใน/var/log/mail.log
ไฟล์ของคุณ
ฉันก็พบว่าฉันได้รับข้อผิดพลาดการหมดเวลายกเว้นว่าฉันส่ง gmail smtp ตัดใบรับรองหลักของฉัน เพื่อทำสิ่งนี้:
sudo nano /etc/postfix/main.cf
เพิ่มต่อไปนี้ที่ด้านล่างของไฟล์
smtp_tls_CAfile = /etc/postfix/cacert.pem
จากนั้นคัดลอก thawte root cert ไปยังcacert.pem
ไฟล์:
cat /etc/ssl/certs/thawte_Primary_Root_CA.pem | sudo tee -a /etc/postfix/cacert.pem
นี่คือลิงค์ที่ฉันใช้: กำหนดค่า Postfix เพื่อใช้ Gmail SMTP บน Ubuntu | EasyEngine
หวังว่านี่จะช่วยรูขุมขนบางคน ...
ฉันพบวิธีแก้ปัญหาของDima L.เป็นวิธีที่ง่ายที่สุดและมีน้ำหนักเบาสำหรับระบบ
นอกจากนี้เพื่อความชัดเจนในการตั้งค่า คุณควรแสดงความคิดเห็นhostname
ใน/etc/ssmtp/ssmtp.conf
ไฟล์ ssmtp.conf
ไฟล์ตัวอย่างมีดังนี้:
#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster
# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.yourdomain.com
UseSTARTTLS=YES
AuthUser=mail@yourdomain.com
AuthPass=YOUREMAILPASSWORD
# Where will the mail seem to come from?
#rewriteDomain=
# The full hostname
#hostname=
# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES