ฉันจะส่ง PHP ได้อย่างไร


71

ฉันติดตั้ง Ubuntu 11.04, LAMP โดยใช้ taskel

ฉันพบว่า PHP mail()ไม่ทำงาน

ฉันคิดว่าฉันต้องเปิดใช้งานหรืออะไร ฉันจะทำอย่างไร


นี่คือง่ายและง่ายต่อการส่งจาก gmail ของคุณ kvcodes.com/2016/03/send-e-mail-localhost-ubuntu-php
— Kvvaradha

คำตอบ:


51

จากคู่มือเมลของ php:

ความต้องการ

เพื่อให้สามารถใช้งานฟังก์ชันอีเมลได้ PHP ต้องมีระบบอีเมลที่ติดตั้งและใช้งานได้ โปรแกรมที่จะใช้ถูกกำหนดโดยการตั้งค่าการกำหนดค่าในไฟล์ php.ini

หมายความว่าคุณต้องติดตั้งเมลเซิร์ฟเวอร์บางประเภทและกำหนดค่า php เพื่อใช้งาน โดยปกติแล้วเมลเซิร์ฟเวอร์นี้เป็น postfix ใน Ubuntu อย่างไรก็ตาม - ในที่สุดถ้า php ด้านที่คุณกำลังเข้ารหัสจะถูกเก็บไว้ในด้านของบริการโฮสติ้ง (เช่น xmission) เมลเซิร์ฟเวอร์จะถูกติดตั้งที่นั่นแล้ว ในกรณีนี้เพียงทดสอบไซต์ของคุณออนไลน์แทนที่จะเป็นแบบโลคัล

หากคุณต้องการทดสอบบนระบบของคุณเองหรือหมายถึงการโฮสต์บนโฮมเซิร์ฟเวอร์ของคุณเองมากกว่าดำเนินการต่อ:

การติดตั้ง Postfix

การติดตั้ง: postfix ติดตั้ง postfix / sudo apt-get install postfix ในระหว่างกระบวนการคุณจะถูกถามในโหมดที่คุณต้องการติดตั้ง postfix มีสี่โหมดที่เป็นไปได้:

  • อินเทอร์เน็ต : เซิร์ฟเวอร์อีเมลของคุณเอง
  • ดาวเทียม : ผู้ให้บริการอีเมลภายนอก (เช่น Google) จะใช้สำหรับการส่งและรับจดหมาย เซิร์ฟเวอร์จะไม่ได้รับจดหมายใด ๆ
  • Smarthost : ผสมระหว่างสอง เมลถูกเก็บไว้ในเครื่อง แต่ส่งผ่านผู้ให้บริการอีเมลภายนอก
  • ท้องถิ่นเท่านั้น : จะไม่เกี่ยวข้องกับคุณ นั่นเป็นระบบส่งเมลฝึกงาน คุณสามารถส่งเมลจากผู้ใช้ไปยังผู้ใช้บนระบบเท่านั้น

ส่วนที่เหลือของตัวเลือกการติดตั้งขึ้นอยู่กับตัวเลือกของการกำหนดค่าทั่วไปนี้

ส่วนใหญ่คุณจะเลือกติดตั้งดาวเทียม นั่นหมายถึงจดหมายจะถูกส่งโดยใช้ผู้ให้บริการภายนอก ในฐานะที่เป็น smtp-server (เซิร์ฟเวอร์อีเมลขาออก) คุณจะต้องระบุผู้ให้บริการของคุณ smtp ตัวเลือกที่เหลือเป็นตัวอธิบายตนเอง

โพสต์การกำหนดค่าการติดตั้ง

เซิร์ฟเวอร์ smtp ส่วนใหญ่ต้องการการรับรองความถูกต้องรหัสผ่านเพื่อส่งจดหมาย ดังนั้น postfix จะต้องรู้รหัสผ่านนั้น นอกจากนี้ยังมีสิ่งต่าง ๆ เช่นการเข้ารหัสที่ต้องพิจารณา (ซึ่งคุณต้องใช้ google) นี่คือวิธีที่คุณกำหนดค่า postfix โดยใช้การพิสูจน์ตัวตนด้วยรหัสผ่าน (sasl):

  • ติดตั้ง libsasl2 -modules ติดตั้งโมดูล libsasl2และ sasl2-bin ติดตั้ง 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 จำลอง)


การส่งจดหมายจาก Ubuntu (ในพื้นที่) ทำงานได้ แต่ถ้าฉันต้องการให้ Windows ของฉันใช้เครื่องนี้เพื่อส่งจดหมาย (PHP ด้วย) ฉันจะกำหนดได้อย่างไร
— JM ที่ทำงาน

