ฉันจะส่ง 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.