Bir SMTP sunucusundan PHP ile e-posta gönderme


132
$from = "someonelse@example.com";
$headers = "From:" . $from;
echo mail ("borutflis1@gmail.com" ,"testmailfunction" , "Oj",$headers);

PHP'de e-posta gönderirken sorun yaşıyorum. Bir hata alıyorum: SMTP server response: 530 SMTP authentication is required.

Doğrulamak için SMTP olmadan e-posta gönderebileceğiniz izlenimine kapıldım. Bu postanın muhtemelen filtreleneceğini biliyorum, ancak şu anda bunun bir önemi yok.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = someonelse@example.com

php.iniDosyadaki kurulum budur . SMTP'yi nasıl kurmalıyım? Doğrulama gerektirmeyen SMTP sunucuları var mı yoksa kendim bir sunucu kurmam gerekiyor mu?

Yanıtlar:


169

SMTP Kimlik Doğrulaması gerektiren bir sunucu üzerinden bir e-posta gönderirken, bunu gerçekten belirtmeniz ve ana bilgisayarı, kullanıcı adını ve parolayı (ve belki de varsayılan değilse portu - 25) ayarlamanız gerekir.

Örneğin, genellikle buna benzer ayarlarla PHPMailer kullanıyorum:

$mail = new PHPMailer();

// Settings
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';

$mail->Host       = "mail.example.com"; // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username"; // SMTP account username example
$mail->Password   = "password";        // SMTP account password example

// Content
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->send();

PHPMailer hakkında daha fazla bilgiyi burada bulabilirsiniz: https://github.com/PHPMailer/PHPMailer


21
PhpMailer için +1 - PHP'nin yerleşik mail()işlevine alternatif, aklı başında kişilerdir .
SDC

8
Bu yanıta tökezleyenler için PHPMailer'ın da WordPress'e dahil edildiğini ve 'phpmailer_init'eylem kancası kullanılarak yapılandırılabileceğini belirtmek gerekir . SMTP postası veya Amazon SES (SMTP bağlantılarını destekleyen) için WordPress'i kurmanın uygun bir yoludur.
Matt van Andel

1
PHP Mailer'ın ücretli betiklerde kullanılmasına izin verilir mi?
Luka

2
@Luka Evet, öyle. Onların göre lisans dosyası PHPMailer ticari kullanımına izin verir LGPL 2.1 lisansı kullanır.
Alejandro

Bu kodu kullanmak için özel bir şey yapmam gerekiyor mu? Bunu nereye koyacağım? POST isteği içeren bir HTML5 formu ile arayabilir miyim? Bu PHPMailer nesnesini oluşturduktan sonra nasıl E-posta gönderirim?
Aaron Franke

53
<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "YOURMAIL@gmail.com");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = YourMail@address.com";

$headers = "From: YOURMAIL@gmail.com";

mail("Sending@provider.com", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

veya daha fazla ayrıntı için okumaya devam edin .


Posta göndermek için kullandığınız IP, 550-5.7.1 e-postayı doğrudan sunucularımıza gönderme yetkisine sahip değil. Bu hatayı alıyorum. tek istediğim açık bir posta aktarımı.
Borut Flis

Statik IP'ye sahip değilim. Herhangi bir Açık posta geçişi biliyor musunuz?
Borut Flis


5
Godaddy php mail()işlevi sorunları için en iyi yanıt budur - 2017 - PHPMailer veya başka bir üçüncü taraf kaynağı indirmeniz gerekmez - teşekkürler
soulshined

4
"OKUYUN" bağlantısı koptu
vladkras

46

Unix kullanıcıları için mail () aslında e-posta göndermek için Sendmail komutunu kullanıyor . Uygulamayı değiştirmek yerine ortamı değiştirebilirsiniz. msmtp , Sendmail uyumlu CLI sözdizimine sahip bir SMTP istemcisidir, bu da Sendmail yerine kullanılabileceği anlamına gelir. Sadece php.ini'nizde küçük bir değişiklik gerektirir.

sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"

Bu durumda, düşük seviyeli mail () işlevi bile SMTP iyiliğiyle çalışabilir. Mevcut bir uygulamayı, uygulamayı değiştirmeden sendgrid veya mandrill gibi posta hizmetlerine bağlamaya çalışıyorsanız çok kullanışlıdır.


1
Harika çözüm, şimdi birden fazla sunucuda kullanın!
raice

3
Bunu, posta kitaplığı kullanmayan uygulamalar için Docker kapsayıcılarıma uygulamak.
Batandwa

Vanilyadan mail()SMTP'yi destekleyen bir şeye mükemmel geçiş yolu . Teşekkür ederim!
rinogo

MSMTP, Windows için de mevcuttur. Bariz indirmelerin 1.4 sürümü var. Bir yerde bulduğum sürüm 1.6.2. Windows için 1.8.6 olup olmadığını bilmiyorum.
Bilbo

Yazar, Şubat 2016'dan önce Windows ikili dosyaları sağlamayı bıraktı.
Bilbo

17

Sorun, PHP mail()işlevinin çok sınırlı bir işlevselliğe sahip olmasıdır. PHP'den posta göndermenin birkaç yolu vardır.

  1. mail()sisteminizdeki SMTP sunucusunu kullanır. Windows'ta kullanabileceğiniz en az iki sunucu vardır: hMailServer ve xmail . Onları yapılandırmak ve kaldırmak için birkaç saat harcadım. Birincisi bence daha basit. Şu anda, hMailServer Windows 7 x64 üzerinde çalışıyor.
  2. mail()Linux ile uzak veya sanal makine üzerinde SMTP sunucusunu kullanır. Elbette, Gmail gibi gerçek posta hizmeti, herhangi bir kimlik bilgisi veya anahtar olmadan doğrudan bağlantıya izin vermez. Sanal makineyi kurabilir veya LAN'ınızda bulunan birini kullanabilirsiniz. Linux dağıtımlarının çoğu, kutunun dışında posta sunucusuna sahiptir. Yapılandırın ve eğlenin. Debian 7'de LAN arayüzünü dinleyen varsayılan exim4 kullanıyorum.
  3. Posta kitaplıkları doğrudan bağlantılar kullanır. Liblerin kurulumu daha kolaydır. SwiftMailer'ı kullandım ve mükemmel bir şekilde Gmail hesabından posta gönderiyor. PHPMailer'ın da oldukça iyi olduğunu düşünüyorum.

Seçiminiz ne olursa olsun, biraz soyutlama katmanı kullanmanızı tavsiye ederim. PHP kitaplığını Windows çalıştıran geliştirme makinenizde kullanabilir ve mail()Linux ile üretim makinesinde kolayca çalışabilirsiniz. Soyutlama katmanı, uygulamanızın çalıştığı sisteme bağlı olarak posta sürücülerini değiştirmenize olanak tanır. MyMailerSoyut send()yöntemle soyut sınıf veya arayüz oluşturun . İki sınıfı devralın MyPhpMailerve MySwiftMailer. Uygulanması send()uygun şekilde yöntem.


17

İşte bunu PHP PEAR ile yapmanın bir yolu

// Pear Mail Library
require_once "Mail.php";

$from = '<your@mail.com>'; //change this to your email address
$to = '<someone@mail.com>'; // change to address
$subject = 'Insert subject here'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => 'your@gmail.com', //your gmail account
        'password' => 'snip' // your password
    ));

