311 lines
16 KiB
Markdown
311 lines
16 KiB
Markdown
|
[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://supportukrainenow.org/)
|
|||
|
|
|||
|
![PHPMailer](https://raw.github.com/PHPMailer/PHPMailer/master/examples/images/phpmailer.png)
|
|||
|
|
|||
|
# PHPMailer – A full-featured email creation and transfer class for PHP
|
|||
|
|
|||
|
[![Test status](https://github.com/PHPMailer/PHPMailer/workflows/Tests/badge.svg)](https://github.com/PHPMailer/PHPMailer/actions)
|
|||
|
[![codecov.io](https://codecov.io/gh/PHPMailer/PHPMailer/branch/master/graph/badge.svg?token=iORZpwmYmM)](https://codecov.io/gh/PHPMailer/PHPMailer)
|
|||
|
[![Latest Stable Version](https://poser.pugx.org/phpmailer/phpmailer/v/stable.svg)](https://packagist.org/packages/phpmailer/phpmailer)
|
|||
|
[![Total Downloads](https://poser.pugx.org/phpmailer/phpmailer/downloads)](https://packagist.org/packages/phpmailer/phpmailer)
|
|||
|
[![License](https://poser.pugx.org/phpmailer/phpmailer/license.svg)](https://packagist.org/packages/phpmailer/phpmailer)
|
|||
|
[![API Docs](https://github.com/phpmailer/phpmailer/workflows/Docs/badge.svg)](https://phpmailer.github.io/PHPMailer/)
|
|||
|
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/PHPMailer/PHPMailer/badge)](https://api.securityscorecards.dev/projects/github.com/PHPMailer/PHPMailer)
|
|||
|
|
|||
|
## Features
|
|||
|
|
|||
|
- Probably the world's most popular code for sending email from PHP!
|
|||
|
- Used by many open-source projects: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more
|
|||
|
- Integrated SMTP support – send without a local mail server
|
|||
|
- Send emails with multiple To, CC, BCC, and Reply-to addresses
|
|||
|
- Multipart/alternative emails for mail clients that do not read HTML email
|
|||
|
- Add attachments, including inline
|
|||
|
- Support for UTF-8 content and 8bit, base64, binary, and quoted-printable encodings
|
|||
|
- SMTP authentication with LOGIN, PLAIN, CRAM-MD5, and XOAUTH2 mechanisms over SMTPS and SMTP+STARTTLS transports
|
|||
|
- Validates email addresses automatically
|
|||
|
- Protects against header injection attacks
|
|||
|
- Error messages in over 50 languages!
|
|||
|
- DKIM and S/MIME signing support
|
|||
|
- Compatible with PHP 5.5 and later, including PHP 8.2
|
|||
|
- Namespaced to prevent name clashes
|
|||
|
- Much more!
|
|||
|
|
|||
|
## Why you might need it
|
|||
|
|
|||
|
Many PHP developers need to send email from their code. The only PHP function that supports this directly
|
|||
|
is [`mail()`](https://www.php.net/manual/en/function.mail.php). However, it does not provide any assistance for making
|
|||
|
use of popular features such as encryption, authentication, HTML messages, and attachments.
|
|||
|
|
|||
|
Formatting email correctly is surprisingly difficult. There are myriad overlapping (and conflicting) standards,
|
|||
|
requiring tight adherence to horribly complicated formatting and encoding rules – the vast majority of code that you'll
|
|||
|
find online that uses the `mail()` function directly is just plain wrong, if not unsafe!
|
|||
|
|
|||
|
The PHP `mail()` function usually sends via a local mail server, typically fronted by a `sendmail` binary on Linux, BSD,
|
|||
|
and macOS platforms, however, Windows usually doesn't include a local mail server; PHPMailer's integrated SMTP client
|
|||
|
allows email sending on all platforms without needing a local mail server. Be aware though, that the `mail()` function
|
|||
|
should be avoided when possible; it's both faster
|
|||
|
and [safer](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html) to use SMTP to localhost.
|
|||
|
|
|||
|
*Please* don't be tempted to do it yourself – if you don't use PHPMailer, there are many other excellent libraries that
|
|||
|
you should look at before rolling your own. Try [SwiftMailer](https://swiftmailer.symfony.com/)
|
|||
|
, [Laminas/Mail](https://docs.laminas.dev/laminas-mail/), [ZetaComponents](https://github.com/zetacomponents/Mail), etc.
|
|||
|
|
|||
|
## License
|
|||
|
|
|||
|
This software is distributed under the [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html) license, along with
|
|||
|
the [GPL Cooperation Commitment](https://gplcc.github.io/gplcc/). Please
|
|||
|
read [LICENSE](https://github.com/PHPMailer/PHPMailer/blob/master/LICENSE) for information on the software availability
|
|||
|
and distribution.
|
|||
|
|
|||
|
## Installation & loading
|
|||
|
|
|||
|
PHPMailer is available on [Packagist](https://packagist.org/packages/phpmailer/phpmailer) (using semantic versioning),
|
|||
|
and installation via [Composer](https://getcomposer.org) is the recommended way to install PHPMailer. Just add this line
|
|||
|
to your `composer.json` file:
|
|||
|
|
|||
|
```json
|
|||
|
"phpmailer/phpmailer": "^6.8.0"
|
|||
|
```
|
|||
|
|
|||
|
or run
|
|||
|
|
|||
|
```sh
|
|||
|
composer require phpmailer/phpmailer
|
|||
|
```
|
|||
|
|
|||
|
Note that the `vendor` folder and the `vendor/autoload.php` script are generated by Composer; they are not part of
|
|||
|
PHPMailer.
|
|||
|
|
|||
|
If you want to use the Gmail XOAUTH2 authentication class, you will also need to add a dependency on
|
|||
|
the `league/oauth2-client` package in your `composer.json`.
|
|||
|
|
|||
|
Alternatively, if you're not using Composer, you
|
|||
|
can [download PHPMailer as a zip file](https://github.com/PHPMailer/PHPMailer/archive/master.zip), (note that docs and
|
|||
|
examples are not included in the zip file), then copy the contents of the PHPMailer folder into one of
|
|||
|
the `include_path` directories specified in your PHP configuration and load each class file manually:
|
|||
|
|
|||
|
```php
|
|||
|
<?php
|
|||
|
use PHPMailer\PHPMailer\PHPMailer;
|
|||
|
use PHPMailer\PHPMailer\Exception;
|
|||
|
|
|||
|
require 'path/to/PHPMailer/src/Exception.php';
|
|||
|
require 'path/to/PHPMailer/src/PHPMailer.php';
|
|||
|
require 'path/to/PHPMailer/src/SMTP.php';
|
|||
|
```
|
|||
|
|
|||
|
If you're not using the `SMTP` class explicitly (you're probably not), you don't need a `use` line for the SMTP class.
|
|||
|
Even if you're not using exceptions, you do still need to load the `Exception` class as it is used internally.
|
|||
|
|
|||
|
## Legacy versions
|
|||
|
|
|||
|
PHPMailer 5.2 (which is compatible with PHP 5.0 — 7.0) is no longer supported, even for security updates. You will find
|
|||
|
the latest version of 5.2 in the [5.2-stable branch](https://github.com/PHPMailer/PHPMailer/tree/5.2-stable). If you're
|
|||
|
using PHP 5.5 or later (which you should be), switch to the 6.x releases.
|
|||
|
|
|||
|
### Upgrading from 5.2
|
|||
|
|
|||
|
The biggest changes are that source files are now in the `src/` folder, and PHPMailer now declares the
|
|||
|
namespace `PHPMailer\PHPMailer`. This has several important
|
|||
|
effects – [read the upgrade guide](https://github.com/PHPMailer/PHPMailer/tree/master/UPGRADING.md) for more details.
|
|||
|
|
|||
|
### Minimal installation
|
|||
|
|
|||
|
While installing the entire package manually or with Composer is simple, convenient, and reliable, you may want to
|
|||
|
include only vital files in your project. At the very least you will
|
|||
|
need [src/PHPMailer.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/PHPMailer.php). If you're using SMTP,
|
|||
|
you'll need [src/SMTP.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/SMTP.php), and if you're using
|
|||
|
POP-before SMTP (*very* unlikely!), you'll
|
|||
|
need [src/POP3.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/POP3.php). You can skip
|
|||
|
the [language](https://github.com/PHPMailer/PHPMailer/tree/master/language/) folder if you're not showing errors to
|
|||
|
users and can make do with English-only errors. If you're using XOAUTH2 you will
|
|||
|
need [src/OAuth.php](https://github.com/PHPMailer/PHPMailer/tree/master/src/OAuth.php) as well as the Composer
|
|||
|
dependencies for the services you wish to authenticate with. Really, it's much easier to use Composer!
|
|||
|
|
|||
|
## A Simple Example
|
|||
|
|
|||
|
```php
|
|||
|
<?php
|
|||
|
//Import PHPMailer classes into the global namespace
|
|||
|
//These must be at the top of your script, not inside a function
|
|||
|
use PHPMailer\PHPMailer\PHPMailer;
|
|||
|
use PHPMailer\PHPMailer\SMTP;
|
|||
|
use PHPMailer\PHPMailer\Exception;
|
|||
|
|
|||
|
//Load Composer's autoloader
|
|||
|
require 'vendor/autoload.php';
|
|||
|
|
|||
|
//Create an instance; passing `true` enables exceptions
|
|||
|
$mail = new PHPMailer(true);
|
|||
|
|
|||
|
try {
|
|||
|
//Server settings
|
|||
|
$mail->SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output
|
|||
|
$mail->isSMTP(); //Send using SMTP
|
|||
|
$mail->Host = 'smtp.example.com'; //Set the SMTP server to send through
|
|||
|
$mail->SMTPAuth = true; //Enable SMTP authentication
|
|||
|
$mail->Username = 'user@example.com'; //SMTP username
|
|||
|
$mail->Password = 'secret'; //SMTP password
|
|||
|
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption
|
|||
|
$mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
|
|||
|
|
|||
|
//Recipients
|
|||
|
$mail->setFrom('from@example.com', 'Mailer');
|
|||
|
$mail->addAddress('joe@example.net', 'Joe User'); //Add a recipient
|
|||
|
$mail->addAddress('ellen@example.com'); //Name is optional
|
|||
|
$mail->addReplyTo('info@example.com', 'Information');
|
|||
|
$mail->addCC('cc@example.com');
|
|||
|
$mail->addBCC('bcc@example.com');
|
|||
|
|
|||
|
//Attachments
|
|||
|
$mail->addAttachment('/var/tmp/file.tar.gz'); //Add attachments
|
|||
|
$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); //Optional name
|
|||
|
|
|||
|
//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();
|
|||
|
echo 'Message has been sent';
|
|||
|
} catch (Exception $e) {
|
|||
|
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
You'll find plenty to play with in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder,
|
|||
|
which covers many common scenarios including sending through Gmail, building contact forms, sending to mailing lists,
|
|||
|
and more.
|
|||
|
|
|||
|
If you are re-using the instance (e.g. when sending to a mailing list), you may need to clear the recipient list to
|
|||
|
avoid sending duplicate messages.
|
|||
|
See [the mailing list example](https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps) for
|
|||
|
further guidance.
|
|||
|
|
|||
|
That's it. You should now be ready to use PHPMailer!
|
|||
|
|
|||
|
## Localization
|
|||
|
|
|||
|
PHPMailer defaults to English, but in the [language](https://github.com/PHPMailer/PHPMailer/tree/master/language/)
|
|||
|
folder, you'll find many translations for PHPMailer error messages that you may encounter. Their filenames
|
|||
|
contain [ISO 639-1](http://en.wikipedia.org/wiki/ISO_639-1) language code for the translations, for example `fr` for
|
|||
|
French. To specify a language, you need to tell PHPMailer which one to use, like this:
|
|||
|
|
|||
|
```php
|
|||
|
//To load the French version
|
|||
|
$mail->setLanguage('fr', '/optional/path/to/language/directory/');
|
|||
|
```
|
|||
|
|
|||
|
We welcome corrections and new languages – if you're looking for corrections, run
|
|||
|
the [PHPMailerLangTest.php](https://github.com/PHPMailer/PHPMailer/tree/master/test/PHPMailerLangTest.php) script in the
|
|||
|
tests folder and it will show any missing translations.
|
|||
|
|
|||
|
## Documentation
|
|||
|
|
|||
|
Start reading at the [GitHub wiki](https://github.com/PHPMailer/PHPMailer/wiki). If you're having trouble, head
|
|||
|
for [the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting) as it's frequently updated.
|
|||
|
|
|||
|
Examples of how to use PHPMailer for common scenarios can be found in
|
|||
|
the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder. If you're looking for a good
|
|||
|
starting point, we recommend you start
|
|||
|
with [the Gmail example](https://github.com/PHPMailer/PHPMailer/tree/master/examples/gmail.phps).
|
|||
|
|
|||
|
To reduce PHPMailer's deployed code footprint, examples are not included if you load PHPMailer via Composer or
|
|||
|
via [GitHub's zip file download](https://github.com/PHPMailer/PHPMailer/archive/master.zip), so you'll need to either
|
|||
|
clone the git repository or use the above links to get to the examples directly.
|
|||
|
|
|||
|
Complete generated API documentation is [available online](https://phpmailer.github.io/PHPMailer/).
|
|||
|
|
|||
|
You can generate complete API-level documentation by running `phpdoc` in the top-level folder, and documentation will
|
|||
|
appear in the `docs` folder, though you'll need to have [PHPDocumentor](http://www.phpdoc.org) installed. You may
|
|||
|
find [the unit tests](https://github.com/PHPMailer/PHPMailer/blob/master/test/PHPMailerTest.php) a good reference for
|
|||
|
how to do various operations such as encryption.
|
|||
|
|
|||
|
If the documentation doesn't cover what you need, search
|
|||
|
the [many questions on Stack Overflow](http://stackoverflow.com/questions/tagged/phpmailer), and before you ask a
|
|||
|
question about "SMTP Error: Could not connect to SMTP
|
|||
|
host.", [read the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting).
|
|||
|
|
|||
|
## Tests
|
|||
|
|
|||
|
[PHPMailer tests](https://github.com/PHPMailer/PHPMailer/tree/master/test/) use PHPUnit 9,
|
|||
|
with [a polyfill](https://github.com/Yoast/PHPUnit-Polyfills) to let 9-style tests run on older PHPUnit and PHP
|
|||
|
versions.
|
|||
|
|
|||
|
[![Test status](https://github.com/PHPMailer/PHPMailer/workflows/Tests/badge.svg)](https://github.com/PHPMailer/PHPMailer/actions)
|
|||
|
|
|||
|
If this isn't passing, is there something you can do to help?
|
|||
|
|
|||
|
## Security
|
|||
|
|
|||
|
Please disclose any vulnerabilities found responsibly – report security issues to the maintainers privately.
|
|||
|
|
|||
|
See [SECURITY](https://github.com/PHPMailer/PHPMailer/tree/master/SECURITY.md)
|
|||
|
and [PHPMailer's security advisories on GitHub](https://github.com/PHPMailer/PHPMailer/security).
|
|||
|
|
|||
|
## Contributing
|
|||
|
|
|||
|
Please submit bug reports, suggestions, and pull requests to
|
|||
|
the [GitHub issue tracker](https://github.com/PHPMailer/PHPMailer/issues).
|
|||
|
|
|||
|
We're particularly interested in fixing edge cases, expanding test coverage, and updating translations.
|
|||
|
|
|||
|
If you found a mistake in the docs, or want to add something, go ahead and amend the wiki – anyone can edit it.
|
|||
|
|
|||
|
If you have git clones from prior to the move to the PHPMailer GitHub organisation, you'll need to update any remote
|
|||
|
URLs referencing the old GitHub location with a command like this from within your clone:
|
|||
|
|
|||
|
```sh
|
|||
|
git remote set-url upstream https://github.com/PHPMailer/PHPMailer.git
|
|||
|
```
|
|||
|
|
|||
|
Please *don't* use the SourceForge or Google Code projects any more; they are obsolete and no longer maintained.
|
|||
|
|
|||
|
## Sponsorship
|
|||
|
|
|||
|
Development time and resources for PHPMailer are provided by [Smartmessages.net](https://info.smartmessages.net/), the
|
|||
|
world's only privacy-first email marketing system.
|
|||
|
|
|||
|
<a href="https://info.smartmessages.net/"><img src="https://www.smartmessages.net/img/smartmessages-logo.svg" width="550" alt="Smartmessages.net privacy-first email marketing logo"></a>
|
|||
|
|
|||
|
Donations are very welcome, whether in beer 🍺, T-shirts 👕, or cold, hard cash 💰. Sponsorship through GitHub is a simple
|
|||
|
and convenient way to say "thank you" to PHPMailer's maintainers and contributors – just click the "Sponsor"
|
|||
|
button [on the project page](https://github.com/PHPMailer/PHPMailer). If your company uses PHPMailer, consider taking
|
|||
|
part in Tidelift's enterprise support programme.
|
|||
|
|
|||
|
## PHPMailer For Enterprise
|
|||
|
|
|||
|
Available as part of the Tidelift Subscription.
|
|||
|
|
|||
|
The maintainers of PHPMailer and thousands of other packages are working with Tidelift to deliver commercial
|
|||
|
support and maintenance for the open-source packages you use to build your applications. Save time, reduce risk, and
|
|||
|
improve code health, while paying the maintainers of the exact packages you
|
|||
|
use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-phpmailer-phpmailer?utm_source=packagist-phpmailer-phpmailer&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
|
|||
|
|
|||
|
## Changelog
|
|||
|
|
|||
|
See [changelog](changelog.md).
|
|||
|
|
|||
|
## History
|
|||
|
|
|||
|
- PHPMailer was originally written in 2001 by Brent R. Matzelle as
|
|||
|
a [SourceForge project](http://sourceforge.net/projects/phpmailer/).
|
|||
|
- [Marcus Bointon](https://github.com/Synchro) (`coolbru` on SF) and Andy Prevost (`codeworxtech`) took over the project
|
|||
|
in 2004.
|
|||
|
- Became an Apache incubator project on Google Code in 2010, managed by Jim Jagielski.
|
|||
|
- Marcus created [his fork on GitHub](https://github.com/Synchro/PHPMailer) in 2008.
|
|||
|
- Jim and Marcus decide to join forces and use GitHub as the canonical and official repo for PHPMailer in 2013.
|
|||
|
- PHPMailer moves to [the PHPMailer organisation](https://github.com/PHPMailer) on GitHub in 2013.
|
|||
|
|
|||
|
### What's changed since moving from SourceForge?
|
|||
|
|
|||
|
- Official successor to the SourceForge and Google Code projects.
|
|||
|
- Test suite.
|
|||
|
- Continuous integration with GitHub Actions.
|
|||
|
- Composer support.
|
|||
|
- Public development.
|
|||
|
- Additional languages and language strings.
|
|||
|
- CRAM-MD5 authentication support.
|
|||
|
- Preserves full repo history of authors, commits, and branches from the original SourceForge project.
|