PHP
Skickar e-post
Sök…
parametrar
Parameter | detaljer |
---|---|
string $to | Mottagarens e-postadress |
string $subject | Ämnesraden |
string $message | E-postens kropp |
string $additional_headers | Valfritt: rubriker att lägga till i e-postmeddelandet |
string $additional_parameters | Valfritt: argument för att skicka till det konfigurerade e-postsändningsprogrammet på kommandoraden |
Anmärkningar
E-post som jag skickar via mitt skript kommer aldrig. Vad ska jag göra?
Se till att felrapporteringen är aktiverad för att se några fel.
Om du har tillgång till PHP: s felloggfiler, kontrollera dessa.
Är kommandot
mail()
konfigurerat korrekt på din server ? (Om du deltar i delad hosting kan du inte ändra någonting här.)Om e-post bara försvinner, starta ett e-postkonto med en freemail-tjänst som har en skräppostmapp (eller använd ett e-postkonto som inte alls skräppostfiltrerar). På detta sätt kan du se om e-postmeddelandet inte skickas ut eller kanske skickas utan filtreras som skräppost.
Kollade du "från:" -adressen du använde för möjliga "returnerade till avsändare" -meddelanden? Du kan också ställa in en separat avvisningsadress för felmeddelanden.
E-postmeddelandet jag skickar filtreras som skräppost. Vad ska jag göra?
Tillhör avsändaradressen ("Från") en domän som körs på servern du skickar e-postmeddelandet från? Om inte, ändra det.
[email protected]
aldrig avsändaradresser som[email protected]
. Användreply-to
om du behöver svar för att komma till en annan adress.Är din server på en svartlista? Detta är en möjlighet när du deltar på delad hosting när grannarna uppför sig dåligt. De flesta leverantörer av svartlistor, som Spamhaus , har verktyg som gör att du kan leta upp din server IP. Det finns också verktyg från tredje part som MX Toolbox.
Vissa installationer av PHP kräver att en femte parameter ställs in på post () för att lägga till en avsändaradress. Se om detta kan vara fallet för dig.
Om allt annat misslyckas kan du överväga att använda e-post-som-en-tjänst som Mailgun , SparkPost , Amazon SES , Mailjet , SendinBlue eller SendGrid — för att nämna några - istället. De har alla API: er som kan kallas med PHP.
Skicka e-post - Grunderna, mer information och ett fullständigt exempel
En typisk e-post har tre huvudkomponenter:
- En mottagare (representerad som en e-postadress)
- Ett ämne
- Ett meddelandeorgan
Att skicka e-post i PHP kan vara lika enkelt som att ringa den inbyggda funktionsmailen mail()
. mail()
tar upp till fem parametrar men de första tre är allt som krävs för att skicka ett e-postmeddelande (även om de fyra parametrarna vanligtvis används som kommer att visas nedan). De första tre parametrarna är:
- Mottagarens e-postadress (sträng)
- E-postens ämne (sträng)
- E-postens kropp (sträng) (t.ex. innehållet i e-postmeddelandet)
Ett minimalt exempel skulle likna följande kod:
mail('[email protected]', 'Email Subject', 'This is the email message body');
Det enkla exemplet ovan fungerar bra under begränsade omständigheter, såsom hårdkodning av en e-postvarning för ett internt system. Det är emellertid vanligt att placera data som skickas som parametrar för e- mail()
i variabler för att göra koden renare och enklare att hantera (till exempel genom att dynamiskt bygga ett e-postmeddelande från en formulärinsändning).
Dessutom accepterar e- mail()
en fjärde parameter som låter dig skicka ytterligare e-posthuvuden med din e-post. Med dessa rubriker kan du ställa in:
-
From
namn och e-postadress som användaren ser -
Reply-To
e-postadressen som användarens svar kommer att skickas till - ytterligare rubriker som inte är standarder som
X-Mailer
som kan berätta för mottagaren att detta e-postmeddelande skickades via PHP
$to = '[email protected]'; // Could also be $to = $_POST['recipient'];
$subject = 'Email Subject'; // Could also be $subject = $_POST['subject'];
$message = 'This is the email message body'; // Could also be $message = $_POST['message'];
$headers = implode("\r\n", [
'From: John Conde <[email protected]>',
'Reply-To: [email protected]',
'X-Mailer: PHP/' . PHP_VERSION
]);
Den frivilliga femte parametern kan användas för att skicka ytterligare flaggor som kommandoradsalternativ till det program som är konfigurerat för att användas vid skicka e-post, enligt definitionen av konfigurationsinställningen sendmail_path
. Till exempel kan detta användas för att ställa in kuvertets avsändaradress när du använder sendmail / postfix med alternativet -f
sendmail.
$fifth = '[email protected]';
Även om användning av e- mail()
kan vara ganska tillförlitlig, är det inte alls garanterat att ett e-postmeddelande skickas när e- mail()
anropas. För att se om det finns ett potentiellt fel när du skickar din e-post, bör du fånga returvärdet från e- mail()
. TRUE
kommer att returneras om posten godkändes för leverans. Annars får du FALSE
.
$result = mail($to, $subject, $message, $headers, $fifth);
OBS : Även om e- mail()
kan returnera TRUE
, betyder det inte att e-postmeddelandet skickades eller att e-postmeddelandet kommer att tas emot av mottagaren. Det indikerar bara att e-postmeddelandet framgångsrikt överlämnades till ditt systems e-postsystem.
Om du vill skicka ett HTML-e-postmeddelande finns det inte mycket mer arbete du behöver göra. Du behöver:
- Lägg till
MIME-Version
rubrik - Lägg till rubriken
Content-Type
- Se till att ditt e-postinnehåll är HTML
$to = '[email protected]';
$subject = 'Email Subject';
$message = '<html><body>This is the email message body</body></html>';
$headers = implode("\r\n", [
'From: John Conde <[email protected]>',
'Reply-To: [email protected]',
'MIME-Version: 1.0',
'Content-Type: text/html; charset=ISO-8859-1',
'X-Mailer: PHP/' . PHP_VERSION
]);
Här är ett fullständigt exempel på att använda PHPs mail()
-funktion
<?php
// Debugging tools. Only turn these on in your development environment.
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
// Special mail settings that can make mail less likely to be considered spam
// and offers logging in case of technical difficulties.
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
// The components of our email
$to = '[email protected]';
$subject = 'Email Subject';
$message = 'This is the email message body';
$headers = implode("\r\n", [
'From: [email protected]',
'Reply-To: [email protected]',
'X-Mailer: PHP/' . PHP_VERSION
]);
// Send the email
$result = mail($to, $subject, $message, $headers);
// Check the results and react accordingly
if ($result) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
// Your mail was not sent. Check your logs to see if
// the reason was reported there for you.
}
Se även
Officiell dokumentation
Relaterade stacköverflödesfrågor
- PHP-e-postformuläret fyller inte i att skicka e-post
- Hur ser du till att e-postmeddelanden som du skickar programmatiskt inte automatiskt markeras som skräppost?
- Hur man använder SMTP för att skicka e-post
- Ställer in kuvert från adress
Alternativa mailers
E-postservrar
Relaterade ämnen
Skicka HTML-e-post med e-post ()
<?php
$to = '[email protected]';
$subject = 'Sending an HTML email using mail() in PHP';
$message = '<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>';
$headers = implode("\r\n", [
"From: John Conde <[email protected]>",
"Reply-To: [email protected]",
"X-Mailer: PHP/" . PHP_VERSION,
"MIME-Version: 1.0",
"Content-Type: text/html; charset=UTF-8"
]);
mail($to, $subject, $message, $headers);
Det här är inte mycket annorlunda än att skicka en vanlig text-e-post . De viktigaste skillnaderna i innehållskroppen är strukturerade som ett HTML-dokument och det finns ytterligare två rubriker som måste inkluderas så att e-postklienten vet att skicka e-postmeddelandet som HTML. Dom är:
- MIME-version: 1.0
- Innehållstyp: text / html; charset = UTF-8
Skicka vanlig text-e-post med PHPMailer
Grundläggande text-e-post
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->Subject = "Subject Text";
$mail->Body = "This is a sample basic text email using PHPMailer.";
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Mailer Error: " . $mail->ErrorInfo;
}
Lägga till ytterligare mottagare, CC-mottagare, BCC-mottagare
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->addAddress("[email protected]", "Recepient Name");
$mail->addAddress("[email protected]");
$mail->addCC("[email protected]");
$mail->addBCC("[email protected]");
$mail->Subject = "Subject Text";
$mail->Body = "This is a sample basic text email using PHPMailer.";
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Error: " . $mail->ErrorInfo;
}
Skicka e-post med en bilaga med post ()
<?php
$to = '[email protected]';
$subject = 'Email Subject';
$message = 'This is the email message body';
$attachment = '/path/to/your/file.pdf';
$content = file_get_contents($attachment);
/* Attachment content transferred in Base64 encoding
MUST be split into chunks 76 characters in length as
specified by RFC 2045 section 6.8. By default, the
function chunk_split() uses a chunk length of 76 with
a trailing CRLF (\r\n). The 76 character requirement
does not include the carriage return and line feed */
$content = chunk_split(base64_encode($content));
/* Boundaries delimit multipart entities. As stated
in RFC 2046 section 5.1, the boundary MUST NOT occur
in any encapsulated part. Therefore, it should be
unique. As stated in the following section 5.1.1, a
boundary is defined as a line consisting of two hyphens
("--"), a parameter value, optional linear whitespace,
and a terminating CRLF. */
$prefix = "part_"; // This is an optional prefix
/* Generate a unique boundary parameter value with our
prefix using the uniqid() function. The second parameter
makes the parameter value more unique. */
$boundary = uniqid($prefix, true);
// headers
$headers = implode("\r\n", [
'From: [email protected]',
'Reply-To: [email protected]',
'X-Mailer: PHP/' . PHP_VERSION,
'MIME-Version: 1.0',
// boundary parameter required, must be enclosed by quotes
'Content-Type: multipart/mixed; boundary="' . $boundary . '"',
"Content-Transfer-Encoding: 7bit",
"This is a MIME encoded message." // message for restricted transports
]);
// message and attachment
$message = implode("\r\n", [
"--" . $boundary, // header boundary delimiter line
'Content-Type: text/plain; charset="iso-8859-1"',
"Content-Transfer-Encoding: 8bit",
$message,
"--" . $boundary, // content boundary delimiter line
'Content-Type: application/octet-stream; name="RenamedFile.pdf"',
"Content-Transfer-Encoding: base64",
"Content-Disposition: attachment",
$content,
"--" . $boundary . "--" // closing boundary delimiter line
]);
$result = mail($to, $subject, $message, $headers); // send the email
if ($result) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
// Your mail was not sent. Check your logs to see if
// the reason was reported there for you.
}
Content-Transfer-Kodningar
De tillgängliga kodningarna är 7bit , 8bit , binär , citerad-utskrivbar , base64 , ietf-token och x-token . När en rubrik har en multipart innehållstyp får dessa kodningar inte vara något annat värde än 7 bit , 8 bit eller binärt som anges i RFC 2045, avsnitt 6.4.
Vårt exempel väljer 7bit-kodningen, som representerar US-ASCII-tecken, för multipartrubrik eftersom, som noterat i RFC 2045 avsnitt 6, vissa protokoll endast stöder denna kodning. Data inom gränserna kan sedan kodas på en delvis del (RFC 2046, avsnitt 5.1). Detta exempel gör exakt detta. Den första delen, som innehåller textmeddelandet, definieras som 8bit eftersom det kan vara nödvändigt att stödja ytterligare tecken. I det här fallet används teckenuppsättningen Latin1 (iso-8859-1). Den andra delen är bilagan och så definieras den som en bas64-kodad applikation / oktettström. Eftersom base64 omvandlar godtyckliga data till 7bit-intervallet kan de skickas över begränsade transporter (RFC 2045, avsnitt 6.2).
Skicka HTML-e-post med PHPMailer
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->addAddress("[email protected]", "Recepient Name");
$mail->addAddress("[email protected]");
$mail->addCC("[email protected]");
$mail->addBCC("[email protected]");
$mail->Subject = "Subject Text";
$mail->isHTML(true);
$mail->Body = "<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>";
$mail->AltBody = "This paragraph is not bold.\n\nThis text is not italic.";
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Error: " . $mail->ErrorInfo;
}
Skicka e-post med en bilaga med PHPMailer
<?php
$mail = new PHPMailer();
$mail->From = "[email protected]";
$mail->FromName = "Full Name";
$mail->addReplyTo("[email protected]", "Reply Address");
$mail->Subject = "Subject Text";
$mail->Body = "This is a sample basic text email with an attachment using PHPMailer.";
// Add Static Attachment
$attachment = '/path/to/your/file.pdf';
$mail->AddAttachment($attachment , 'RenamedFile.pdf');
// Add Second Attachment, run-time created. ie: CSV to be open with Excel
$csvHeader = "header1,header2,header3";
$csvData = "row1col1,row1col2,row1col3\nrow2col1,row2col2,row2col3";
$mail->AddStringAttachment($csvHeader ."\n" . $csvData, 'your-csv-file.csv', 'base64', 'application/vnd.ms-excel');
if($mail->send()) {
// Success! Redirect to a thank you page. Use the
// POST/REDIRECT/GET pattern to prevent form resubmissions
// when a user refreshes the page.
header('Location: http://example.com/path/to/thank-you.php', true, 303);
exit;
}
else {
echo "Error: " . $mail->ErrorInfo;
}
Skicka vanlig text-e-post med Sendgrid
Grundläggande text-e-post
<?php
$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email = new SendGrid\Email();
$email->addTo("[email protected]")
->setFrom("[email protected]")
->setSubject("Subject Text")
->setText("This is a sample basic text email using ");
$sendgrid->send($email);
Lägga till ytterligare mottagare, CC-mottagare, BCC-mottagare
<?php
$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email = new SendGrid\Email();
$email->addTo("[email protected]")
->setFrom("[email protected]")
->setSubject("Subject Text")
->setHtml("<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>");
$personalization = new Personalization();
$email = new Email("Recepient Name", "[email protected]");
$personalization->addTo($email);
$email = new Email("RecepientCC Name", "[email protected]");
$personalization->addCc($email);
$email = new Email("RecepientBCC Name", "[email protected]");
$personalization->addBcc($email);
$email->addPersonalization($personalization);
$sendgrid->send($email);
Skicka e-post med en bilaga med Sendgrid
<?php
$sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY");
$email = new SendGrid\Email();
$email->addTo("[email protected]")
->setFrom("[email protected]")
->setSubject("Subject Text")
->setText("This is a sample basic text email using ");
$attachment = '/path/to/your/file.pdf';
$content = file_get_contents($attachment);
$content = chunk_split(base64_encode($content));
$attachment = new Attachment();
$attachment->setContent($content);
$attachment->setType("application/pdf");
$attachment->setFilename("RenamedFile.pdf");
$attachment->setDisposition("attachment");
$email->addAttachment($attachment);
$sendgrid->send($email);