// Send the mail
$mail = $smtp->send($to, $headers, $body);

//check mail sent or not
if (PEAR::isError($mail)) {
    echo '<p>'.$mail->getMessage().'</p>';
} else {
    echo '<p>Message successfully sent!</p>';
}

Gmail SMTP kullanıyorsanız, Gmail hesabınızda ayarlar altında SMTP'yi etkinleştirmeyi unutmayın.

DÜZENLEME: Debian / ubuntu'da Mail.php'yi bulamazsanız, php-pear'i şu şekilde kurabilirsiniz:

sudo apt install php-pear

Ardından posta uzantısını yükleyin:

sudo pear install mail
sudo pear install Net_SMTP
sudo pear install Auth_SASL
sudo pear install mail_mime

Öyleyse require_once "Mail.php" , burada bulunan başka bir şeyle yükleyebilmelisiniz :/usr/share/php/Mail.php


1
required_once ('/usr/share/somewhere/Mail.php');

10

Kimlik doğrulaması olmadan çalışan bazı SMTP sunucuları vardır, ancak sunucu kimlik doğrulaması gerektiriyorsa, bunu aşmanın bir yolu yoktur.

PHP'nin yerleşik posta işlevleri çok sınırlıdır - SMTP sunucusunu belirtmek yalnızca WIndows'ta mümkündür. * Nix'te mail()işletim sisteminin ikili dosyalarını kullanacaktır.

İnternetteki rastgele bir SMTP sunucusuna E-posta göndermek istiyorsanız, SwiftMailer gibi bir kitaplık kullanmayı düşünün . Bu, örneğin, Google Mail'in giden sunucularını kullanmanıza olanak sağlar.


2

Linux'ta bir Wordpress sitesi barındırdığınız ve sunucu erişimine sahip olduğunuz durumlarda, standart php mail () işlevinden smtp ile göndermenize izin veren msmtp'yi kurarak bazı sorunlardan kurtulabilirsiniz. msmtp, biraz daha fazla yapılandırma gerektiren postfix'e daha basit bir alternatiftir.

İşte adımlar:

Msmtp yükleyin

sudo apt-get install msmtp-mta ca-certificates

Yeni bir yapılandırma dosyası oluşturun:

sudo nano /etc/msmtprc

... aşağıdaki yapılandırma bilgileriyle:

# 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

"<" Ve ">" içindeki her şey tarafından temsil edilen yapılandırma verilerini değiştirmeniz gerekir (dahil, bunları kaldırın). Ana bilgisayar / kullanıcı adı / şifre için, posta sağlayıcınız aracılığıyla posta göndermek için normal kimlik bilgilerinizi kullanın.

PHP'ye onu kullanmasını söyle

sudo nano /etc/php5/apache2/php.ini

Bu tek satırı ekleyin:

sendmail_path = /usr/bin/msmtp -t

Belgelerin tamamı burada bulunabilir:

https://marlam.de/msmtp/


ssmtp aynı zamanda bir çözümdür bkz. (Fransızca rehber): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ıɾu

0

Başka bir yaklaşım için, şuna benzer bir dosya alabilirsiniz:

From: Sunday <sunday@gmail.com>
To: Monday <monday@gmail.com>
Subject: Day

Tuesday Wednesday

ve şöyle gönder:

<?php
$a1 = ['monday@gmail.com'];
$r1 = fopen('a.txt', 'r');
$r2 = curl_init('smtps://smtp.gmail.com');
curl_setopt($r2, CURLOPT_MAIL_RCPT, $a1);
curl_setopt($r2, CURLOPT_NETRC, true);
curl_setopt($r2, CURLOPT_READDATA, $r1);
curl_setopt($r2, CURLOPT_UPLOAD, true);
curl_exec($r2);

https://php.net/function.curl-setopt

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.