ไม่แน่ใจว่าฉันได้รับคำถาม คุณสามารถทรายจากเครื่อง Ubuntu ของคุณ ตอนนี้สิ่งที่คุณต้องการทำคือส่ง mal ผ่านเครื่อง Ubuntu จากพีซี Windows ของคุณผ่าน php ถูกต้องไหม
— con-f-use

2
ตอนนี้แพ็คเกจlibsasl2ไม่มีอยู่ ฉันใช้ 11.04 มันlibsasl2-2ตามแพ็คเกจที่อัพเดท ..
— mythicalcoder

61

ดังที่ระบุไว้แล้ว 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 ของคุณควรจะสามารถส่งอีเมลออกได้ในขณะนี้


3
sendmail_path = /usr/sbin/ssmtp -tฉันคิดว่าคุณหมายถึง ทำงานได้ดีขอบคุณ
— โอเมอร์ซาบิ

1
ssmtp ควรสร้าง symlink /usr/sbin/sendmailซึ่งชี้ไปที่ ssmtp อย่างถูกต้อง ดังนั้นการใช้sendmail_path = /usr/sbin/sendmail -tควรจะทำงานได้เป็นอย่างดี
— Dima ลิตร

2
เพิ่มเติมเกี่ยวกับการกำหนดค่าssmtp(พบบันทึกที่มีประโยชน์): วิธีการตั้งค่าจดหมาย PHP ใน Debian - คำถามนี้ + ลิงก์นี้ช่วยในการตั้งค่าโปรแกรม
— gskema

1
สำหรับ gmail ให้พิจารณาว่าคุณต้องกำหนดค่าบัญชี Google ของคุณเพื่ออนุญาตให้ "แอปที่ไม่ปลอดภัย" ทำงานได้ ดูsupport.google.com/accounts/answer/6010255
— aesede

1
ฉันยังต้องเพิ่มบรรทัดต่อไปนี้: FromLineOverride=YESเพื่อหลีกเลี่ยงข้อผิดพลาดต่อไปนี้:550 5.7.60 SMTP; Client does not have permissions to send as this sender
— Caumons

29

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

แน่นอน 'sudo vi /etc/php5/conf.d' หากไม่มี php.ini จะไม่ทำงาน ในกรณีของฉัน (Ubuntu) ฉันต้องแก้ไข '/etc/php5/apache2/php.ini' และรีสตาร์ท apache 'sudo /etc/init.d/apache2 reload' เพื่อให้มันทำงานได้
— Dejan

1
BTW คุณสามารถทดสอบการกำหนดค่า msmtprc ของคุณโดยใช้:cat <<EOF | msmtp <receiver@test.com> Subject: test This is a test! EOF
— Dejan

จะดี แต่มันไม่ทำงานสำหรับฉัน ไม่มีสิ่งใดปรากฏในบันทึกของมัน ดูเหมือนว่าจะสมบูรณ์ดี แต่ไม่มีลูกเต๋า
— James T Snell

2
ในการทำให้ msmtp พร้อมใช้งานทั่วทั้งระบบให้ติดตั้ง "msmtp-mta"
— colan

1
ในกรณีที่คุณมีตัวอักษรเหมือนฉันมากเกินไปในคำแนะนำต่อไปนี้คุณจะไม่เก็บ <> วงเล็บไว้ในไฟล์ปรับแต่ง ใช้เวลา 20 นาทีในการคิดออก
— de Raad

4

ควรจะแก้ไขง่าย ๆ คุณเพียงแค่ต้องติดตั้ง Postfix ซึ่งจะส่งอีเมลจริง

sudo apt-get install postfix

คุณต้องการเรียกใช้จากเทอร์มินัล (ไม่ใช่ศูนย์ซอฟต์แวร์) เนื่องจากต้องถามคำถามการตั้งค่าเล็กน้อย คุณควรจะยอมรับเพียงแค่ยอมรับค่าเริ่มต้นทั้งหมด (เฉพาะในท้องถิ่นและอื่น ๆ )


2

นี่เป็นคำถามเก่าและมีคำตอบที่สมควร แต่ข้างต้น แต่ฉันต้องการeximสำหรับสภาพแวดล้อมของฉัน และยืนยันว่าคุณติดตั้ง sendmail ตั้งแต่แรก ( $ which sendmail- ควรส่งคืนสิ่งที่ต้องการ / usr / sbin / sendmail) ฉันพบแนวทางที่ดีที่linode.comแต่สาระสำคัญคือ:

apt-get install exim4-daemon-light mailutils

ติดตามโดย:

dpkg-reconfigure exim4-config

ซึ่งจะนำคุณไปสู่โปรแกรมแก้ไขเชิงโต้ตอบ


1

คำตอบที่ดีใช้กับผู้อื่น

ฉันมีสิ่งหนึ่งที่จะเพิ่มเกี่ยวกับ "บัญชี 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

หวังว่านี่จะช่วยรูขุมขนบางคน ...


0

ฉันพบวิธีแก้ปัญหาของ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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.