Compare commits
No commits in common. "phpmailer-2.3.0@186" and "master" have entirely different histories.
phpmailer-
...
master
|
|
@ -0,0 +1,21 @@
|
|||
codecov:
|
||||
notify:
|
||||
after_n_builds: 2
|
||||
|
||||
coverage:
|
||||
round: nearest
|
||||
# Status will be green when coverage is between 70 and 100%.
|
||||
range: "70...100"
|
||||
status:
|
||||
project:
|
||||
default:
|
||||
threshold: 2%
|
||||
paths:
|
||||
- "src"
|
||||
patch:
|
||||
default:
|
||||
threshold: 0%
|
||||
paths:
|
||||
- "src"
|
||||
|
||||
comment: false
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.{yml,yaml}]
|
||||
indent_size = 2
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
* text=auto
|
||||
|
||||
/.codecov.yml export-ignore
|
||||
/.editorconfig export-ignore
|
||||
/.gitattributes export-ignore
|
||||
/.github export-ignore
|
||||
/.gitignore export-ignore
|
||||
/.phan export-ignore
|
||||
/.scrutinizer.yml export-ignore
|
||||
/changelog.md export-ignore
|
||||
/docs export-ignore
|
||||
/examples export-ignore
|
||||
/phpcs.xml.dist export-ignore
|
||||
/phpdoc.dist.xml export-ignore
|
||||
/phpunit.xml.dist export-ignore
|
||||
/test export-ignore
|
||||
/UPGRADING.md export-ignore
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
github: Synchro
|
||||
patreon: marcusbointon
|
||||
tidelift: "packagist/phpmailer/phpmailer"
|
||||
custom: https://marcus.bointon.com/donations/
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: If you've found a bug in PHPMailer, this is the right place to report it
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
Please check these things before submitting your issue:
|
||||
|
||||
- [ ] *Read the error message* you're seeing - it often tells you what is wrong, and may contain useful links & instructions
|
||||
- [ ] Make sure you're using the latest version of PHPMailer
|
||||
- [ ] Check that your problem is not dealt with in [the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting), especially if you're having problems connecting to Gmail or GoDaddy
|
||||
- [ ] Include sufficient code to reproduce your problem
|
||||
- [ ] If you're having an SMTP issue, include the debug output generated with `SMTPDebug = 2` set
|
||||
- [ ] If you have a question about how to use PHPMailer (rather than reporting a bug in it), tag a question on Stack Overflow with `phpmailer`, but [**search first**](https://stackoverflow.com/questions/tagged/phpmailer)!
|
||||
|
||||
# Problem description
|
||||
|
||||
# Code to reproduce
|
||||
|
||||
# Debug output
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
FROM phpdoc/phpdoc
|
||||
|
||||
LABEL "repository"="https://github.com/PHPMailer/PHPMailer"
|
||||
|
||||
LABEL "com.github.actions.name"="Build Docs"
|
||||
LABEL "com.github.actions.description"="Build Docs with phpDocumentor"
|
||||
LABEL "com.github.actions.icon"="file-text"
|
||||
LABEL "com.github.actions.color"="blue"
|
||||
|
||||
# don't show errors
|
||||
RUN echo "display_errors = Off" > $PHP_INI_DIR/conf.d/errors.ini
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -eu
|
||||
|
||||
/opt/phpdoc/bin/phpdoc
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
# Dependabot configuration.
|
||||
#
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "cron"
|
||||
cronjob: "10 22 5,20 * *" # At 22:10, every 5th and 20th day of the month.
|
||||
open-pull-requests-limit: 5
|
||||
commit-message:
|
||||
prefix: "GH Actions:"
|
||||
groups:
|
||||
action-runners:
|
||||
applies-to: version-updates
|
||||
update-types:
|
||||
- "minor"
|
||||
- "patch"
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
name: Docs
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
permissions: {}
|
||||
jobs:
|
||||
build_and_publish:
|
||||
permissions:
|
||||
contents: write # to push changes in repo (jamesives/github-pages-deploy-action)
|
||||
|
||||
name: Build and publish Docs
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository == 'PHPMailer/PHPMailer'
|
||||
steps:
|
||||
- name: Checkout sources
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
fetch-depth: 1
|
||||
persist-credentials: false
|
||||
- name: Build Docs
|
||||
uses: ./.github/actions/build-docs
|
||||
- name: Publish Docs to gh-pages
|
||||
uses: JamesIves/github-pages-deploy-action@9d877eea73427180ae43cf98e8914934fe157a1a # v4.7.6
|
||||
with:
|
||||
branch: gh-pages
|
||||
folder: docs
|
||||
env:
|
||||
BUILD_DIR: docs/
|
||||
GH_PAT: ${{ secrets.GH_PAT }}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
name: Scorecards supply-chain security
|
||||
on:
|
||||
# Only the default branch is supported.
|
||||
branch_protection_rule:
|
||||
schedule:
|
||||
- cron: '39 20 * * 1'
|
||||
push:
|
||||
branches: [ "master" ]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
analysis:
|
||||
# Don't run the cron job on forks.
|
||||
if: ${{ github.event_name != 'schedule' || github.event.repository.fork == false }}
|
||||
|
||||
name: Scorecards analysis
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
# Required when publishing results (badge / API / code scanning)
|
||||
security-events: write
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: "Checkout code"
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: "Run analysis"
|
||||
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
|
||||
with:
|
||||
results_file: results.sarif
|
||||
results_format: sarif
|
||||
# (Optional) Read-only PAT token. Uncomment the `repo_token` line below if:
|
||||
# - you want to enable the Branch-Protection check on a *public* repository, or
|
||||
# - you are installing Scorecards on a *private* repository
|
||||
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat.
|
||||
# repo_token: ${{ secrets.SCORECARD_READ_TOKEN }}
|
||||
|
||||
# Publish the results for public repositories to enable scorecard badges. For more details, see
|
||||
# https://github.com/ossf/scorecard-action#publishing-results.
|
||||
# For private repositories, `publish_results` will automatically be set to `false`, regardless
|
||||
# of the value entered here.
|
||||
publish_results: true
|
||||
|
||||
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
|
||||
# format to the repository Actions tab.
|
||||
- name: "Upload artifact"
|
||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||
with:
|
||||
name: SARIF file
|
||||
path: results.sarif
|
||||
retention-days: 5
|
||||
|
||||
# Upload the results to GitHub's code scanning dashboard.
|
||||
- name: "Upload to code-scanning"
|
||||
uses: github/codeql-action/upload-sarif@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
|
@ -0,0 +1,237 @@
|
|||
name: "Tests"
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
# Allow manually triggering the workflow.
|
||||
workflow_dispatch:
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
|
||||
coding-standard:
|
||||
runs-on: ubuntu-22.04
|
||||
name: Coding standards
|
||||
|
||||
permissions:
|
||||
contents: read # to fetch code (actions/checkout)
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set up PHP
|
||||
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # 2.36.0
|
||||
with:
|
||||
php-version: 'latest'
|
||||
coverage: none
|
||||
tools: cs2pr
|
||||
|
||||
# Install dependencies and handle caching in one go.
|
||||
# @link https://github.com/marketplace/actions/install-php-dependencies-with-composer
|
||||
- name: Install Composer dependencies
|
||||
uses: "ramsey/composer-install@3cf229dc2919194e9e36783941438d17239e8520" # 3.1.1
|
||||
with:
|
||||
# Bust the cache at least once a month - output format: YYYY-MM.
|
||||
custom-cache-suffix: $(date -u "+%Y-%m")
|
||||
|
||||
- name: Check coding standards
|
||||
id: phpcs
|
||||
run: ./vendor/bin/phpcs -s --report-full --report-checkstyle=./phpcs-report.xml
|
||||
|
||||
- name: Show PHPCS results in PR
|
||||
if: ${{ always() && steps.phpcs.outcome == 'failure' }}
|
||||
run: cs2pr ./phpcs-report.xml
|
||||
|
||||
lint:
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
php: ['5.5', '7.2', '8.0', '8.5']
|
||||
experimental: [false]
|
||||
include:
|
||||
- php: 'nightly'
|
||||
experimental: true
|
||||
|
||||
name: "Lint: PHP ${{ matrix.php }}"
|
||||
continue-on-error: ${{ matrix.experimental }}
|
||||
|
||||
permissions:
|
||||
contents: read # to fetch code (actions/checkout)
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Install PHP
|
||||
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # 2.36.0
|
||||
with:
|
||||
php-version: ${{ matrix.php }}
|
||||
ini-values: error_reporting=-1, display_errors=On, display_startup_errors=On
|
||||
coverage: none
|
||||
tools: cs2pr
|
||||
|
||||
# Install dependencies and handle caching in one go.
|
||||
# @link https://github.com/marketplace/actions/install-php-dependencies-with-composer
|
||||
- name: Install Composer dependencies
|
||||
uses: "ramsey/composer-install@3cf229dc2919194e9e36783941438d17239e8520" # 3.1.1
|
||||
with:
|
||||
# Bust the cache at least once a month - output format: YYYY-MM.
|
||||
custom-cache-suffix: $(date -u "+%Y-%m")
|
||||
|
||||
- name: Lint against parse errors
|
||||
if: ${{ matrix.php != 'nightly' }}
|
||||
run: composer lint -- --checkstyle | cs2pr
|
||||
|
||||
- name: Lint against future parse errors (PHP nightly)
|
||||
if: ${{ matrix.php == 'nightly' }}
|
||||
run: composer lint
|
||||
|
||||
test:
|
||||
needs: ['coding-standard', 'lint']
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
matrix:
|
||||
php: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4']
|
||||
extensions: ['optimal', 'minimal']
|
||||
coverage: [false]
|
||||
experimental: [false]
|
||||
include:
|
||||
# Run code coverage on high/low PHP.
|
||||
- php: '5.5'
|
||||
extensions: 'optimal'
|
||||
coverage: true
|
||||
experimental: false
|
||||
- php: '5.5'
|
||||
extensions: 'minimal'
|
||||
coverage: true
|
||||
experimental: false
|
||||
- php: '8.5'
|
||||
extensions: 'optimal'
|
||||
coverage: true
|
||||
experimental: false
|
||||
- php: '8.5'
|
||||
extensions: 'minimal'
|
||||
coverage: true
|
||||
experimental: false
|
||||
|
||||
# Experimental builds. These are allowed to fail.
|
||||
- php: '8.6'
|
||||
extensions: 'optimal'
|
||||
coverage: false
|
||||
experimental: true
|
||||
- php: '8.6'
|
||||
extensions: 'minimal'
|
||||
coverage: false
|
||||
experimental: true
|
||||
|
||||
name: "Test: PHP ${{ matrix.php }} - ${{ matrix.extensions }}"
|
||||
|
||||
continue-on-error: ${{ matrix.experimental }}
|
||||
|
||||
permissions:
|
||||
contents: read # to fetch code (actions/checkout)
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
# About the "extensions":
|
||||
#
|
||||
# In a "normal" test run, the "default" extension set for a PHP version is used
|
||||
# and it is ensured that certain extensions will be available, no matter what.
|
||||
#
|
||||
# For the "minimal" test run, all extensions are disabled and then only
|
||||
# a limited set of minimally required extensions are re-enabled.
|
||||
# The minimal set is based on the required extensions from PHPUnit + PHPMailer combined
|
||||
# + Curl for Composer.
|
||||
# Whether Xdebug will be enabled depends on the code coverage settings.
|
||||
#
|
||||
# Also see:
|
||||
# https://github.com/shivammathur/setup-php/?tab=readme-ov-file#heavy_plus_sign-php-extension-support
|
||||
# https://github.com/shivammathur/setup-php/wiki
|
||||
- name: Determine extensions to use
|
||||
id: set_extensions
|
||||
run: |
|
||||
if [[ "${{ matrix.extensions }}" == "optimal" ]]; then
|
||||
# Optimal.
|
||||
echo 'EXT=imap, mbstring, openssl, intl, ctype, filter, hash' >> $GITHUB_OUTPUT
|
||||
echo 'COMPOSER_OPTIONS=' >> $GITHUB_OUTPUT
|
||||
else
|
||||
# Minimal.
|
||||
echo 'EXT=none, curl, dom, json, libxml, mbstring, tokenizer, xml, xmlwriter, ctype, filter, hash' >> $GITHUB_OUTPUT
|
||||
echo 'COMPOSER_OPTIONS=--ignore-platform-req=ext-simplexml' >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Set up PHP
|
||||
uses: shivammathur/setup-php@44454db4f0199b8b9685a5d763dc37cbf79108e1 # 2.36.0
|
||||
with:
|
||||
php-version: ${{ matrix.php }}
|
||||
coverage: ${{ matrix.coverage && 'xdebug' || 'none' }}
|
||||
ini-values: sendmail_path=/usr/sbin/sendmail -t -i, error_reporting=-1, display_errors=On, display_startup_errors=On
|
||||
extensions: ${{ steps.set_extensions.outputs.EXT }}
|
||||
|
||||
# Install dependencies and handle caching in one go.
|
||||
# @link https://github.com/marketplace/actions/install-php-dependencies-with-composer
|
||||
- name: Install PHP packages - normal
|
||||
if: ${{ matrix.php != '8.6' }}
|
||||
uses: "ramsey/composer-install@3cf229dc2919194e9e36783941438d17239e8520" # 3.1.1
|
||||
with:
|
||||
composer-options: ${{ steps.set_extensions.outputs.COMPOSER_OPTIONS }}
|
||||
# Bust the cache at least once a month - output format: YYYY-MM.
|
||||
custom-cache-suffix: $(date -u "+%Y-%m")
|
||||
|
||||
- name: Install PHP packages - ignore-platform-reqs
|
||||
if: ${{ matrix.php == '8.6' }}
|
||||
uses: "ramsey/composer-install@3cf229dc2919194e9e36783941438d17239e8520" # 3.1.1
|
||||
with:
|
||||
composer-options: --ignore-platform-reqs ${{ steps.set_extensions.outputs.COMPOSER_OPTIONS }}
|
||||
# Bust the cache at least once a month - output format: YYYY-MM.
|
||||
custom-cache-suffix: $(date -u "+%Y-%m")
|
||||
|
||||
# Install postfix and automatically retry if the install failed, which happens reguarly.
|
||||
# @link https://github.com/marketplace/actions/retry-step
|
||||
- name: Install postfix
|
||||
uses: nick-invision/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # v3.0.2
|
||||
with:
|
||||
timeout_minutes: 2
|
||||
max_attempts: 3
|
||||
retry_wait_seconds: 8
|
||||
command: |
|
||||
sudo apt-get install --fix-broken -y libsqlite3-0 postfix
|
||||
sudo systemctl stop postfix.service
|
||||
|
||||
- name: Set up sendmail
|
||||
run: |
|
||||
smtp-sink -d "%d.%H.%M.%S" localhost:2500 1000 &
|
||||
mkdir -p build/logs
|
||||
sudo cp test/testbootstrap-dist.php test/testbootstrap.php
|
||||
sudo chmod +x test/fakesendmail.sh
|
||||
sudo mkdir -p /var/qmail/bin
|
||||
sudo cp test/fakesendmail.sh /var/qmail/bin/sendmail
|
||||
sudo cp test/fakesendmail.sh /usr/sbin/sendmail
|
||||
|
||||
- name: Run tests, no code coverage
|
||||
if: ${{ matrix.coverage == false }}
|
||||
run: ./vendor/bin/phpunit --no-coverage
|
||||
|
||||
- name: Run tests with code coverage
|
||||
if: ${{ matrix.coverage == true }}
|
||||
run: vendor/bin/phpunit
|
||||
|
||||
- name: Send coverage report to Codecov
|
||||
if: ${{ success() && matrix.coverage == true && github.event.repository.fork == false }}
|
||||
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
|
||||
env:
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
with:
|
||||
files: ./build/logs/clover.xml
|
||||
fail_ci_if_error: true
|
||||
verbose: true
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
docs/*
|
||||
!docs/README.md
|
||||
test/message.txt
|
||||
test/testbootstrap.php
|
||||
build/
|
||||
vendor/
|
||||
*.pem
|
||||
composer.lock
|
||||
.phpcs.xml
|
||||
phpcs.xml
|
||||
.phpcs-cache
|
||||
/.rnd
|
||||
test/PHPMailerTest.php*nonexistent_file.txt
|
||||
test/*/PHPMailerTest.php*nonexistent_file.txt
|
||||
phpunit.xml
|
||||
/.phpunit.result.cache
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This configuration will be read and overlaid on top of the
|
||||
* default configuration. Command line arguments will be applied
|
||||
* after this file is read.
|
||||
*/
|
||||
return [
|
||||
|
||||
// A list of directories that should be parsed for class and
|
||||
// method information. After excluding the directories
|
||||
// defined in exclude_analysis_directory_list, the remaining
|
||||
// files will be statically analyzed for errors.
|
||||
//
|
||||
// Thus, both first-party and third-party code being used by
|
||||
// your application should be included in this list.
|
||||
'directory_list' => [
|
||||
'src',
|
||||
'vendor',
|
||||
'examples'
|
||||
],
|
||||
|
||||
// A directory list that defines files that will be excluded
|
||||
// from static analysis, but whose class and method
|
||||
// information should be included.
|
||||
//
|
||||
// Generally, you'll want to include the directories for
|
||||
// third-party code (such as "vendor/") in this list.
|
||||
//
|
||||
// n.b.: If you'd like to parse but not analyze 3rd
|
||||
// party code, directories containing that code
|
||||
// should be added to the `directory_list` as
|
||||
// to `exclude_analysis_directory_list`.
|
||||
"exclude_analysis_directory_list" => [
|
||||
'vendor/'
|
||||
],
|
||||
|
||||
'skip_slow_php_options_warning' => true,
|
||||
|
||||
'exclude_file_regex' => '@^vendor/.*/(tests|Tests)/@',
|
||||
];
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
GPL Cooperation Commitment
|
||||
Version 1.0
|
||||
|
||||
Before filing or continuing to prosecute any legal proceeding or claim
|
||||
(other than a Defensive Action) arising from termination of a Covered
|
||||
License, we commit to extend to the person or entity ('you') accused
|
||||
of violating the Covered License the following provisions regarding
|
||||
cure and reinstatement, taken from GPL version 3. As used here, the
|
||||
term 'this License' refers to the specific Covered License being
|
||||
enforced.
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly
|
||||
and finally terminates your license, and (b) permanently, if the
|
||||
copyright holder fails to notify you of the violation by some
|
||||
reasonable means prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you
|
||||
have received notice of violation of this License (for any work)
|
||||
from that copyright holder, and you cure the violation prior to 30
|
||||
days after your receipt of the notice.
|
||||
|
||||
We intend this Commitment to be irrevocable, and binding and
|
||||
enforceable against us and assignees of or successors to our
|
||||
copyrights.
|
||||
|
||||
Definitions
|
||||
|
||||
'Covered License' means the GNU General Public License, version 2
|
||||
(GPLv2), the GNU Lesser General Public License, version 2.1
|
||||
(LGPLv2.1), or the GNU Library General Public License, version 2
|
||||
(LGPLv2), all as published by the Free Software Foundation.
|
||||
|
||||
'Defensive Action' means a legal proceeding or claim that We bring
|
||||
against you in response to a prior proceeding or claim initiated by
|
||||
you or your affiliate.
|
||||
|
||||
'We' means each contributor to this repository as of the date of
|
||||
inclusion of this file, including subsidiaries of a corporate
|
||||
contributor.
|
||||
|
||||
This work is available under a Creative Commons Attribution-ShareAlike
|
||||
4.0 International license (https://creativecommons.org/licenses/by-sa/4.0/).
|
||||
311
ChangeLog.txt
|
|
@ -1,311 +0,0 @@
|
|||
ChangeLog
|
||||
|
||||
NOTE: THIS VERSION OF PHPMAILER IS DESIGNED FOR PHP5/PHP6. IT WILL NOT WORK WITH PHP4.
|
||||
|
||||
Version 2.2.1 () July 19 2008
|
||||
|
||||
* fixed line 1092 in class.smtp.php (my apologies, error on my part)
|
||||
|
||||
Version 2.2 () July 15 2008
|
||||
|
||||
* Fixed redirect issue (display of UTF-8 in thank you redirect)
|
||||
* fixed error in getResponse function declaration (class.pop3.php)
|
||||
* PHPMailer now PHP6 compliant
|
||||
* fixed line 1092 in class.smtp.php (endless loop from missing = sign)
|
||||
|
||||
Version 2.1 (Wed, June 04 2008)
|
||||
|
||||
** NOTE: WE HAVE A NEW LANGUAGE VARIABLE FOR DIGITALLY SIGNED S/MIME EMAILS.
|
||||
IF YOU CAN HELP WITH LANGUAGES OTHER THAN ENGLISH AND SPANISH, IT WOULD BE
|
||||
APPRECIATED.
|
||||
|
||||
* added S/MIME functionality (ability to digitally sign emails)
|
||||
BIG THANKS TO "sergiocambra" for posting this patch back in November 2007.
|
||||
The "Signed Emails" functionality adds the Sign method to pass the private key
|
||||
filename and the password to read it, and then email will be sent with
|
||||
content-type multipart/signed and with the digital signature attached.
|
||||
* fully compatible with E_STRICT error level
|
||||
- Please note:
|
||||
In about half the test environments this development version was subjected
|
||||
to, an error was thrown for the date() functions used (line 1565 and 1569).
|
||||
This is NOT a PHPMailer error, it is the result of an incorrectly configured
|
||||
PHP5 installation. The fix is to modify your 'php.ini' file and include the
|
||||
date.timezone = America/New York
|
||||
directive, to your own server timezone
|
||||
- If you do get this error, and are unable to access your php.ini file:
|
||||
In your PHP script, add
|
||||
date_default_timezone_set('America/Toronto');
|
||||
- do not try to use
|
||||
$myVar = date_default_timezone_get();
|
||||
as a test, it will throw an error.
|
||||
* added ability to define path (mainly for embedded images)
|
||||
function MsgHTML($message,$basedir='') ... where:
|
||||
$basedir is the fully qualified path
|
||||
* fixed MsgHTML() function:
|
||||
- Embedded Images where images are specified by <protocol>:// will not be altered or embedded
|
||||
* fixed the return value of SMTP exit code ( pclose )
|
||||
* addressed issue of multibyte characters in subject line and truncating
|
||||
* added ability to have user specified Message ID
|
||||
(default is still that PHPMailer create a unique Message ID)
|
||||
* corrected unidentified message type to 'application/octet-stream'
|
||||
* fixed chunk_split() multibyte issue (thanks to Colin Brown, et al).
|
||||
* added check for added attachments
|
||||
* enhanced conversion of HTML to text in MsgHTML (thanks to "brunny")
|
||||
|
||||
Version 2.1.0beta2 (Sun, Dec 02 2007)
|
||||
* implemented updated EncodeQP (thanks to coolbru, aka Marcus Bointon)
|
||||
* finished all testing, all known bugs corrected, enhancements tested
|
||||
- note: will NOT work with PHP4.
|
||||
|
||||
please note, this is BETA software
|
||||
** DO NOT USE THIS IN PRODUCTION OR LIVE PROJECTS
|
||||
INTENDED STRICTLY FOR TESTING
|
||||
|
||||
Version 2.1.0beta1
|
||||
please note, this is BETA software
|
||||
** DO NOT USE THIS IN PRODUCTION OR LIVE PROJECTS
|
||||
INTENDED STRICTLY FOR TESTING
|
||||
|
||||
Version 2.0.0 rc2 (Fri, Nov 16 2007), interim release
|
||||
* implements new property to control VERP in class.smtp.php
|
||||
example (requires instantiating class.smtp.php):
|
||||
$mail->do_verp = true;
|
||||
* POP-before-SMTP functionality included, thanks to Richard Davey
|
||||
(see class.pop3.php & pop3_before_smtp_test.php for examples)
|
||||
* included example showing how to use PHPMailer with GMAIL
|
||||
* fixed the missing Cc in SendMail() and Mail()
|
||||
|
||||
******************
|
||||
A note on sending bulk emails:
|
||||
|
||||
If the email you are sending is not personalized, consider using the
|
||||
"undisclosed-recipient:;" strategy. That is, put all of your recipients
|
||||
in the Bcc field and set the To field to "undisclosed-recipients:;".
|
||||
It's a lot faster (only one send) and saves quite a bit on resources.
|
||||
Contrary to some opinions, this will not get you listed in spam engines -
|
||||
it's a legitimate way for you to send emails.
|
||||
|
||||
A partial example for use with PHPMailer:
|
||||
|
||||
$mail->AddAddress("undisclosed-recipients:;");
|
||||
$mail->AddBCC("email1@anydomain.com,email2@anyotherdomain.com,email3@anyalternatedomain.com");
|
||||
|
||||
Many email service providers restrict the number of emails that can be sent
|
||||
in any given time period. Often that is between 50 - 60 emails maximum
|
||||
per hour or per send session.
|
||||
|
||||
If that's the case, then break up your Bcc lists into chunks that are one
|
||||
less than your limit, and put a pause in your script.
|
||||
*******************
|
||||
|
||||
Version 2.0.0 rc1 (Thu, Nov 08 2007), interim release
|
||||
* dramatically simplified using inline graphics ... it's fully automated and requires no user input
|
||||
* added automatic document type detection for attachments and pictures
|
||||
* added MsgHTML() function to replace Body tag for HTML emails
|
||||
* fixed the SendMail security issues (input validation vulnerability)
|
||||
* enhanced the AddAddresses functionality so that the "Name" portion is used in the email address
|
||||
* removed the need to use the AltBody method (set from the HTML, or default text used)
|
||||
* set the PHP Mail() function as the default (still support SendMail, SMTP Mail)
|
||||
* removed the need to set the IsHTML property (set automatically)
|
||||
* added Estonian language file by Indrek Päri
|
||||
* added header injection patch
|
||||
* added "set" method to permit users to create their own pseudo-properties like 'X-Headers', etc.
|
||||
example of use:
|
||||
$mail->set('X-Priority', '3');
|
||||
$mail->set('X-MSMail-Priority', 'Normal');
|
||||
* fixed warning message in SMTP get_lines method
|
||||
* added TLS/SSL SMTP support
|
||||
example of use:
|
||||
$mail = new PHPMailer();
|
||||
$mail->Mailer = "smtp";
|
||||
$mail->Host = "smtp.example.com";
|
||||
$mail->SMTPSecure = "tls"; // option
|
||||
//$mail->SMTPSecure = "ssl"; // option
|
||||
...
|
||||
$mail->Send();
|
||||
* PHPMailer has been tested with PHP4 (4.4.7) and PHP5 (5.2.7)
|
||||
* Works with PHP installed as a module or as CGI-PHP
|
||||
- NOTE: will NOT work with PHP5 in E_STRICT error mode
|
||||
|
||||
Version 1.73 (Sun, Jun 10 2005)
|
||||
* Fixed denial of service bug: http://www.cybsec.com/vuln/PHPMailer-DOS.pdf
|
||||
* Now has a total of 20 translations
|
||||
* Fixed alt attachments bug: http://tinyurl.com/98u9k
|
||||
|
||||
Version 1.72 (Wed, May 25 2004)
|
||||
* Added Dutch, Swedish, Czech, Norwegian, and Turkish translations.
|
||||
* Received: Removed this method because spam filter programs like
|
||||
SpamAssassin reject this header.
|
||||
* Fixed error count bug.
|
||||
* SetLanguage default is now "language/".
|
||||
* Fixed magic_quotes_runtime bug.
|
||||
|
||||
Version 1.71 (Tue, Jul 28 2003)
|
||||
* Made several speed enhancements
|
||||
* Added German and Italian translation files
|
||||
* Fixed HELO/AUTH bugs on keep-alive connects
|
||||
* Now provides an error message if language file does not load
|
||||
* Fixed attachment EOL bug
|
||||
* Updated some unclear documentation
|
||||
* Added additional tests and improved others
|
||||
|
||||
Version 1.70 (Mon, Jun 20 2003)
|
||||
* Added SMTP keep-alive support
|
||||
* Added IsError method for error detection
|
||||
* Added error message translation support (SetLanguage)
|
||||
* Refactored many methods to increase library performance
|
||||
* Hello now sends the newer EHLO message before HELO as per RFC 2821
|
||||
* Removed the boundary class and replaced it with GetBoundary
|
||||
* Removed queue support methods
|
||||
* New $Hostname variable
|
||||
* New Message-ID header
|
||||
* Received header reformat
|
||||
* Helo variable default changed to $Hostname
|
||||
* Removed extra spaces in Content-Type definition (#667182)
|
||||
* Return-Path should be set to Sender when set
|
||||
* Adds Q or B encoding to headers when necessary
|
||||
* quoted-encoding should now encode NULs \000
|
||||
* Fixed encoding of body/AltBody (#553370)
|
||||
* Adds "To: undisclosed-recipients:;" when all recipients are hidden (BCC)
|
||||
* Multiple bug fixes
|
||||
|
||||
Version 1.65 (Fri, Aug 09 2002)
|
||||
* Fixed non-visible attachment bug (#585097) for Outlook
|
||||
* SMTP connections are now closed after each transaction
|
||||
* Fixed SMTP::Expand return value
|
||||
* Converted SMTP class documentation to phpDocumentor format
|
||||
|
||||
Version 1.62 (Wed, Jun 26 2002)
|
||||
* Fixed multi-attach bug
|
||||
* Set proper word wrapping
|
||||
* Reduced memory use with attachments
|
||||
* Added more debugging
|
||||
* Changed documentation to phpDocumentor format
|
||||
|
||||
Version 1.60 (Sat, Mar 30 2002)
|
||||
* Sendmail pipe and address patch (Christian Holtje)
|
||||
* Added embedded image and read confirmation support (A. Ognio)
|
||||
* Added unit tests
|
||||
* Added SMTP timeout support (*nix only)
|
||||
* Added possibly temporary PluginDir variable for SMTP class
|
||||
* Added LE message line ending variable
|
||||
* Refactored boundary and attachment code
|
||||
* Eliminated SMTP class warnings
|
||||
* Added SendToQueue method for future queuing support
|
||||
|
||||
Version 1.54 (Wed, Dec 19 2001)
|
||||
* Add some queuing support code
|
||||
* Fixed a pesky multi/alt bug
|
||||
* Messages are no longer forced to have "To" addresses
|
||||
|
||||
Version 1.50 (Thu, Nov 08 2001)
|
||||
* Fix extra lines when not using SMTP mailer
|
||||
* Set WordWrap variable to int with a zero default
|
||||
|
||||
Version 1.47 (Tue, Oct 16 2001)
|
||||
* Fixed Received header code format
|
||||
* Fixed AltBody order error
|
||||
* Fixed alternate port warning
|
||||
|
||||
Version 1.45 (Tue, Sep 25 2001)
|
||||
* Added enhanced SMTP debug support
|
||||
* Added support for multiple ports on SMTP
|
||||
* Added Received header for tracing
|
||||
* Fixed AddStringAttachment encoding
|
||||
* Fixed possible header name quote bug
|
||||
* Fixed wordwrap() trim bug
|
||||
* Couple other small bug fixes
|
||||
|
||||
Version 1.41 (Wed, Aug 22 2001)
|
||||
* Fixed AltBody bug w/o attachments
|
||||
* Fixed rfc_date() for certain mail servers
|
||||
|
||||
Version 1.40 (Sun, Aug 12 2001)
|
||||
* Added multipart/alternative support (AltBody)
|
||||
* Documentation update
|
||||
* Fixed bug in Mercury MTA
|
||||
|
||||
Version 1.29 (Fri, Aug 03 2001)
|
||||
* Added AddStringAttachment() method
|
||||
* Added SMTP authentication support
|
||||
|
||||
Version 1.28 (Mon, Jul 30 2001)
|
||||
* Fixed a typo in SMTP class
|
||||
* Fixed header issue with Imail (win32) SMTP server
|
||||
* Made fopen() calls for attachments use "rb" to fix win32 error
|
||||
|
||||
Version 1.25 (Mon, Jul 02 2001)
|
||||
* Added RFC 822 date fix (Patrice)
|
||||
* Added improved error handling by adding a $ErrorInfo variable
|
||||
* Removed MailerDebug variable (obsolete with new error handler)
|
||||
|
||||
Version 1.20 (Mon, Jun 25 2001)
|
||||
* Added quoted-printable encoding (Patrice)
|
||||
* Set Version as public and removed PrintVersion()
|
||||
* Changed phpdoc to only display public variables and methods
|
||||
|
||||
Version 1.19 (Thu, Jun 21 2001)
|
||||
* Fixed MS Mail header bug
|
||||
* Added fix for Bcc problem with mail(). *Does not work on Win32*
|
||||
(See PHP bug report: http://www.php.net/bugs.php?id=11616)
|
||||
* mail() no longer passes a fifth parameter when not needed
|
||||
|
||||
Version 1.15 (Fri, Jun 15 2001)
|
||||
[Note: these changes contributed by Patrice Fournier]
|
||||
* Changed all remaining \n to \r\n
|
||||
* Bcc: header no longer writen to message except
|
||||
when sent directly to sendmail
|
||||
* Added a small message to non-MIME compliant mail reader
|
||||
* Added Sender variable to change the Sender email
|
||||
used in -f for sendmail/mail and in 'MAIL FROM' for smtp mode
|
||||
* Changed boundary setting to a place it will be set only once
|
||||
* Removed transfer encoding for whole message when using multipart
|
||||
* Message body now uses Encoding in multipart messages
|
||||
* Can set encoding and type to attachments 7bit, 8bit
|
||||
and binary attachment are sent as is, base64 are encoded
|
||||
* Can set Encoding to base64 to send 8 bits body
|
||||
through 7 bits servers
|
||||
|
||||
Version 1.10 (Tue, Jun 12 2001)
|
||||
* Fixed win32 mail header bug (printed out headers in message body)
|
||||
|
||||
Version 1.09 (Fri, Jun 08 2001)
|
||||
* Changed date header to work with Netscape mail programs
|
||||
* Altered phpdoc documentation
|
||||
|
||||
Version 1.08 (Tue, Jun 05 2001)
|
||||
* Added enhanced error-checking
|
||||
* Added phpdoc documentation to source
|
||||
|
||||
Version 1.06 (Fri, Jun 01 2001)
|
||||
* Added optional name for file attachments
|
||||
|
||||
Version 1.05 (Tue, May 29 2001)
|
||||
* Code cleanup
|
||||
* Eliminated sendmail header warning message
|
||||
* Fixed possible SMTP error
|
||||
|
||||
Version 1.03 (Thu, May 24 2001)
|
||||
* Fixed problem where qmail sends out duplicate messages
|
||||
|
||||
Version 1.02 (Wed, May 23 2001)
|
||||
* Added multiple recipient and attachment Clear* methods
|
||||
* Added Sendmail public variable
|
||||
* Fixed problem with loading SMTP library multiple times
|
||||
|
||||
Version 0.98 (Tue, May 22 2001)
|
||||
* Fixed problem with redundant mail hosts sending out multiple messages
|
||||
* Added additional error handler code
|
||||
* Added AddCustomHeader() function
|
||||
* Added support for Microsoft mail client headers (affects priority)
|
||||
* Fixed small bug with Mailer variable
|
||||
* Added PrintVersion() function
|
||||
|
||||
Version 0.92 (Tue, May 15 2001)
|
||||
* Changed file names to class.phpmailer.php and class.smtp.php to match
|
||||
current PHP class trend.
|
||||
* Fixed problem where body not being printed when a message is attached
|
||||
* Several small bug fixes
|
||||
|
||||
Version 0.90 (Tue, April 17 2001)
|
||||
* Intial public release
|
||||
40
LICENSE
|
|
@ -1,8 +1,8 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
|
|
@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
|
|||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
|
|
@ -111,8 +111,8 @@ modification follow. Pay close attention to the difference between a
|
|||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
|
|
@ -146,7 +146,7 @@ such a program is covered only if its contents constitute a work based
|
|||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
|
|
@ -158,7 +158,7 @@ Library.
|
|||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
|
|
@ -216,7 +216,7 @@ instead of to this License. (If a newer version than version 2 of the
|
|||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
|
@ -267,7 +267,7 @@ Library will still fall under Section 6.)
|
|||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
|
|
@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
|
|||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
|
|
@ -370,7 +370,7 @@ subject to these terms and conditions. You may not impose any further
|
|||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
|
|
@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
|
|||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
|
|
@ -432,7 +432,7 @@ decision will be guided by the two goals of preserving the free status
|
|||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
|
|
@ -455,8 +455,8 @@ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
|||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
|
|
@ -485,7 +485,7 @@ convey the exclusion of warranty; and each file should have at least the
|
|||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
|
|
@ -499,6 +499,4 @@ necessary. Here is a sample; alter the names:
|
|||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
||||
That's all there is to it!
|
||||
182
README
|
|
@ -1,182 +0,0 @@
|
|||
/*******************************************************************
|
||||
* The http://phpmailer.codeworxtech.com/ website now carries a few *
|
||||
* advertisements through the Google Adsense network. Please visit *
|
||||
* the advertiser sites and help us offset some of our costs. *
|
||||
* Thanks .... *
|
||||
********************************************************************/
|
||||
|
||||
PHPMailer
|
||||
Full Featured Email Transfer Class for PHP
|
||||
==========================================
|
||||
|
||||
Version 2.2 (July 15 2008)
|
||||
|
||||
- see the changelog.
|
||||
|
||||
Version 2.1 (June 04 2008)
|
||||
|
||||
With this release, we are announcing that the development of PHPMailer for PHP5
|
||||
will be our focus from this date on. We have implemented all the enhancements
|
||||
and fixes from the latest release of PHPMailer for PHP4.
|
||||
|
||||
Far more important, though, is that this release of PHPMailer (v2.1) is
|
||||
fully tested with E_STRICT error checking enabled.
|
||||
|
||||
** NOTE: WE HAVE A NEW LANGUAGE VARIABLE FOR DIGITALLY SIGNED S/MIME EMAILS.
|
||||
IF YOU CAN HELP WITH LANGUAGES OTHER THAN ENGLISH AND SPANISH, IT WOULD BE
|
||||
APPRECIATED.
|
||||
|
||||
We have now added S/MIME functionality (ability to digitally sign emails).
|
||||
BIG THANKS TO "sergiocambra" for posting this patch back in November 2007.
|
||||
The "Signed Emails" functionality adds the Sign method to pass the private key
|
||||
filename and the password to read it, and then email will be sent with
|
||||
content-type multipart/signed and with the digital signature attached.
|
||||
|
||||
A quick note on E_STRICT:
|
||||
|
||||
- In about half the test environments the development version was subjected
|
||||
to, an error was thrown for the date() functions (used at line 1565 and 1569).
|
||||
This is NOT a PHPMailer error, it is the result of an incorrectly configured
|
||||
PHP5 installation. The fix is to modify your 'php.ini' file and include the
|
||||
date.timezone = America/New York
|
||||
directive, (for your own server timezone)
|
||||
- If you do get this error, and are unable to access your php.ini file, there is
|
||||
a workaround. In your PHP script, add
|
||||
date_default_timezone_set('America/Toronto');
|
||||
|
||||
* do NOT try to use
|
||||
$myVar = date_default_timezone_get();
|
||||
as a test, it will throw an error.
|
||||
|
||||
We have also included more example files to show the use of "sendmail", "mail()",
|
||||
"smtp", and "gmail".
|
||||
|
||||
We are also looking for more programmers to join the volunteer development team.
|
||||
If you have an interest in this, please let us know.
|
||||
|
||||
Enjoy!
|
||||
|
||||
|
||||
Version 2.1.0beta1 & beta2
|
||||
|
||||
please note, this is BETA software
|
||||
** DO NOT USE THIS IN PRODUCTION OR LIVE PROJECTS
|
||||
INTENDED STRICTLY FOR TESTING
|
||||
|
||||
** NOTE:
|
||||
|
||||
As of November 2007, PHPMailer has a new project team headed by industry
|
||||
veteran Andy Prevost (codeworxtech). The first release in more than two
|
||||
years will focus on fixes, adding ease-of-use enhancements, provide
|
||||
basic compatibility with PHP4 and PHP5 using PHP5 backwards compatibility
|
||||
features. A new release is planned before year-end 2007 that will provide
|
||||
full compatiblity with PHP4 and PHP5, as well as more bug fixes.
|
||||
|
||||
We are looking for project developers to assist in restoring PHPMailer to
|
||||
its leadership position. Our goals are to simplify use of PHPMailer, provide
|
||||
good documentation and examples, and retain backward compatibility to level
|
||||
1.7.3 standards.
|
||||
|
||||
If you are interested in helping out, visit http://sourceforge.net/projects/phpmailer
|
||||
and indicate your interest.
|
||||
|
||||
**
|
||||
|
||||
http://phpmailer.sourceforge.net/
|
||||
|
||||
This software is licenced under the LGPL. Please read LICENSE for information on the
|
||||
software availability and distribution.
|
||||
|
||||
Class Features:
|
||||
- Send emails with multiple TOs, CCs, BCCs and REPLY-TOs
|
||||
- Redundant SMTP servers
|
||||
- Multipart/alternative emails for mail clients that do not read HTML email
|
||||
- Support for 8bit, base64, binary, and quoted-printable encoding
|
||||
- Uses the same methods as the very popular AspEmail active server (COM) component
|
||||
- SMTP authentication
|
||||
- Native language support
|
||||
- Word wrap, and more!
|
||||
|
||||
Why you might need it:
|
||||
|
||||
Many PHP developers utilize email in their code. The only PHP function
|
||||
that supports this is the mail() function. However, it does not expose
|
||||
any of the popular features that many email clients use nowadays like
|
||||
HTML-based emails and attachments. There are two proprietary
|
||||
development tools out there that have all the functionality built into
|
||||
easy to use classes: AspEmail(tm) and AspMail. Both of these
|
||||
programs are COM components only available on Windows. They are also a
|
||||
little pricey for smaller projects.
|
||||
|
||||
Since I do Linux development I’ve missed these tools for my PHP coding.
|
||||
So I built a version myself that implements the same methods (object
|
||||
calls) that the Windows-based components do. It is open source and the
|
||||
LGPL license allows you to place the class in your proprietary PHP
|
||||
projects.
|
||||
|
||||
|
||||
Installation:
|
||||
|
||||
Copy class.phpmailer.php into your php.ini include_path. If you are
|
||||
using the SMTP mailer then place class.smtp.php in your path as well.
|
||||
In the language directory you will find several files like
|
||||
phpmailer.lang-en.php. If you look right before the .php extension
|
||||
that there are two letters. These represent the language type of the
|
||||
translation file. For instance "en" is the English file and "br" is
|
||||
the Portuguese file. Chose the file that best fits with your language
|
||||
and place it in the PHP include path. If your language is English
|
||||
then you have nothing more to do. If it is a different language then
|
||||
you must point PHPMailer to the correct translation. To do this, call
|
||||
the PHPMailer SetLanguage method like so:
|
||||
|
||||
// To load the Portuguese version
|
||||
$mail->SetLanguage("br", "/optional/path/to/language/directory/");
|
||||
|
||||
That's it. You should now be ready to use PHPMailer!
|
||||
|
||||
|
||||
A Simple Example:
|
||||
|
||||
<?php
|
||||
require("class.phpmailer.php");
|
||||
|
||||
$mail = new PHPMailer();
|
||||
|
||||
$mail->IsSMTP(); // set mailer to use SMTP
|
||||
$mail->Host = "smtp1.example.com;smtp2.example.com"; // specify main and backup server
|
||||
$mail->SMTPAuth = true; // turn on SMTP authentication
|
||||
$mail->Username = "jswan"; // SMTP username
|
||||
$mail->Password = "secret"; // SMTP password
|
||||
|
||||
$mail->From = "from@example.com";
|
||||
$mail->FromName = "Mailer";
|
||||
$mail->AddAddress("josh@example.net", "Josh Adams");
|
||||
$mail->AddAddress("ellen@example.com"); // name is optional
|
||||
$mail->AddReplyTo("info@example.com", "Information");
|
||||
|
||||
$mail->WordWrap = 50; // set word wrap to 50 characters
|
||||
$mail->AddAttachment("/var/tmp/file.tar.gz"); // add attachments
|
||||
$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // optional name
|
||||
$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";
|
||||
|
||||
if(!$mail->Send())
|
||||
{
|
||||
echo "Message could not be sent. <p>";
|
||||
echo "Mailer Error: " . $mail->ErrorInfo;
|
||||
exit;
|
||||
}
|
||||
|
||||
echo "Message has been sent";
|
||||
?>
|
||||
|
||||
CHANGELOG
|
||||
|
||||
See ChangeLog.txt
|
||||
|
||||
Download: http://sourceforge.net/project/showfiles.php?group_id=26031
|
||||
|
||||
Andy Prevost
|
||||
|
|
@ -0,0 +1,232 @@
|
|||
[](https://supportukrainenow.org/)
|
||||
|
||||

|
||||
|
||||
# PHPMailer – A full-featured email creation and transfer class for PHP
|
||||
|
||||
[](https://github.com/PHPMailer/PHPMailer/actions)
|
||||
[](https://codecov.io/gh/PHPMailer/PHPMailer)
|
||||
[](https://packagist.org/packages/phpmailer/phpmailer)
|
||||
[](https://packagist.org/packages/phpmailer/phpmailer)
|
||||
[](https://packagist.org/packages/phpmailer/phpmailer)
|
||||
[](https://phpmailer.github.io/PHPMailer/)
|
||||
[](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
|
||||
- Full UTF-8 support when using servers that support `SMTPUTF8`.
|
||||
- Support for iCal events in multiparts and attachments
|
||||
- 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.5
|
||||
- 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 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 [Symfony Mailer](https://symfony.com/doc/current/mailer.html), [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](https://www.gnu.org/licenses/old-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": "^7.0.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 XOAUTH2 authentication, you will also need to add a dependency on the `league/oauth2-client` and appropriate service adapters package in your `composer.json`, or take a look at
|
||||
by @decomplexity's [SendOauth2 wrapper](https://github.com/decomplexity/SendOauth2), especially if you're using Microsoft services.
|
||||
|
||||
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 it. 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 (created by composer, not included with PHPMailer)
|
||||
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](https://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 [Language/TranslationCompletenessTest.php](https://github.com/PHPMailer/PHPMailer/blob/master/test/Language/TranslationCompletenessTest.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](https://www.phpdoc.org) installed. You may find [the unit tests](https://github.com/PHPMailer/PHPMailer/blob/master/test/PHPMailer/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](https://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.
|
||||
|
||||
[](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](https://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.
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
# Security notices relating to PHPMailer
|
||||
|
||||
Please disclose any security issues or vulnerabilities found through [Tidelift's coordinated disclosure system](https://tidelift.com/security) or to the maintainers privately.
|
||||
|
||||
PHPMailer 6.4.1 and earlier contain a vulnerability that can result in untrusted code being called (if such code is injected into the host project's scope by other means). If the `$patternselect` parameter to `validateAddress()` is set to `'php'` (the default, defined by `PHPMailer::$validator`), and the global namespace contains a function called `php`, it will be called in preference to the built-in validator of the same name. Mitigated in PHPMailer 6.5.0 by denying the use of simple strings as validator function names. Recorded as [CVE-2021-3603](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-3603). Reported by [Vikrant Singh Chauhan](mailto:vi@hackberry.xyz) via [huntr.dev](https://www.huntr.dev/).
|
||||
|
||||
PHPMailer versions 6.4.1 and earlier contain a possible remote code execution vulnerability through the `$lang_path` parameter of the `setLanguage()` method. If the `$lang_path` parameter is passed unfiltered from user input, it can be set to [a UNC path](https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats#unc-paths), and if an attacker is also able to persuade the server to load a file from that UNC path, a script file under their control may be executed. This vulnerability only applies to systems that resolve UNC paths, typically only Microsoft Windows.
|
||||
PHPMailer 6.5.0 mitigates this by no longer treating translation files as PHP code, but by parsing their text content directly. This approach avoids the possibility of executing unknown code while retaining backward compatibility. This isn't ideal, so the current translation format is deprecated and will be replaced in the next major release. Recorded as [CVE-2021-34551](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-34551). Reported by [Jilin Diting Information Technology Co., Ltd](https://listensec.com) via Tidelift.
|
||||
|
||||
PHPMailer versions between 6.1.8 and 6.4.0 contain a regression of the earlier CVE-2018-19296 object injection vulnerability as a result of [a fix for Windows UNC paths in 6.1.8](https://github.com/PHPMailer/PHPMailer/commit/e2e07a355ee8ff36aba21d0242c5950c56e4c6f9). Recorded as [CVE-2020-36326](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-36326). Reported by Fariskhi Vidyan via Tidelift. 6.4.1 fixes this issue, and also enforces stricter checks for URL schemes in local path contexts.
|
||||
|
||||
PHPMailer versions 6.1.5 and earlier contain an output escaping bug that occurs in `Content-Type` and `Content-Disposition` when filenames passed into `addAttachment` and other methods that accept attachment names contain double quote characters, in contravention of RFC822 3.4.1. No specific vulnerability has been found relating to this, but it could allow file attachments to bypass attachment filters that are based on matching filename extensions. Recorded as [CVE-2020-13625](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-13625). Reported by Elar Lang of Clarified Security.
|
||||
|
||||
PHPMailer versions prior to 6.0.6 and 5.2.27 are vulnerable to an object injection attack by passing `phar://` paths into `addAttachment()` and other functions that may receive unfiltered local paths, possibly leading to RCE. Recorded as [CVE-2018-19296](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2018-19296). See [this article](https://knasmueller.net/5-answers-about-php-phar-exploitation) for more info on this type of vulnerability. Mitigated by blocking the use of paths containing URL-protocol style prefixes such as `phar://`. Reported by Sehun Oh of cyberone.kr.
|
||||
|
||||
PHPMailer versions prior to 5.2.24 (released July 26th 2017) have an XSS vulnerability in one of the code examples, [CVE-2017-11503](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-11503). The `code_generator.phps` example did not filter user input prior to output. This file is distributed with a `.phps` extension, so it is not normally executable unless it is explicitly renamed, and the file is not included when PHPMailer is loaded through composer, so it is safe by default. There was also an undisclosed potential XSS vulnerability in the default exception handler (unused by default). Patches for both issues kindly provided by Patrick Monnerat of the Fedora Project.
|
||||
|
||||
PHPMailer versions prior to 5.2.22 (released January 9th 2017) have a local file disclosure vulnerability, [CVE-2017-5223](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-5223). If content passed into `msgHTML()` is sourced from unfiltered user input, relative paths can map to absolute local file paths and added as attachments. Also note that `addAttachment` (just like `file_get_contents`, `passthru`, `unlink`, etc) should not be passed user-sourced params either! Reported by Yongxiang Li of Asiasecurity.
|
||||
|
||||
PHPMailer versions prior to 5.2.20 (released December 28th 2016) are vulnerable to [CVE-2016-10045](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10045) a remote code execution vulnerability, responsibly reported by [Dawid Golunski](https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html), and patched by Paul Buonopane (@Zenexer).
|
||||
|
||||
PHPMailer versions prior to 5.2.18 (released December 2016) are vulnerable to [CVE-2016-10033](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10033) a remote code execution vulnerability, responsibly reported by [Dawid Golunski](https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html).
|
||||
|
||||
PHPMailer versions prior to 5.2.14 (released November 2015) are vulnerable to [CVE-2015-8476](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-8476) an SMTP CRLF injection bug permitting arbitrary message sending.
|
||||
|
||||
PHPMailer versions prior to 5.2.10 (released May 2015) are vulnerable to [CVE-2008-5619](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2008-5619), a remote code execution vulnerability in the bundled html2text library. This file was removed in 5.2.10, so if you are using a version prior to that and make use of the html2text function, it's vitally important that you upgrade and remove this file.
|
||||
|
||||
PHPMailer versions prior to 2.0.7 and 2.2.1 are vulnerable to [CVE-2012-0796](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2012-0796), an email header injection attack.
|
||||
|
||||
Joomla 1.6.0 uses PHPMailer in an unsafe way, allowing it to reveal local file paths, reported in [CVE-2011-3747](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2011-3747).
|
||||
|
||||
PHPMailer didn't sanitise the `$lang_path` parameter in `SetLanguage`. This wasn't a problem in itself, but some apps (PHPClassifieds, ATutor) also failed to sanitise user-provided parameters passed to it, permitting semi-arbitrary local file inclusion, reported in [CVE-2010-4914](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2010-4914), [CVE-2007-2021](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2007-2021) and [CVE-2006-5734](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2006-5734).
|
||||
|
||||
PHPMailer 1.7.2 and earlier contained a possible DDoS vulnerability reported in [CVE-2005-1807](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-1807).
|
||||
|
||||
PHPMailer 1.7 and earlier (June 2003) have a possible vulnerability in the `SendmailSend` method where shell commands may not be sanitised. Reported in [CVE-2007-3215](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2007-3215).
|
||||
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
# A short history of UTF-8 in email
|
||||
|
||||
## Background
|
||||
|
||||
For most of its existence, SMTP has been a 7-bit channel, only supporting US-ASCII characters. This has been a problem for many languages, especially those that use non-Latin scripts, and has led to the development of various workarounds.
|
||||
|
||||
The first major improvement, introduced in 1994 in [RFC 1652](https://www.rfc-editor.org/rfc/rfc1652) and extended in 2011 in [RFC 6152](https://www.rfc-editor.org/rfc/rfc6152), was the addition of the `8BITMIME` SMTP extension, which allowed raw 8-bit data to be included in message bodies sent over SMTP.
|
||||
This allowed the message *contents* to contain 8-bit data, including things like UTF-8 text, even though the SMTP protocol itself was still firmly 7-bit. This worked by having the server switch to 8-bit after the headers, and then back to 7-bit after the completion of a `DATA` command.
|
||||
|
||||
From 1996, messages could support [RFC 2047 encoding](https://www.rfc-editor.org/rfc/rfc2047), which permitted inserting characters from any character set into header *values* (but not names), but only by encoding them in somewhat unreadable ways to allow them to survive passage through a 7-bit channel. An example with a subject of "Schrödinger's cat" would be:
|
||||
|
||||
```
|
||||
Subject: =?utf-8?Q=Schr=C3=B6dinger=92s_Cat?=
|
||||
```
|
||||
|
||||
Here the accented `ö` is encoded as `=C3=B6`, which is the UTF-8 encoding of the 2-byte character, and the whole thing is wrapped in `=?utf-8?Q?` to indicate that it uses the UTF-8 charset and `quoted-printable` encoding. This is a bit of a hack, and not very human-friendly, but it works.
|
||||
|
||||
Similarly, 8-bit message bodies could be encoded using the same `quoted-printable` and `base64` content transfer encoding (CTE) schemes, which preserved the 8-bit content while encoding it in a format that could survive transmission through a 7-bit channel.
|
||||
|
||||
Domain names were originally also stuck in a 7-bit world, actually even more constrained to only a subset of the US-ASCII character set. But of course, many people want to have domains in their own language/script. Internationalized domain name (IDN) permitted this, using yet another complex encoding scheme called punycode, defined for domain names in 2003 in [RFC 3492](https://www.rfc-editor.org/rfc/rfc3492). This finally allowed the domain part (after the `@`) of email addresses to contain UTF-8, though it was actually an illusion preserved by email client applications. For example, an address of
|
||||
`user@café.example.com` translates to
|
||||
`user@xn--caf-dma.example.com` in punycode, rendering it mostly unreadable, but 7-bit friendly, and remaining compatible with email clients that don't know about IDN.
|
||||
|
||||
The one remaining part of email that could not handle UTF-8 is the local part of email addresses (the part before the `@`).
|
||||
|
||||
I've only mentioned UTF-8 here, but most of these approaches also allowed other character sets that were popular, such as [the ISO-8859 family](https://en.wikipedia.org/wiki/ISO/IEC_8859). However, UTF-8 solves so many problems that these other character sets are gradually falling out of favour, as UTF-8 can support all languages.
|
||||
|
||||
This patchwork of overlapping approaches has served us well, but we have to admit that it's a mess.
|
||||
|
||||
## SMTPUTF8
|
||||
|
||||
`SMTPUTF8` is another SMTP extension, defined in [RFC 6531](https://www.rfc-editor.org/rfc/rfc6531) in 2012. This essentially solves the whole problem, allowing the entire SMTP conversation — commands, headers, and message bodies — to be sent in raw, unencoded UTF-8.
|
||||
|
||||
But there's a problem with this approach: adoption. If you send a UTF-8 message to a recipient whose mail server doesn't support this format, the sender has to somehow downgrade the message to make it survive a transition to 7-bit. This is a hard problem to solve, especially since there is no way to make a 7-bit system support UTF-8 in the local parts of addresses. This downgrade problem is what held up the adoption of `SMTPUTF8` in PHPMailer for many years, but in that time the *de facto* approach has become to simply fail in that situation, and tell the recipient it's time they upgraded their mail server 😅.
|
||||
|
||||
The vast majority of large email providers (gmail, Yahoo, Microsoft, etc), mail servers (postfix, exim, IIS, etc), and mail clients (Apple Mail, Outlook, Thunderbird, etc) now all support SMTPUTF8, so the need for backward compatibility is no longer what it was.
|
||||
|
||||
## SMTPUTF8 in PHPMailer
|
||||
|
||||
Several other PHP email libraries have implemented a halfway solution to `SMTPUTF8`, adding only the ability to support UTF-8 in email addresses, not elsewhere in the protocol. I wanted PHPMailer to do it "the right way", and this has taken much longer. PHPMailer now supports UTF-8 everywhere, and does not need to use transfer or header encodings for UTF-8 text when connecting to an `SMTPUTF8`-capable mail server.
|
||||
|
||||
This support is handled automatically: if you add an email address that requires UTF-8, PHPMailer will use UTF-8 for everything. If not, it will fall back to 7-bit and encode the message as necessary.
|
||||
|
||||
The one place you will need to be careful is in the selection of the address validator. By default, PHPMailer uses PHP's built-in `filter_var` validator, which does not allow UTF-8 email addresses. When PHPMailer spots that you have submitted a UTF-8 address, but have not altered the default validator, it will automatically switch to using a UTF-8-compatible validator. As soon as you do this, any SMTP connection you make will *require* that the server you connect to supports `SMTPUTF8`. You can select this validator explicitly by setting `PHPMailer::$validator = 'eai'` (an acronym for Email Address Internationalization).
|
||||
|
||||
### Postfix gotcha
|
||||
|
||||
Postfix has supported `SMTPUTF8` for a long time, but it has a peculiarity that it does not always advertise that it does so. However, rather surprisingly, if you use UTF-8 in the conversation, it will work anyway.
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
# Upgrading from PHPMailer 5.2 to 6.0
|
||||
|
||||
PHPMailer 6.0 is a major update, breaking backward compatibility.
|
||||
|
||||
If you're in doubt about how you should be using PHPMailer 6, take a look at the examples as they have all been updated to work in a PHPMailer 6.0 style.
|
||||
|
||||
## PHP Version
|
||||
|
||||
PHPMailer 6.0 requires PHP 5.5 or later, and is fully compatible with PHP versions all the way up to 8.4. PHPMailer 5.2 supported PHP 5.0 and upwards, so if you need to run on a legacy PHP version, see the [PHPMailer 5.2-stable branch on Github](https://github.com/PHPMailer/PHPMailer/tree/5.2-stable), but bear in mind that this branch is no longer maintained.
|
||||
|
||||
## Loading PHPMailer
|
||||
|
||||
The single biggest change will be in the way that you load PHPMailer. In earlier versions you may have done this:
|
||||
|
||||
```php
|
||||
require 'PHPMailerAutoload.php';
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```php
|
||||
require 'class.phpmailer.php';
|
||||
require 'class.smtp.php';
|
||||
```
|
||||
|
||||
We recommend that you load PHPMailer via composer, using its standard autoloader, which you probably won't need to load if you're using it already, but in case you're not, you will need to do this instead:
|
||||
|
||||
```php
|
||||
require 'vendor/autoload.php';
|
||||
```
|
||||
|
||||
If you're not using composer, you can still load the classes manually, depending on what you're using:
|
||||
|
||||
```php
|
||||
require 'src/PHPMailer.php';
|
||||
require 'src/SMTP.php';
|
||||
require 'src/Exception.php';
|
||||
```
|
||||
|
||||
## Namespace
|
||||
PHPMailer 6 uses a [namespace](https://www.php.net/manual/en/language.namespaces.rationale.php) of `PHPMailer\PHPMailer`, because it's the PHPMailer project within the PHPMailer organisation. You **must** import (with a `use` statement) classes you're using explicitly into your own namespace, or reference them absolutely in the global namespace - all the examples do this. This means the fully-qualified name of the main PHPMailer class is `PHPMailer\PHPMailer\PHPMailer`, which is a bit of a mouthful, but there's no harm in it! If you are using other PHPMailer classes explicitly (such as `SMTP` or `Exception`), you will need to import them into your namespace too.
|
||||
|
||||
For example you might create an instance like this:
|
||||
|
||||
```php
|
||||
<?php
|
||||
namespace MyProject;
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
require 'vendor/autoload.php';
|
||||
$mail = new PHPMailer;
|
||||
...
|
||||
```
|
||||
|
||||
or alternatively, using a fully qualified name:
|
||||
|
||||
```php
|
||||
<?php
|
||||
namespace MyProject;
|
||||
require 'vendor/autoload.php';
|
||||
$mail = new PHPMailer\PHPMailer\PHPMailer;
|
||||
...
|
||||
```
|
||||
|
||||
Note that `use` statements apply *only* to the file they appear in (they are local aliases), so if an included file contains `use` statements, it will not import the namespaced classes into the file you're including from.
|
||||
|
||||
## Namespaced exceptions
|
||||
PHPMailer now uses its own namespaced `Exception` class, so if you were previously catching exceptions of type `phpmailerException` (or subclasses of that), you will need to update them to use the PHPMailer namespace, and make any existing `Exception` references use the global namespace, i.e. `\Exception`. If your original code was:
|
||||
|
||||
```php
|
||||
try {
|
||||
...
|
||||
} catch (phpmailerException $e) {
|
||||
echo $e->errorMessage();
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
```
|
||||
|
||||
Convert it to:
|
||||
|
||||
```php
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
...
|
||||
try {
|
||||
...
|
||||
} catch (Exception $e) {
|
||||
echo $e->errorMessage();
|
||||
} catch (\Exception $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
```
|
||||
|
||||
## OAuth2 Support
|
||||
The OAuth2 implementation has been completely redesigned using the [OAuth2 packages](https://oauth2-client.thephpleague.com) from the [League of extraordinary packages](https://thephpleague.com), providing support for many more OAuth services, and you'll need to update your code if you were using OAuth in 5.2. See [the examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) and documentation in the [PHPMailer wiki](https://github.com/PHPMailer/PHPMailer/wiki).
|
||||
|
||||
## Extras
|
||||
Additional classes previously bundled in the `Extras` folder (such as htmlfilter and EasyPeasyICS) have been removed - use equivalent packages from [packagist.org](https://packagist.org) instead.
|
||||
|
||||
## Other upgrade changes
|
||||
See the changelog for full details.
|
||||
* File structure simplified, classes live in the `src/` folder
|
||||
* Most statically called functions now use the `static` keyword instead of `self`, so it's possible to override static internal functions in subclasses, for example `validateAddress()`
|
||||
* Complete RFC standardisation on CRLF (`\r\n`) line breaks by default:
|
||||
* `PHPMailer::$LE` still exists, but all uses of it are changed to `static::$LE` for easier overriding. It may be changed to `\n` automatically when sending via `mail()` on UNIX-like OSs
|
||||
* `PHPMailer::CRLF` line ending constant removed
|
||||
* The length of the line break is no longer used in line length calculations
|
||||
* Similar changes to line break handling in SMTP and POP3 classes
|
||||
* All elements previously marked as deprecated have been removed:
|
||||
* `PHPMailer->Version`
|
||||
* `PHPMailer->ReturnPath`
|
||||
* `PHPMailer->PluginDir`
|
||||
* `PHPMailer->encodeQPphp()`
|
||||
* `SMTP->CRLF`
|
||||
* `SMTP->Version`
|
||||
* `SMTP->SMTP_PORT`
|
||||
* `POP3->CRLF`
|
||||
* `POP3->Version`
|
||||
* NTLM authentication has been removed - it never worked anyway!
|
||||
* `PHPMailer->Workstation`
|
||||
* `PHPMailer->Realm`
|
||||
* `SMTP::authenticate` method signature changed
|
||||
* `parseAddresses()` is now static
|
||||
* `validateAddress()` is now called statically from `parseAddresses()`
|
||||
* `idnSupported()` is now static and is called statically from `punyencodeAddress()`
|
||||
* `PHPMailer->SingleToArray` is now protected
|
||||
1897
class.phpmailer.php
393
class.pop3.php
|
|
@ -1,393 +0,0 @@
|
|||
<?php
|
||||
/*~ class.pop3.php
|
||||
.---------------------------------------------------------------------------.
|
||||
| Software: PHPMailer - PHP email class |
|
||||
| Version: 2.2.1 |
|
||||
| Contact: via sourceforge.net support pages (also www.codeworxtech.com) |
|
||||
| Info: http://phpmailer.sourceforge.net |
|
||||
| Support: http://sourceforge.net/projects/phpmailer/ |
|
||||
| ------------------------------------------------------------------------- |
|
||||
| Author: Andy Prevost (project admininistrator) |
|
||||
| Author: Brent R. Matzelle (original founder) |
|
||||
| Copyright (c) 2004-2007, Andy Prevost. All Rights Reserved. |
|
||||
| Copyright (c) 2001-2003, Brent R. Matzelle |
|
||||
| ------------------------------------------------------------------------- |
|
||||
| License: Distributed under the Lesser General Public License (LGPL) |
|
||||
| http://www.gnu.org/copyleft/lesser.html |
|
||||
| This program is distributed in the hope that it will be useful - WITHOUT |
|
||||
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
||||
| FITNESS FOR A PARTICULAR PURPOSE. |
|
||||
| ------------------------------------------------------------------------- |
|
||||
| We offer a number of paid services (www.codeworxtech.com): |
|
||||
| - Web Hosting on highly optimized fast and secure servers |
|
||||
| - Technology Consulting |
|
||||
| - Oursourcing (highly qualified programmers and graphic designers) |
|
||||
'---------------------------------------------------------------------------'
|
||||
|
||||
/**
|
||||
* POP Before SMTP Authentication Class
|
||||
* Version 2.1
|
||||
*
|
||||
* Author: Richard Davey (rich@corephp.co.uk)
|
||||
* Modifications: Andy Prevost
|
||||
* License: LGPL, see PHPMailer License
|
||||
*
|
||||
* Specifically for PHPMailer to allow POP before SMTP authentication.
|
||||
* Does not yet work with APOP - if you have an APOP account, contact me
|
||||
* and we can test changes to this script.
|
||||
*
|
||||
* This class is based on the structure of the SMTP class by Chris Ryan
|
||||
*
|
||||
* This class is rfc 1939 compliant and implements all the commands
|
||||
* required for POP3 connection, authentication and disconnection.
|
||||
*
|
||||
* @package PHPMailer
|
||||
* @author Richard Davey
|
||||
*/
|
||||
|
||||
class POP3 {
|
||||
/**
|
||||
* Default POP3 port
|
||||
* @var int
|
||||
*/
|
||||
public $POP3_PORT = 110;
|
||||
|
||||
/**
|
||||
* Default Timeout
|
||||
* @var int
|
||||
*/
|
||||
public $POP3_TIMEOUT = 30;
|
||||
|
||||
/**
|
||||
* POP3 Carriage Return + Line Feed
|
||||
* @var string
|
||||
*/
|
||||
public $CRLF = "\r\n";
|
||||
|
||||
/**
|
||||
* Displaying Debug warnings? (0 = now, 1+ = yes)
|
||||
* @var int
|
||||
*/
|
||||
public $do_debug = 2;
|
||||
|
||||
/**
|
||||
* POP3 Mail Server
|
||||
* @var string
|
||||
*/
|
||||
public $host;
|
||||
|
||||
/**
|
||||
* POP3 Port
|
||||
* @var int
|
||||
*/
|
||||
public $port;
|
||||
|
||||
/**
|
||||
* POP3 Timeout Value
|
||||
* @var int
|
||||
*/
|
||||
public $tval;
|
||||
|
||||
/**
|
||||
* POP3 Username
|
||||
* @var string
|
||||
*/
|
||||
public $username;
|
||||
|
||||
/**
|
||||
* POP3 Password
|
||||
* @var string
|
||||
*/
|
||||
public $password;
|
||||
|
||||
/**#@+
|
||||
* @access private
|
||||
*/
|
||||
private $pop_conn;
|
||||
private $connected;
|
||||
private $error; // Error log array
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* Constructor, sets the initial values
|
||||
* @access public
|
||||
* @return POP3
|
||||
*/
|
||||
public function __construct() {
|
||||
$this->pop_conn = 0;
|
||||
$this->connected = false;
|
||||
$this->error = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Combination of public events - connect, login, disconnect
|
||||
* @access public
|
||||
* @param string $host
|
||||
* @param integer $port
|
||||
* @param integer $tval
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
*/
|
||||
public function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0) {
|
||||
$this->host = $host;
|
||||
|
||||
// If no port value is passed, retrieve it
|
||||
if ($port == false) {
|
||||
$this->port = $this->POP3_PORT;
|
||||
} else {
|
||||
$this->port = $port;
|
||||
}
|
||||
|
||||
// If no port value is passed, retrieve it
|
||||
if ($tval == false) {
|
||||
$this->tval = $this->POP3_TIMEOUT;
|
||||
} else {
|
||||
$this->tval = $tval;
|
||||
}
|
||||
|
||||
$this->do_debug = $debug_level;
|
||||
$this->username = $username;
|
||||
$this->password = $password;
|
||||
|
||||
// Refresh the error log
|
||||
$this->error = null;
|
||||
|
||||
// Connect
|
||||
$result = $this->Connect($this->host, $this->port, $this->tval);
|
||||
|
||||
if ($result) {
|
||||
$login_result = $this->Login($this->username, $this->password);
|
||||
|
||||
if ($login_result) {
|
||||
$this->Disconnect();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// We need to disconnect regardless if the login succeeded
|
||||
$this->Disconnect();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect to the POP3 server
|
||||
* @access public
|
||||
* @param string $host
|
||||
* @param integer $port
|
||||
* @param integer $tval
|
||||
* @return boolean
|
||||
*/
|
||||
public function Connect ($host, $port = false, $tval = 30) {
|
||||
// Are we already connected?
|
||||
if ($this->connected) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
On Windows this will raise a PHP Warning error if the hostname doesn't exist.
|
||||
Rather than supress it with @fsockopen, let's capture it cleanly instead
|
||||
*/
|
||||
|
||||
set_error_handler(array(&$this, 'catchWarning'));
|
||||
|
||||
// Connect to the POP3 server
|
||||
$this->pop_conn = fsockopen($host, // POP3 Host
|
||||
$port, // Port #
|
||||
$errno, // Error Number
|
||||
$errstr, // Error Message
|
||||
$tval); // Timeout (seconds)
|
||||
|
||||
// Restore the error handler
|
||||
restore_error_handler();
|
||||
|
||||
// Does the Error Log now contain anything?
|
||||
if ($this->error && $this->do_debug >= 1) {
|
||||
$this->displayErrors();
|
||||
}
|
||||
|
||||
// Did we connect?
|
||||
if ($this->pop_conn == false) {
|
||||
// It would appear not...
|
||||
$this->error = array(
|
||||
'error' => "Failed to connect to server $host on port $port",
|
||||
'errno' => $errno,
|
||||
'errstr' => $errstr
|
||||
);
|
||||
|
||||
if ($this->do_debug >= 1) {
|
||||
$this->displayErrors();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Increase the stream time-out
|
||||
|
||||
// Check for PHP 4.3.0 or later
|
||||
if (version_compare(phpversion(), '5.0.0', 'ge')) {
|
||||
stream_set_timeout($this->pop_conn, $tval, 0);
|
||||
} else {
|
||||
// Does not work on Windows
|
||||
if (substr(PHP_OS, 0, 3) !== 'WIN') {
|
||||
socket_set_timeout($this->pop_conn, $tval, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// Get the POP3 server response
|
||||
$pop3_response = $this->getResponse();
|
||||
|
||||
// Check for the +OK
|
||||
if ($this->checkResponse($pop3_response)) {
|
||||
// The connection is established and the POP3 server is talking
|
||||
$this->connected = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Login to the POP3 server (does not support APOP yet)
|
||||
* @access public
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
* @return boolean
|
||||
*/
|
||||
public function Login ($username = '', $password = '') {
|
||||
if ($this->connected == false) {
|
||||
$this->error = 'Not connected to POP3 server';
|
||||
|
||||
if ($this->do_debug >= 1) {
|
||||
$this->displayErrors();
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($username)) {
|
||||
$username = $this->username;
|
||||
}
|
||||
|
||||
if (empty($password)) {
|
||||
$password = $this->password;
|
||||
}
|
||||
|
||||
$pop_username = "USER $username" . $this->CRLF;
|
||||
$pop_password = "PASS $password" . $this->CRLF;
|
||||
|
||||
// Send the Username
|
||||
$this->sendString($pop_username);
|
||||
$pop3_response = $this->getResponse();
|
||||
|
||||
if ($this->checkResponse($pop3_response)) {
|
||||
// Send the Password
|
||||
$this->sendString($pop_password);
|
||||
$pop3_response = $this->getResponse();
|
||||
|
||||
if ($this->checkResponse($pop3_response)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnect from the POP3 server
|
||||
* @access public
|
||||
*/
|
||||
public function Disconnect () {
|
||||
$this->sendString('QUIT');
|
||||
|
||||
fclose($this->pop_conn);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// Private Methods
|
||||
/////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* Get the socket response back.
|
||||
* $size is the maximum number of bytes to retrieve
|
||||
* @access private
|
||||
* @param integer $size
|
||||
* @return string
|
||||
*/
|
||||
private function getResponse ($size = 128) {
|
||||
$pop3_response = fgets($this->pop_conn, $size);
|
||||
|
||||
return $pop3_response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a string down the open socket connection to the POP3 server
|
||||
* @access private
|
||||
* @param string $string
|
||||
* @return integer
|
||||
*/
|
||||
private function sendString ($string) {
|
||||
$bytes_sent = fwrite($this->pop_conn, $string, strlen($string));
|
||||
|
||||
return $bytes_sent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the POP3 server response for +OK or -ERR
|
||||
* @access private
|
||||
* @param string $string
|
||||
* @return boolean
|
||||
*/
|
||||
private function checkResponse ($string) {
|
||||
if (substr($string, 0, 3) !== '+OK') {
|
||||
$this->error = array(
|
||||
'error' => "Server reported an error: $string",
|
||||
'errno' => 0,
|
||||
'errstr' => ''
|
||||
);
|
||||
|
||||
if ($this->do_debug >= 1) {
|
||||
$this->displayErrors();
|
||||
}
|
||||
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* If debug is enabled, display the error message array
|
||||
* @access private
|
||||
*/
|
||||
private function displayErrors () {
|
||||
echo '<pre>';
|
||||
|
||||
foreach ($this->error as $single_error) {
|
||||
print_r($single_error);
|
||||
}
|
||||
|
||||
echo '</pre>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes over from PHP for the socket warning handler
|
||||
* @access private
|
||||
* @param integer $errno
|
||||
* @param string $errstr
|
||||
* @param string $errfile
|
||||
* @param integer $errline
|
||||
*/
|
||||
private function catchWarning ($errno, $errstr, $errfile, $errline) {
|
||||
$this->error[] = array(
|
||||
'error' => "Connecting to the POP3 server raised a PHP warning: ",
|
||||
'errno' => $errno,
|
||||
'errstr' => $errstr
|
||||
);
|
||||
}
|
||||
|
||||
// End of class
|
||||
}
|
||||
?>
|
||||
1113
class.smtp.php
|
|
@ -1,120 +0,0 @@
|
|||
<html>
|
||||
<head>
|
||||
<style>
|
||||
body, p {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
div.width {
|
||||
width: 500px;
|
||||
text-align: left;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
<!--
|
||||
var popsite="http://phpmailer.codeworxtech.com"
|
||||
var withfeatures="width=960,height=760,scrollbars=1,resizable=1,toolbar=1,location=1,menubar=1,status=1,directories=0"
|
||||
var once_per_session=0
|
||||
function get_cookie(Name) {
|
||||
var search = Name + "="
|
||||
var returnvalue = "";
|
||||
if (document.cookie.length > 0) {
|
||||
offset = document.cookie.indexOf(search)
|
||||
if (offset != -1) { // if cookie exists
|
||||
offset += search.length
|
||||
// set index of beginning of value
|
||||
end = document.cookie.indexOf(";", offset);
|
||||
// set index of end of cookie value
|
||||
if (end == -1)
|
||||
end = document.cookie.length;
|
||||
returnvalue=unescape(document.cookie.substring(offset, end))
|
||||
}
|
||||
}
|
||||
return returnvalue;
|
||||
}
|
||||
function loadornot(){
|
||||
if (get_cookie('popsite')=='') {
|
||||
loadpopsite()
|
||||
document.cookie="popsite=yes"
|
||||
}
|
||||
}
|
||||
function loadpopsite(){
|
||||
win2=window.open(popsite,"",withfeatures)
|
||||
win2.blur()
|
||||
window.focus()
|
||||
}
|
||||
if (once_per_session==0) {
|
||||
loadpopsite()
|
||||
} else {
|
||||
loadornot()
|
||||
}
|
||||
-->
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<center>
|
||||
<div class="width">
|
||||
<hr>
|
||||
The http://phpmailer.codeworxtech.com/ website now carries a few
|
||||
advertisements through the Google Adsense network to help offset
|
||||
some of our costs.<br />
|
||||
Thanks ....<br />
|
||||
<hr>
|
||||
<p><b>My name is Andy Prevost, AKA "codeworxtech".</b><br />
|
||||
<a href="http://www.codeworxtech.com">www.codeworxtech.com</a> for more information.<br />
|
||||
</p>
|
||||
<p><strong>WHY USE OUR TOOLS & WHAT'S IN IT FOR YOU?</strong></p>
|
||||
<p>A valid question. We're developers too. We've been writing software, primarily for the internet, for more than 15 years. Along the way, there are two major things that had tremendous impact of our company: PHP and Open Source. PHP is without doubt the most popular platform for the internet. There has been more progress in this area of technology because of Open Source software than in any other IT segment. We have used many open source tools, some as learning tools, some as components in projects we were working on. To us, it's not about popularity ... we're committed to robust, stable, and efficient tools you can use to get your projects in your user's hands quickly. So the shorter answer: what's in it for you? rapid development and rapid deployment without fuss and with straight forward open source licensing.</p>
|
||||
<p>Now, the introductions:</p>
|
||||
<p>Our company, <strong>Codeworx Technologies</strong>, is the publisher of several Open Source applications and developer tools as well as several commercial PHP applications. The Open Source applications are ttCMS and DCP Portal. The Open Source developer tools include QuickComponents (QuickSkin, QuickCache, and QuickTabs) and now PHPMailer.
|
||||
We have staff and offices in the United States, Canada, Caribbean, the Middle
|
||||
East, and our primary development center in India. Our company is represented by
|
||||
agents and resellers globally.</p>
|
||||
<p><strong>Codeworx Technologies</strong> is at the forefront of developing PHP applications. Our staff are all Zend Certified university educated and experts at object oriented programming. While <strong>Codeworx Technologies</strong> can handle any project from trouble shooting programs written by others all the way to finished mission-critical applications, we specialize in taking projects from inception all the way through to implementation - on budget, and on time. If you need help with your projects, we're the team to get it done right at a reasonable price.</p>
|
||||
<p>Over the years, there have been a number of tools that have been constant favorites in all of our projects. We have become the project administrators for most of these tools.</p>
|
||||
<p>Our developer tools are all Open Source. Here's a brief description:</p>
|
||||
<ul>
|
||||
<li><span style="background-color: #FFFF00"><strong>PHPMailer</strong></span>. Originally authored by Brent Matzelle, PHPMailer is the leading "email transfer class" for PHP. PHPMailer is downloaded more than 18000 times each and every month by developers looking for a stable, simple email solution. We used it ourselves for years as our favorite tool. It's always been small (the entire footprint is around 100 Kb), stable, and as complete a solution as you can find. Other tools are nowhere near as simple. And more importantly, most of our applications (including PHPMailer) is implemented in a smaller footprint than one competing email class. Our thanks to Brent Matzelle for this superb tool - our commitment is to keep it lean, keep it focused, and compliant with standards. Visit the PHPMailer website at
|
||||
<a href="http://phpmailer.codeworxtech.com/">http://phpmailer.codeworxtech.com/</a>. <br />
|
||||
Please note: <strong>all of our focus is now on the PHPMailer for PHP5.</strong><br />
|
||||
<span style="background-color: #FFFF00">PS. While you are at it, please visit our sponsor's sites, click on their ads.
|
||||
It helps offset some of our costs.</span><br />
|
||||
Want to help? We're looking for progressive developers to join our team of volunteer professionals working on PHPMailer. Our entire focus is on PHPMailer for PHP5, and our next major task is to enhance our
|
||||
exception/error handling with PHP 5's object oriented try/throw/catch mechanisms. If you are interested, let us know.<br />
|
||||
<br />
|
||||
</li>
|
||||
<li><strong><span style="background-color: #FFFF00">QuickCache</span></strong>. Originally authored by Jean Pierre Deckers as jpCache, QuickCache is an HTTP OpCode caching strategy that works on your entire site with only one line of code at the top of your script. The cached pages can be stored as files or as database objects. The benefits are absolutely astounding: bandwidth savings of up to 80% and screen display times increased by 8 - 10x. Visit the QuickCache website at
|
||||
<a href="http://quickcache.codeworxtech.com/">http://quickcache.codeworxtech.com/</a>.<br />
|
||||
<br />
|
||||
</li>
|
||||
<li><strong><span style="background-color: #FFFF00">QuickSkin</span></strong>. Originally authored by Philipp v. Criegern and named "SmartTemplate". The project was taken over by Manuel 'EndelWar' Dalla Lana and now by "codeworxtech". QuickSkin is one of the truly outstanding templating engines available, but has always been confused with Smarty Templating Engine. QuickSkin is even more relevant today than when it was launched. It's a small footprint with big impact on your projects. It features a built in caching technology, token based substitution, and works on the concept of one single HTML file as the template. The HTML template file can contain variable information making it one small powerful tool for your developer tool kit. Visit the QuickSkin website at
|
||||
<a href="http://quickskin.codeworxtech.com/">http://quickskin.codeworxtech.com/</a>.<br />
|
||||
<br />
|
||||
</li>
|
||||
</ul>
|
||||
<p>We're committed to PHP and to the Open Source community.</p>
|
||||
<p>Opportunities with <strong>Codeworx Technologies</strong>:</p>
|
||||
<ul>
|
||||
<li><span style="background-color: #FFFF00">Resellers/Agents</span>: We're always interested in talking with companies that
|
||||
want to represent
|
||||
<strong>Codeworx Technologies</strong> in their markets. We also have private label programs for our commercial products (in certain circumstances).</li>
|
||||
<li>Programmers/Developers: We are usually fully staffed, however, if you would like to be considered for a career with
|
||||
<strong>Codeworx Technologies</strong>, we would be pleased to hear from you.<br />
|
||||
A few things to note:<br />
|
||||
<ul>
|
||||
<li>experience level does not matter: from fresh out of college to multi-year experience - it's your
|
||||
creative mind and a positive attitude we want</li>
|
||||
<li>if you contact us looking for employment, include a cover letter, indicate what type of work/career you are looking for and expected compensation</li>
|
||||
<li>if you are representing someone else looking for work, do not contact us. We have an exclusive relationship with a recruiting partner already and not interested in altering the arrangement. We will not hire your candidate under any circumstances unless they wish to approach us individually.</li>
|
||||
<li>any contact that ignores any of these points will be discarded</li>
|
||||
</ul></li>
|
||||
<li>Affiliates/Partnerships: We are interested in partnering with other firms who are leaders in their field. We clearly understand that successful companies are built on successful relationships in all industries world-wide. We currently have innovative relationships throughout the world that are mutually beneficial. Drop us a line and let's talk.</li>
|
||||
</ul>
|
||||
Regards,<br />
|
||||
Andy Prevost (aka, codeworxtech)<br />
|
||||
<a href="mailto:codeworxtech@users.sourceforge.net">codeworxtech@users.sourceforge.net</a><br />
|
||||
<br />
|
||||
</div>
|
||||
</center>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
{
|
||||
"name": "phpmailer/phpmailer",
|
||||
"type": "library",
|
||||
"description": "PHPMailer is a full-featured email creation and transfer class for PHP",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Marcus Bointon",
|
||||
"email": "phpmailer@synchromedia.co.uk"
|
||||
},
|
||||
{
|
||||
"name": "Jim Jagielski",
|
||||
"email": "jimjag@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Andy Prevost",
|
||||
"email": "codeworxtech@users.sourceforge.net"
|
||||
},
|
||||
{
|
||||
"name": "Brent R. Matzelle"
|
||||
}
|
||||
],
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://github.com/Synchro",
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"config": {
|
||||
"allow-plugins": {
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true
|
||||
},
|
||||
"lock": false
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.5.0",
|
||||
"ext-ctype": "*",
|
||||
"ext-filter": "*",
|
||||
"ext-hash": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"dealerdirect/phpcodesniffer-composer-installer": "^1.0",
|
||||
"doctrine/annotations": "^1.2.6 || ^1.13.3",
|
||||
"php-parallel-lint/php-console-highlighter": "^1.0.0",
|
||||
"php-parallel-lint/php-parallel-lint": "^1.3.2",
|
||||
"phpcompatibility/php-compatibility": "^10.0.0@dev",
|
||||
"squizlabs/php_codesniffer": "^3.13.5",
|
||||
"yoast/phpunit-polyfills": "^1.0.4"
|
||||
},
|
||||
"suggest": {
|
||||
"decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication",
|
||||
"ext-imap": "Needed to support advanced email address parsing according to RFC822",
|
||||
"ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
|
||||
"ext-openssl": "Needed for secure SMTP sending and DKIM signing",
|
||||
"greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication",
|
||||
"hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
|
||||
"league/oauth2-google": "Needed for Google XOAUTH2 authentication",
|
||||
"psr/log": "For optional PSR-3 debug logging",
|
||||
"symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)",
|
||||
"thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication",
|
||||
"directorytree/imapengine": "For uploading sent messages via IMAP, see gmail example"
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"PHPMailer\\PHPMailer\\": "src/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"PHPMailer\\Test\\": "test/"
|
||||
}
|
||||
},
|
||||
"license": "LGPL-2.1-only",
|
||||
"scripts": {
|
||||
"check": "./vendor/bin/phpcs",
|
||||
"style": "./vendor/bin/phpcbf",
|
||||
"test": "./vendor/bin/phpunit --no-coverage",
|
||||
"coverage": "./vendor/bin/phpunit",
|
||||
"lint": [
|
||||
"@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . --show-deprecated -e php,phps --exclude vendor --exclude .git --exclude build"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# PHPMailer Documentation
|
||||
|
||||
Generated documentation for PHPMailer is [available online](https://phpmailer.github.io/PHPMailer/), and is regenerated automatically whenever changes are made.
|
||||
|
||||
Pre-built PHPMailer API documentation is not provided in this repo, but you can generate it by running `phpdoc` in the top-level folder of this project, and documentation will be generated in this `docs` folder. You will need to have [phpDocumentor](https://www.phpdoc.org) installed. The configuration for phpdoc is in the [phpdoc.dist.xml file](https://github.com/PHPMailer/PHPMailer/blob/master/phpdoc.dist.xml).
|
||||
|
||||
Further help and information is available in [the PHPMailer README](https://github.com/PHPMailer/PHPMailer/blob/master/README.md), [the examples folder](https://github.com/PHPMailer/PHPMailer/tree/master/examples), and in [the GitHub wiki](https://github.com/PHPMailer/PHPMailer/wiki).
|
||||
|
||||
Fixes and additions to documentation are welcome - please submit pull requests or improve wiki pages.
|
||||
|
|
@ -1,148 +0,0 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Examples using phpmailer</title>
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF">
|
||||
|
||||
<h2>Examples using phpmailer</h2>
|
||||
|
||||
<h3>1. Advanced Example</h3>
|
||||
<p>
|
||||
|
||||
This demonstrates sending out multiple email messages with binary attachments
|
||||
from a MySQL database with multipart/alternative support.<p>
|
||||
<table cellpadding="4" border="1" width="80%">
|
||||
<tr>
|
||||
<td bgcolor="#CCCCCC">
|
||||
<pre>
|
||||
require("class.phpmailer.php");
|
||||
|
||||
$mail = new phpmailer();
|
||||
|
||||
$mail->From = "list@example.com";
|
||||
$mail->FromName = "List manager";
|
||||
$mail->Host = "smtp1.example.com;smtp2.example.com";
|
||||
$mail->Mailer = "smtp";
|
||||
|
||||
@MYSQL_CONNECT("localhost","root","password");
|
||||
@mysql_select_db("my_company");
|
||||
$query = "SELECT full_name, email, photo FROM employee WHERE id=$id";
|
||||
$result = @MYSQL_QUERY($query);
|
||||
|
||||
while ($row = mysql_fetch_array ($result))
|
||||
{
|
||||
// HTML body
|
||||
$body = "Hello <font size=\"4\">" . $row["full_name"] . "</font>, <p>";
|
||||
$body .= "<i>Your</i> personal photograph to this message.<p>";
|
||||
$body .= "Sincerely, <br>";
|
||||
$body .= "phpmailer List manager";
|
||||
|
||||
// Plain text body (for mail clients that cannot read HTML)
|
||||
$text_body = "Hello " . $row["full_name"] . ", \n\n";
|
||||
$text_body .= "Your personal photograph to this message.\n\n";
|
||||
$text_body .= "Sincerely, \n";
|
||||
$text_body .= "phpmailer List manager";
|
||||
|
||||
$mail->Body = $body;
|
||||
$mail->AltBody = $text_body;
|
||||
$mail->AddAddress($row["email"], $row["full_name"]);
|
||||
$mail->AddStringAttachment($row["photo"], "YourPhoto.jpg");
|
||||
|
||||
if(!$mail->Send())
|
||||
echo "There has been a mail error sending to " . $row["email"] . "<br>";
|
||||
|
||||
// Clear all addresses and attachments for next loop
|
||||
$mail->ClearAddresses();
|
||||
$mail->ClearAttachments();
|
||||
}
|
||||
</pre>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
|
||||
<h3>2. Extending phpmailer</h3>
|
||||
<p>
|
||||
|
||||
Extending classes with inheritance is one of the most
|
||||
powerful features of object-oriented
|
||||
programming. It allows you to make changes to the
|
||||
original class for your
|
||||
own personal use without hacking the original
|
||||
classes. Plus, it is very
|
||||
easy to do. I've provided an example:
|
||||
|
||||
<p>
|
||||
Here's a class that extends the phpmailer class and sets the defaults
|
||||
for the particular site:<br>
|
||||
PHP include file: <b>mail.inc.php</b>
|
||||
<p>
|
||||
|
||||
<table cellpadding="4" border="1" width="80%">
|
||||
<tr>
|
||||
<td bgcolor="#CCCCCC">
|
||||
<pre>
|
||||
require("class.phpmailer.php");
|
||||
|
||||
class my_phpmailer extends phpmailer {
|
||||
// Set default variables for all new objects
|
||||
var $From = "from@example.com";
|
||||
var $FromName = "Mailer";
|
||||
var $Host = "smtp1.example.com;smtp2.example.com";
|
||||
var $Mailer = "smtp"; // Alternative to IsSMTP()
|
||||
var $WordWrap = 75;
|
||||
|
||||
// Replace the default error_handler
|
||||
function error_handler($msg) {
|
||||
print("My Site Error");
|
||||
print("Description:");
|
||||
printf("%s", $msg);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Create an additional function
|
||||
function do_something($something) {
|
||||
// Place your new code here
|
||||
}
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
|
||||
Now here's a normal PHP page in the site, which will have all the defaults set
|
||||
above:<br>
|
||||
Normal PHP file: <b>mail_test.php</b>
|
||||
<p>
|
||||
|
||||
<table cellpadding="4" border="1" width="80%">
|
||||
<tr>
|
||||
<td bgcolor="#CCCCCC">
|
||||
<pre>
|
||||
require("mail.inc.php");
|
||||
|
||||
// Instantiate your new class
|
||||
$mail = new my_phpmailer;
|
||||
|
||||
// Now you only need to add the necessary stuff
|
||||
$mail->AddAddress("josh@example.com", "Josh Adams");
|
||||
$mail->Subject = "Here is the subject";
|
||||
$mail->Body = "This is the message body";
|
||||
$mail->AddAttachment("c:/temp/11-10-00.zip", "new_name.zip"); // optional name
|
||||
|
||||
if(!$mail->Send())
|
||||
{
|
||||
echo "There was an error sending the message";
|
||||
exit;
|
||||
}
|
||||
|
||||
echo "Message was sent successfully";
|
||||
</pre>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>PHPMailer FAQ</title>
|
||||
<style>
|
||||
body, p {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
div.width {
|
||||
width: 500px;
|
||||
text-align: left;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
<center>
|
||||
<div class="width">
|
||||
<h2>PHPMailer FAQ</h2>
|
||||
<ul>
|
||||
|
||||
<li><b style="background-color: #FFFF00">Q:</b> <b>I'm using the SMTP mailer and I keep on getting a timeout message
|
||||
well before the X seconds I set it for. What gives?</b><br />
|
||||
<b style="background-color: #FFFF00">A:</b> PHP versions 4.0.4pl1 and earlier have a bug in which sockets timeout
|
||||
early. You can fix this by re-compiling PHP 4.0.4pl1 with this fix:
|
||||
<a href="timeoutfix.diff">timeoutfix.diff</a>. Otherwise you can wait for the new PHP release.<br /><br /></li>
|
||||
|
||||
<li><b style="background-color: #FFFF00">Q:</b> <b>I am concerned that using include files will take up too much
|
||||
processing time on my computer. How can I make it run faster?</b><br />
|
||||
<b style="background-color: #FFFF00">A:</b> PHP by itself is very fast. Much faster than ASP or JSP running on
|
||||
the same type of server. This is because it has very little overhead compared
|
||||
to its competitors and it pre-compiles all of
|
||||
its code before it runs each script (in PHP4). However, all of
|
||||
this compiling and re-compiling can take up a lot of valuable
|
||||
computer resources. However, there are programs out there that compile
|
||||
PHP code and store it in memory (or on mmaped files) to reduce the
|
||||
processing immensely. Two of these: <a href="http://apc.communityconnect.com">APC
|
||||
(Alternative PHP Cache)</a> and <a href="http://bwcache.bware.it/index.htm">Afterburner</a>
|
||||
(<a href="http://www.mm4.de/php4win/mod_php4_win32/">Win32 download</a>)
|
||||
are excellent free tools that do just this. If you have the money
|
||||
you might also try <a href="http://www.zend.com">Zend Cache</a>, it is
|
||||
even faster than the open source varieties. All of these tools make your
|
||||
scripts run faster while also reducing the load on your server. I have tried
|
||||
them myself and they are quite stable too.<br /><br /></li>
|
||||
|
||||
<li><b style="background-color: #FFFF00">Q:</b> <b>What mailer gives me the best performance?</b><br />
|
||||
<b style="background-color: #FFFF00">A:</b> On a single machine the <b>sendmail (or Qmail)</b> is fastest overall.
|
||||
Next fastest is mail() to give you the best performance. Both do not have the overhead of SMTP.
|
||||
If you have you have your mail server on a another machine then
|
||||
SMTP is your only option, but you do get the benefit of redundant mail servers.<br />
|
||||
If you are running a mailing list with thousands of names, the fastest mailers in order are: SMTP, sendmail (or Qmail), mail().<br /><br /></li>
|
||||
|
||||
<li><b style="background-color: #FFFF00">Q:</b> <b>When I try to attach a file with on my server I get a
|
||||
"Could not find {file} on filesystem error". Why is this?</b><br />
|
||||
<b style="background-color: #FFFF00">A:</b> If you are using a Unix machine this is probably because the user
|
||||
running your web server does not have read access to the directory in question. If you are using Windows,
|
||||
then the problem probably is that you have used single backslashes to denote directories (\).
|
||||
A single backslash has a special meaning to PHP so these are not
|
||||
valid. Instead use double backslashes ("\\") or a single forward
|
||||
slash ("/").<br /><br /></li>
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</center>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
This is built for PHP Mailer 1.72 and was not tested with any previous version. It was developed under PHP 4.3.11 (E_ALL). It works under PHP 5 and 5.1 with E_ALL, but not in Strict mode due to var deprecation (but then neither does PHP Mailer either!). It follows the RFC 1939 standard explicitly and is fully commented.
|
||||
|
||||
With that noted, here is how to implement it:
|
||||
Install the class file
|
||||
|
||||
I didn't want to modify the PHP Mailer classes at all, so you will have to include/require this class along with the base one. It can sit quite happily in the phpmailer-1.72 directory:
|
||||
[geshi lang=php] require 'phpmailer-1.72/class.phpmailer.php'; require 'phpmailer-1.72/class.pop3.php'; [/geshi]
|
||||
When you need it, create your POP3 object
|
||||
|
||||
Right before I invoke PHP Mailer I activate the POP3 authorisation. POP3 before SMTP is a process whereby you login to your web hosts POP3 mail server BEFORE sending out any emails via SMTP. The POP3 logon 'verifies' your ability to send email by SMTP, which typically otherwise blocks you. On my web host (Pair Networks) a single POP3 logon is enough to 'verify' you for 90 minutes. Here is some sample PHP code that activates the POP3 logon and then sends an email via PHP Mailer:
|
||||
[geshi lang=php] Authorise('pop3.example.com', 110, 30, 'mailer', 'password', 1); $mail = new PHPMailer(); $mail->SMTPDebug = 2; $mail->IsSMTP(); $mail->IsHTML(false); $mail->Host = 'relay.example.com'; $mail->From = 'mailer@example.com'; $mail->FromName = 'Example Mailer'; $mail->Subject = 'My subject'; $mail->Body = 'Hello world'; $mail->AddAddress('rich@corephp.co.uk', 'Richard Davey'); if (!$mail->Send()) { echo $mail->ErrorInfo; } ?> [/geshi]
|
||||
|
||||
The PHP Mailer parts of this code should be obvious to anyone who has used PHP Mailer before. One thing to note - you almost certainly will not need to use SMTP Authentication *and* POP3 before SMTP together. The Authorisation method is a proxy method to all of the others within that class. There are Connect, Logon and Disconnect methods available, but I wrapped them in the single Authorisation one to make things easier.
|
||||
The Parameters
|
||||
|
||||
The Authorise parameters are as follows:
|
||||
[geshi lang=php]$pop->Authorise('pop3.example.com', 110, 30, 'mailer', 'password', 1);[/geshi]
|
||||
|
||||
1. pop3.example.com - The POP3 Mail Server Name (hostname or IP address)
|
||||
2. 110 - The POP3 Port on which to connect (default is usually 110, but check with your host)
|
||||
3. 30 - A connection time-out value (in seconds)
|
||||
4. mailer - The POP3 Username required to logon
|
||||
5. password - The POP3 Password required to logon
|
||||
6. 1 - The class debug level (0 = off, 1+ = debug output is echoed to the browser)
|
||||
|
||||
Final Comments + the Download
|
||||
|
||||
1) This class does not support APOP connections. This is only because I did not have an APOP server to test with, but if you'd like to see that added just contact me.
|
||||
|
||||
2) Opening and closing lots of POP3 connections can be quite a resource/network drain. If you need to send a whole batch of emails then just perform the authentication once at the start, and then loop through your mail sending script. Providing this process doesn't take longer than the verification period lasts on your POP3 server, you should be fine. With my host that period is 90 minutes, i.e. plenty of time.
|
||||
|
||||
3) If you have heavy requirements for this script (i.e. send a LOT of email on a frequent basis) then I would advise seeking out an alternative sending method (direct SMTP ideally). If this isn't possible then you could modify this class so the 'last authorised' date is recorded somewhere (MySQL, Flat file, etc) meaning you only open a new connection if the old one has expired, saving you precious overhead.
|
||||
|
||||
4) There are lots of other POP3 classes for PHP available. However most of them implement the full POP3 command set, where-as this one is purely for authentication, and much lighter as a result. However using any of the other POP3 classes to just logon to your server would have the same net result. At the end of the day, use whatever method you feel most comfortable with.
|
||||
Download
|
||||
|
||||
Here is the full class file plus my test script: POP_before_SMTP_PHPMailer.zip (4 KB) - Please note that it does not include PHPMailer itself.
|
||||
|
||||
My thanks to Chris Ryan for the inspiration (even if indirectly, via his SMTP class)
|
||||
|
|
@ -1,45 +0,0 @@
|
|||
<?php
|
||||
|
||||
// example on using PHPMailer with GMAIL
|
||||
|
||||
include("class.phpmailer.php");
|
||||
include("class.smtp.php"); // note, this is optional - gets called from main class if not already loaded
|
||||
|
||||
$mail = new PHPMailer();
|
||||
|
||||
$body = $mail->getFile('contents.html');
|
||||
$body = eregi_replace("[\]",'',$body);
|
||||
|
||||
$mail->IsSMTP();
|
||||
$mail->SMTPAuth = true; // enable SMTP authentication
|
||||
$mail->SMTPSecure = "ssl"; // sets the prefix to the servier
|
||||
$mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server
|
||||
$mail->Port = 465; // set the SMTP port
|
||||
|
||||
$mail->Username = "yourname@gmail.com"; // GMAIL username
|
||||
$mail->Password = "password"; // GMAIL password
|
||||
|
||||
$mail->From = "replyto@yourdomain.com";
|
||||
$mail->FromName = "Webmaster";
|
||||
$mail->Subject = "This is the subject";
|
||||
$mail->AltBody = "This is the body when user views in plain text format"; //Text Body
|
||||
$mail->WordWrap = 50; // set word wrap
|
||||
|
||||
$mail->MsgHTML($body);
|
||||
|
||||
$mail->AddReplyTo("replyto@yourdomain.com","Webmaster");
|
||||
|
||||
$mail->AddAttachment("/path/to/file.zip"); // attachment
|
||||
$mail->AddAttachment("/path/to/image.jpg", "new.jpg"); // attachment
|
||||
|
||||
$mail->AddAddress("username@domain.com","First Last");
|
||||
|
||||
$mail->IsHTML(true); // send as HTML
|
||||
|
||||
if(!$mail->Send()) {
|
||||
echo "Mailer Error: " . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo "Message has been sent";
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This shows how to make a new public/private key pair suitable for use with DKIM.
|
||||
* You should only need to do this once, and the public key (**not** the private key!)
|
||||
* you generate should be inserted in your DNS matching the selector you want.
|
||||
*
|
||||
* You can also use the DKIM wizard here: https://www.sparkpost.com/resources/tools/dkim-wizard/
|
||||
* but be aware that having your private key known anywhere outside your own server
|
||||
* is a security risk, and it's easy enough to create your own on your own server.
|
||||
*
|
||||
* For security, any keys you create should not be accessible via your web site.
|
||||
*
|
||||
* 2048 bits is the recommended minimum key length - gmail won't accept less than 1024 bits.
|
||||
* To test your DKIM config, use Sparkpost's DKIM tester:
|
||||
* https://tools.sparkpost.com/dkim
|
||||
*
|
||||
* Note that you only need a *private* key to *send* a DKIM-signed message,
|
||||
* but receivers need your *public* key in order to verify it.
|
||||
*
|
||||
* Your public key will need to be formatted appropriately for your DNS and
|
||||
* inserted there using the selector you want to use.
|
||||
*/
|
||||
|
||||
//Set these to match your domain and chosen DKIM selector
|
||||
$domain = 'example.com';
|
||||
$selector = 'phpmailer';
|
||||
|
||||
//Private key filename for this selector
|
||||
$privatekeyfile = $selector . '_dkim_private.pem';
|
||||
//Public key filename for this selector
|
||||
$publickeyfile = $selector . '_dkim_public.pem';
|
||||
|
||||
if (file_exists($privatekeyfile)) {
|
||||
echo "Using existing keys - if you want to generate new keys, delete old key files first.\n\n";
|
||||
$privatekey = file_get_contents($privatekeyfile);
|
||||
$publickey = file_get_contents($publickeyfile);
|
||||
} else {
|
||||
//Create a 2048-bit RSA key with an SHA256 digest
|
||||
$pk = openssl_pkey_new(
|
||||
[
|
||||
'digest_alg' => 'sha256',
|
||||
'private_key_bits' => 2048,
|
||||
'private_key_type' => OPENSSL_KEYTYPE_RSA,
|
||||
]
|
||||
);
|
||||
//Save private key
|
||||
openssl_pkey_export_to_file($pk, $privatekeyfile);
|
||||
//Save public key
|
||||
$pubKey = openssl_pkey_get_details($pk);
|
||||
$publickey = $pubKey['key'];
|
||||
file_put_contents($publickeyfile, $publickey);
|
||||
$privatekey = file_get_contents($privatekeyfile);
|
||||
}
|
||||
echo "Private key (keep this private!):\n\n" . $privatekey;
|
||||
echo "\n\nPublic key:\n\n" . $publickey;
|
||||
|
||||
//Prepare public key for DNS, e.g.
|
||||
//phpmailer._domainkey.example.com IN TXT "v=DKIM1; h=sha256; t=s; p=" "MIIBIjANBg...oXlwIDAQAB"...
|
||||
$dnskey = "$selector._domainkey.$domain IN TXT";
|
||||
$dnsvalue = '"v=DKIM1; h=sha256; t=s; p=" ';
|
||||
//Some DNS servers don't like ;(semi colon) chars unless backslash-escaped
|
||||
$dnsvalue2 = '"v=DKIM1\; h=sha256\; t=s\; p=" ';
|
||||
|
||||
//Strip and split the key into smaller parts and format for DNS
|
||||
//Many DNS systems don't like long TXT entries
|
||||
//but are OK if it's split into 255-char chunks
|
||||
//Remove PEM wrapper
|
||||
$publickey = preg_replace('/^-+.*?-+$/m', '', $publickey);
|
||||
//Strip line breaks
|
||||
$publickey = str_replace(["\r", "\n"], '', $publickey);
|
||||
//Split into chunks
|
||||
$keyparts = str_split($publickey, 253); //Becomes 255 when quotes are included
|
||||
//Quote each chunk
|
||||
foreach ($keyparts as $keypart) {
|
||||
$dnsvalue .= '"' . trim($keypart) . '" ';
|
||||
$dnsvalue2 .= '"' . trim($keypart) . '" ';
|
||||
}
|
||||
echo "\n\nDNS key:\n\n" . trim($dnskey);
|
||||
echo "\n\nDNS value:\n\n" . trim($dnsvalue);
|
||||
echo "\n\nDNS value (with escaping):\n\n" . trim($dnsvalue2);
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows sending a DKIM-signed message with PHPMailer.
|
||||
* More info about DKIM can be found here: https://www.dkim.org/info/dkim-faq.html
|
||||
* There's more to using DKIM than just this code - check out this article:
|
||||
* @see https://yomotherboard.com/how-to-setup-email-server-dkim-keys/
|
||||
* See also the DKIM_gen_keys example code in the examples folder,
|
||||
* which shows how to make a key pair from PHP.
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Usual setup
|
||||
$mail = new PHPMailer();
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
$mail->Subject = 'PHPMailer mail() test';
|
||||
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
|
||||
|
||||
//This should be the same as the domain of your From address
|
||||
$mail->DKIM_domain = 'example.com';
|
||||
//See the DKIM_gen_keys.phps script for making a key pair -
|
||||
//here we assume you've already done that.
|
||||
//Path to your private key:
|
||||
$mail->DKIM_private = 'dkim_private.pem';
|
||||
//Set this to your own selector
|
||||
$mail->DKIM_selector = 'phpmailer';
|
||||
//Put your private key's passphrase in here if it has one
|
||||
$mail->DKIM_passphrase = '';
|
||||
//The identity you're signing as - usually your From address
|
||||
$mail->DKIM_identity = $mail->From;
|
||||
//Suppress listing signed header fields in signature, defaults to true for debugging purpose
|
||||
$mail->DKIM_copyHeaderFields = false;
|
||||
//Optionally you can add extra headers for signing to meet special requirements
|
||||
$mail->DKIM_extraHeaders = ['List-Unsubscribe', 'List-Help'];
|
||||
|
||||
//When you send, the DKIM settings will be used to sign the message
|
||||
if (!$mail->send()) {
|
||||
echo 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo 'Message sent!';
|
||||
}
|
||||
|
|
@ -0,0 +1,96 @@
|
|||
[](https://github.com/PHPMailer/PHPMailer)
|
||||
# PHPMailer code examples
|
||||
|
||||
This folder contains a collection of examples of using [PHPMailer](https://github.com/PHPMailer/PHPMailer).
|
||||
|
||||
## About testing email sending
|
||||
|
||||
When working on email sending code you'll find yourself worrying about what might happen if all these test emails got sent to your mailing list. The solution is to use a fake mail server, one that acts just like the real thing, but just doesn't actually send anything out. Some offer web interfaces, feedback, logging, the ability to return specific error codes, all things that are useful for testing error handling, authentication etc. Here's a selection of mail testing tools you might like to try:
|
||||
|
||||
* [FakeEmail](https://github.com/tomwardill/FakeEmail), a Python-based fake mail server with a web interface.
|
||||
* [smtp-sink](https://www.postfix.org/smtp-sink.1.html), part of the Postfix mail server, so you may have this installed already. This is used in the GitHub actions configuration to run PHPMailer's unit tests.
|
||||
* [smtp4dev](https://github.com/rnwood/smtp4dev), a dummy SMTP server for Windows and Linux.
|
||||
* [fakesendmail.sh](https://github.com/PHPMailer/PHPMailer/blob/master/test/fakesendmail.sh), part of PHPMailer's test setup, this is a shell script that emulates sendmail for testing 'mail' or 'sendmail' methods in PHPMailer.
|
||||
* [HELO](https://usehelo.com), a very nice (commercial) mail server desktop app from BeyondCode, and [how to set it up for local testing](https://usehelo.com/blog/how-to-use-helo-with-phps-mail-function).
|
||||
* [msglint](https://www.splitbrain.org/_static/msglint/), not a mail server, the IETF's MIME structure analyser checks the formatting of your messages.
|
||||
* [MailHog](https://github.com/les-enovateurs/mailhog-examples), a Go-based email testing tool for developers with a web interface. You can use it with Docker and GitHub Actions to test your mails. The repository also contains a small part of PHPMailer's setup.
|
||||
* [aboutmy.email](https://aboutmy.email), a service for evaluating your email config – SPF, DKIM, DMARC, and compliance with list-unsubscribe, TLS, and many other settings.
|
||||
|
||||
Most of these examples use the `example.com` and `example.net` domains. These domains are reserved by IANA for illustrative purposes, as documented in [RFC 2606](https://www.rfc-editor.org/rfc/rfc2606). Don't use made-up domains like 'mydomain.com' or 'somedomain.com' in examples as someone, somewhere, probably owns them!
|
||||
|
||||
## Security note
|
||||
Before running these examples in a web server, you'll need to rename them with '.php' extensions. They are supplied as '.phps' files which will usually be displayed with syntax highlighting by PHP instead of running them. This prevents potential security issues with running potential spam-gateway code if you happen to deploy these code examples on a live site - _please don't do that!_
|
||||
|
||||
Similarly, don't leave your passwords in these files as they will be visible to the world!
|
||||
|
||||
## [mail.phps](mail.phps)
|
||||
|
||||
This is a basic example which creates an email message from an external HTML file, creates a plain text body, sets various addresses, adds an attachment and sends the message. It uses PHP's built-in mail() function which is the simplest to use, but relies on the presence of a local mail server, something which is not usually available on Windows. If you find yourself in that situation, either install a local mail server, or use a remote one and send using SMTP instead.
|
||||
|
||||
## [simple_contact_form.phps](simple_contact_form.phps)
|
||||
|
||||
This is probably the most common reason for using PHPMailer - building a contact form. This example has a basic, unstyled form and also illustrates how to filter input data before using it, how to validate addresses, how to avoid being abused as a spam gateway, and how to address messages correctly so that you don't fail SPF checks.
|
||||
|
||||
## [exceptions.phps](exceptions.phps)
|
||||
|
||||
Like the mail example, but shows how to use PHPMailer's optional exceptions for error handling.
|
||||
|
||||
## [extending.phps](extending.phps)
|
||||
|
||||
This shows how to create a subclass of PHPMailer to customise its behaviour and simplify coding in your app.
|
||||
|
||||
## [smtp.phps](smtp.phps)
|
||||
|
||||
A simple example sending using SMTP with authentication.
|
||||
|
||||
## [smtp_no_auth.phps](smtp_no_auth.phps)
|
||||
|
||||
A simple example sending using SMTP without authentication.
|
||||
|
||||
## [send_file_upload.phps](send_file_upload.phps)
|
||||
|
||||
Lots of people want to do this... This is a simple form which accepts a file upload and emails it.
|
||||
|
||||
## [send_multiple_file_upload.phps](send_multiple_file_upload.phps)
|
||||
|
||||
A slightly more complex form that allows uploading multiple files at once and sends all of them as attachments to an email.
|
||||
|
||||
## [sendmail.phps](sendmail.phps)
|
||||
|
||||
A simple example using sendmail. Sendmail is a program (usually found on Linux/BSD, OS X and other UNIX-alikes) that can be used to submit messages to a local mail server without a lengthy SMTP conversation. It's probably the fastest sending mechanism, but lacks some error reporting features. There are sendmail emulators for most popular mail servers including postfix, qmail, exim etc.
|
||||
|
||||
## [gmail.phps](gmail.phps)
|
||||
|
||||
Submitting email via Google's Gmail service is a popular use of PHPMailer. It's much the same as normal SMTP sending, just with some specific settings, namely using TLS encryption, authentication is enabled, and it connects to the SMTP submission port 587 on the smtp.gmail.com host. This example does all that.
|
||||
|
||||
## [gmail_xoauth.phps](gmail_xoauth.phps)
|
||||
|
||||
Gmail now likes you to use XOAUTH2 for SMTP authentication. This is extremely laborious to set up, but once it's done you can use it repeatedly and will no longer need Gmail's ineptly-named "Allow less secure apps" setting enabled. [Read the guide in the wiki](https://github.com/PHPMailer/PHPMailer/wiki/Using-Gmail-with-XOAUTH2) for how to set it up.
|
||||
|
||||
## [pop_before_smtp.phps](pop_before_smtp.phps)
|
||||
|
||||
Back in the stone age, before effective SMTP authentication mechanisms were available, it was common for ISPs to use POP-before-SMTP authentication. As it implies, you authenticate using the POP3 protocol (an older protocol now mostly replaced by the far superior IMAP), and then the SMTP server will allow send access from your IP address for a short while, usually 5-15 minutes. PHPMailer includes a basic POP3 protocol client with just enough functionality to carry out this sequence - it's just like a normal SMTP conversation (without authentication), but connects via POP3 first.
|
||||
|
||||
## [mailing_list.phps](mailing_list.phps)
|
||||
|
||||
This is a somewhat naïve, but reasonably efficient example of sending similar emails to a list of different addresses. It sets up a PHPMailer instance using SMTP, then connects to a MySQL database to retrieve a list of recipients. The code loops over this list, sending email to each person using their info and marks them as sent in the database. It makes use of SMTP keepalive which saves reconnecting and re-authenticating between each message.
|
||||
|
||||
## [ssl_options.phps](ssl_options.phps)
|
||||
|
||||
PHP 5.6 introduced SSL certificate verification by default, and this applies to mail servers exactly as it does to web servers. Unfortunately, SSL misconfiguration in mail servers is quite common, so this caused a common problem: those that were previously using servers with bad configs suddenly found they stopped working when they upgraded PHP. PHPMailer provides a mechanism to disable SSL certificate verification as a workaround and this example shows how to do it. Bear in mind that this is **not** a good approach - the right way is to fix your mail server config!
|
||||
|
||||
## [smime_signed_mail.phps](smime_signed_mail.phps)
|
||||
|
||||
An example of how to sign messages using [S/MIME](https://en.wikipedia.org/wiki/S/MIME), ensuring that your data can't be tampered with in transit, and proves to recipients that it was you that sent it.
|
||||
|
||||
* * *
|
||||
|
||||
## [smtp_check.phps](smtp_check.phps)
|
||||
|
||||
This is an example showing how to use the SMTP class by itself (without PHPMailer) to check an SMTP connection.
|
||||
|
||||
## [smtp_low_memory.phps](smtp_low_memory.phps)
|
||||
|
||||
This demonstrates how to extend the SMTP class and make PHPMailer use it. In this case it's an effort to make the SMTP class use less memory when sending large attachments.
|
||||
|
||||
* * *
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows how to send via Microsoft Outlook's servers using XOAUTH2 authentication
|
||||
* using the league/oauth2-client to provide the OAuth2 token.
|
||||
* To use a different OAuth2 library create a wrapper class that implements OAuthTokenProvider and
|
||||
* pass that wrapper class to PHPMailer::setOAuth().
|
||||
*/
|
||||
|
||||
//Import PHPMailer classes into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
use PHPMailer\PHPMailer\OAuth;
|
||||
//Alias the League Google OAuth2 provider class
|
||||
use Greew\OAuth2\Client\Provider\Azure;
|
||||
|
||||
//SMTP needs accurate times, and the PHP time zone MUST be set
|
||||
//This should be done in your php.ini, but this is how to do it if you don't have access to that
|
||||
date_default_timezone_set('Etc/UTC');
|
||||
|
||||
//Load dependencies from composer
|
||||
//If this causes an error, run 'composer install'
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
|
||||
//Tell PHPMailer to use SMTP
|
||||
$mail->isSMTP();
|
||||
|
||||
//Enable SMTP debugging
|
||||
//SMTP::DEBUG_OFF = off (for production use)
|
||||
//SMTP::DEBUG_CLIENT = client messages
|
||||
//SMTP::DEBUG_SERVER = client and server messages
|
||||
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
|
||||
|
||||
//Set the hostname of the mail server
|
||||
$mail->Host = 'smtp.office365.com';
|
||||
|
||||
//Set the SMTP port number:
|
||||
// - 465 for SMTP with implicit TLS, a.k.a. RFC8314 SMTPS or
|
||||
// - 587 for SMTP+STARTTLS
|
||||
$mail->Port = 587;
|
||||
|
||||
//Set the encryption mechanism to use:
|
||||
// - SMTPS (implicit TLS on port 465) or
|
||||
// - STARTTLS (explicit TLS on port 587)
|
||||
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
|
||||
|
||||
//Whether to use SMTP authentication
|
||||
$mail->SMTPAuth = true;
|
||||
|
||||
//Set AuthType to use XOAUTH2
|
||||
$mail->AuthType = 'XOAUTH2';
|
||||
|
||||
//Start Option 1: Use league/oauth2-client as OAuth2 token provider
|
||||
//Fill in authentication details here
|
||||
//Either the microsoft account owner, or the user that gave consent
|
||||
$email = 'someone@somemicrosoftaccount.com';
|
||||
$clientId = 'RANDOMCHARS-----duv1n2TS';
|
||||
$clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';
|
||||
$tenantId = 'RANDOMCHARS-----HSFTAOIlagss';
|
||||
|
||||
//Obtained by configuring and running get_oauth_token.php
|
||||
//after setting up an app in Google Developer Console.
|
||||
$refreshToken = 'RANDOMCHARS-----DWxgOvPT003r-yFUV49TQYag7_Aod7y0';
|
||||
|
||||
//Create a new OAuth2 provider instance
|
||||
$provider = new Azure(
|
||||
[
|
||||
'clientId' => $clientId,
|
||||
'clientSecret' => $clientSecret,
|
||||
'tenantId' => $tenantId,
|
||||
]
|
||||
);
|
||||
|
||||
//Pass the OAuth provider instance to PHPMailer
|
||||
$mail->setOAuth(
|
||||
new OAuth(
|
||||
[
|
||||
'provider' => $provider,
|
||||
'clientId' => $clientId,
|
||||
'clientSecret' => $clientSecret,
|
||||
'refreshToken' => $refreshToken,
|
||||
'userName' => $email,
|
||||
]
|
||||
)
|
||||
);
|
||||
//End Option 1
|
||||
|
||||
//Option 2: Another OAuth library as OAuth2 token provider
|
||||
//Set up the other oauth library as per its documentation
|
||||
//Then create the wrapper class that implementations OAuthTokenProvider
|
||||
$oauthTokenProvider = new MyOAuthTokenProvider(/* Email, ClientId, ClientSecret, etc. */);
|
||||
|
||||
//Pass the implementation of OAuthTokenProvider to PHPMailer
|
||||
$mail->setOAuth($oauthTokenProvider);
|
||||
//End Option 2
|
||||
|
||||
//Set who the message is to be sent from
|
||||
//For Outlook, this generally needs to be the same as the user you logged in as
|
||||
$mail->setFrom($email, 'First Last');
|
||||
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('someone@someserver.com', 'John Doe');
|
||||
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer Outlook XOAUTH2 SMTP test';
|
||||
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//convert HTML into a basic plain-text alternative body
|
||||
$mail->CharSet = PHPMailer::CHARSET_UTF8;
|
||||
$mail->msgHTML(file_get_contents('contentsutf8.html'), __DIR__);
|
||||
|
||||
//Replace the plain text body with one created manually
|
||||
$mail->AltBody = 'This is a plain-text message body';
|
||||
|
||||
//Attach an image file
|
||||
$mail->addAttachment('images/phpmailer_mini.png');
|
||||
|
||||
//send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
echo 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo 'Message sent!';
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows how to use a callback function from PHPMailer.
|
||||
*/
|
||||
|
||||
//Import PHPMailer classes into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
/**
|
||||
* Example PHPMailer callback function.
|
||||
* This is a global function, but you can also pass a closure (or any other callable)
|
||||
* to the `action_function` property.
|
||||
*
|
||||
* @param bool $result result of the send action
|
||||
* @param array $to email address of the recipient
|
||||
* @param array $cc cc email addresses
|
||||
* @param array $bcc bcc email addresses
|
||||
* @param string $subject the subject
|
||||
* @param string $body the email body
|
||||
*/
|
||||
function callbackAction($result, $to, $cc, $bcc, $subject, $body)
|
||||
{
|
||||
echo "Message subject: \"$subject\"\n";
|
||||
foreach ($to as $address) {
|
||||
echo "Message to {$address[1]} <{$address[0]}>\n";
|
||||
}
|
||||
foreach ($cc as $address) {
|
||||
echo "Message CC to {$address[1]} <{$address[0]}>\n";
|
||||
}
|
||||
foreach ($bcc as $toaddress) {
|
||||
echo "Message BCC to {$toaddress[1]} <{$toaddress[0]}>\n";
|
||||
}
|
||||
if ($result) {
|
||||
echo "Message sent successfully\n";
|
||||
} else {
|
||||
echo "Message send failed\n";
|
||||
}
|
||||
}
|
||||
|
||||
require_once '../vendor/autoload.php';
|
||||
|
||||
$mail = new PHPMailer();
|
||||
|
||||
try {
|
||||
$mail->isMail();
|
||||
$mail->setFrom('you@example.com', 'Your Name');
|
||||
$mail->addAddress('jane@example.com', 'Jane Doe');
|
||||
$mail->addCC('john@example.com', 'John Doe');
|
||||
$mail->Subject = 'PHPMailer Test Subject';
|
||||
$mail->msgHTML(file_get_contents('../examples/contents.html'));
|
||||
//Optional - msgHTML will create an alternate automatically
|
||||
$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!';
|
||||
$mail->addAttachment('images/phpmailer_mini.png');
|
||||
$mail->action_function = 'callbackAction';
|
||||
$mail->send();
|
||||
} catch (Exception $e) {
|
||||
echo $e->errorMessage();
|
||||
}
|
||||
|
||||
//Alternative approach using a closure
|
||||
try {
|
||||
$mail->action_function = static function ($result, $to, $cc, $bcc, $subject, $body) {
|
||||
if ($result) {
|
||||
echo "Message sent successfully\n";
|
||||
} else {
|
||||
echo "Message send failed\n";
|
||||
}
|
||||
};
|
||||
$mail->send();
|
||||
} catch (Exception $e) {
|
||||
echo $e->errorMessage();
|
||||
}
|
||||
|
|
@ -0,0 +1,146 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows how to handle a simple contact form safely.
|
||||
*/
|
||||
|
||||
//Import PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
|
||||
//Don't run this unless we're handling a form submission
|
||||
if (array_key_exists('email', $_POST)) {
|
||||
date_default_timezone_set('Etc/UTC');
|
||||
require '../vendor/autoload.php';
|
||||
$isAjax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
|
||||
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
//Send using SMTP to localhost (faster and safer than using mail()) – requires a local mail server
|
||||
//See other examples for how to use a remote server such as gmail
|
||||
$mail->isSMTP();
|
||||
$mail->Host = 'localhost';
|
||||
$mail->Port = 25;
|
||||
|
||||
//Use a fixed address in your own domain as the from address
|
||||
//**DO NOT** use the submitter's address here as it will be forgery
|
||||
//and will cause your messages to fail SPF checks
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
//Choose who the message should be sent to
|
||||
//You don't have to use a <select> like in this example, you can simply use a fixed address
|
||||
//the important thing is *not* to trust an email address submitted from the form directly,
|
||||
//as an attacker can substitute their own and try to use your form to send spam
|
||||
$addresses = [
|
||||
'sales' => 'sales@example.com',
|
||||
'support' => 'support@example.com',
|
||||
'accounts' => 'accounts@example.com',
|
||||
];
|
||||
//Validate address selection before trying to use it
|
||||
if (array_key_exists('dept', $_POST) && array_key_exists($_POST['dept'], $addresses)) {
|
||||
$mail->addAddress($addresses[$_POST['dept']]);
|
||||
} else {
|
||||
//Fall back to a fixed address if dept selection is invalid or missing
|
||||
$mail->addAddress('support@example.com');
|
||||
}
|
||||
//Put the submitter's address in a reply-to header
|
||||
//This will fail if the address provided is invalid,
|
||||
//in which case we should ignore the whole request
|
||||
if ($mail->addReplyTo($_POST['email'], $_POST['name'])) {
|
||||
$mail->Subject = 'PHPMailer contact form';
|
||||
//Keep it simple - don't use HTML
|
||||
$mail->isHTML(false);
|
||||
//Build a simple message body
|
||||
$mail->Body = <<<EOT
|
||||
Email: {$_POST['email']}
|
||||
Name: {$_POST['name']}
|
||||
Message: {$_POST['message']}
|
||||
EOT;
|
||||
|
||||
//Send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
//The reason for failing to send will be in $mail->ErrorInfo
|
||||
//but it's unsafe to display errors directly to users - process the error, log it on your server.
|
||||
if ($isAjax) {
|
||||
http_response_code(500);
|
||||
}
|
||||
|
||||
$response = [
|
||||
"status" => false,
|
||||
"message" => 'Sorry, something went wrong. Please try again later.'
|
||||
];
|
||||
} else {
|
||||
$response = [
|
||||
"status" => true,
|
||||
"message" => 'Message sent! Thanks for contacting us.'
|
||||
];
|
||||
}
|
||||
} else {
|
||||
$response = [
|
||||
"status" => false,
|
||||
"message" => 'Invalid email address, message ignored.'
|
||||
];
|
||||
}
|
||||
|
||||
if ($isAjax) {
|
||||
header('Content-type:application/json;charset=utf-8');
|
||||
echo json_encode($response);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Contact form</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Contact us</h1>
|
||||
<h2 id="status-message"><?php if (isset($response)) {
|
||||
echo $response['message'];
|
||||
}?></h2>
|
||||
<form method="POST" id="contact-form">
|
||||
<label for="name">Name: <input type="text" name="name" id="name"></label><br>
|
||||
<label for="email">Email address: <input type="email" name="email" id="email"></label><br>
|
||||
<label for="message">Message: <textarea name="message" id="message" rows="8" cols="20"></textarea></label><br>
|
||||
<label for="dept">Send query to department:</label>
|
||||
<select name="dept" id="dept">
|
||||
<option value="sales">Sales</option>
|
||||
<option value="support" selected>Technical support</option>
|
||||
<option value="accounts">Accounts</option>
|
||||
</select><br>
|
||||
<input type="submit" value="Send">
|
||||
</form>
|
||||
|
||||
<script type="application/javascript">
|
||||
const form = document.getElementById("contact-form")
|
||||
|
||||
function email(data) {
|
||||
const message = document.getElementById("status-message")
|
||||
fetch("", {
|
||||
method: "POST",
|
||||
body: data,
|
||||
headers: {
|
||||
'X-Requested-With' : 'XMLHttpRequest'
|
||||
}
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(response => {message.innerHTML = response.message})
|
||||
.catch(error => {
|
||||
error.json().then(response => {
|
||||
message.innerHTML = response.message
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
const submitEvent = form.addEventListener("submit", (event) => {
|
||||
event.preventDefault();
|
||||
|
||||
const formData = new FormData(form);
|
||||
|
||||
email(formData);
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows how to handle a simple contact form safely.
|
||||
*/
|
||||
|
||||
//Import PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
|
||||
$msg = '';
|
||||
//Don't run this unless we're handling a form submission
|
||||
if (array_key_exists('email', $_POST)) {
|
||||
date_default_timezone_set('Etc/UTC');
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
//Send using SMTP to localhost (faster and safer than using mail()) – requires a local mail server
|
||||
//See other examples for how to use a remote server such as gmail
|
||||
$mail->isSMTP();
|
||||
$mail->Host = 'localhost';
|
||||
$mail->Port = 25;
|
||||
|
||||
//Use a fixed address in your own domain as the from address
|
||||
//**DO NOT** use the submitter's address here as it will be forgery
|
||||
//and will cause your messages to fail SPF checks
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
//Choose who the message should be sent to
|
||||
//You don't have to use a <select> like in this example, you can simply use a fixed address
|
||||
//the important thing is *not* to trust an email address submitted from the form directly,
|
||||
//as an attacker can substitute their own and try to use your form to send spam
|
||||
$addresses = [
|
||||
'sales' => 'sales@example.com',
|
||||
'support' => 'support@example.com',
|
||||
'accounts' => 'accounts@example.com',
|
||||
];
|
||||
//Validate address selection before trying to use it
|
||||
if (array_key_exists('dept', $_POST) && array_key_exists($_POST['dept'], $addresses)) {
|
||||
$mail->addAddress($addresses[$_POST['dept']]);
|
||||
} else {
|
||||
//Fall back to a fixed address if dept selection is invalid or missing
|
||||
$mail->addAddress('support@example.com');
|
||||
}
|
||||
//Put the submitter's address in a reply-to header
|
||||
//This will fail if the address provided is invalid,
|
||||
//in which case we should ignore the whole request
|
||||
if ($mail->addReplyTo($_POST['email'], $_POST['name'])) {
|
||||
$mail->Subject = 'PHPMailer contact form';
|
||||
//Keep it simple - don't use HTML
|
||||
$mail->isHTML(false);
|
||||
//Build a simple message body
|
||||
$mail->Body = <<<EOT
|
||||
Email: {$_POST['email']}
|
||||
Name: {$_POST['name']}
|
||||
Message: {$_POST['message']}
|
||||
EOT;
|
||||
//Send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
//The reason for failing to send will be in $mail->ErrorInfo
|
||||
//but it's unsafe to display errors directly to users - process the error, log it on your server.
|
||||
$msg = 'Sorry, something went wrong. Please try again later.';
|
||||
} else {
|
||||
$msg = 'Message sent! Thanks for contacting us.';
|
||||
}
|
||||
} else {
|
||||
$msg = 'Invalid email address, message ignored.';
|
||||
}
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Contact form</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Contact us</h1>
|
||||
<?php if (!empty($msg)) {
|
||||
echo "<h2>$msg</h2>";
|
||||
} ?>
|
||||
<form method="POST">
|
||||
<label for="name">Name: <input type="text" name="name" id="name"></label><br>
|
||||
<label for="email">Email address: <input type="email" name="email" id="email"></label><br>
|
||||
<label for="message">Message: <textarea name="message" id="message" rows="8" cols="20"></textarea></label><br>
|
||||
<label for="dept">Send query to department:</label>
|
||||
<select name="dept" id="dept">
|
||||
<option value="sales">Sales</option>
|
||||
<option value="support" selected>Technical support</option>
|
||||
<option value="accounts">Accounts</option>
|
||||
</select><br>
|
||||
<input type="submit" value="Send">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,12 +1,17 @@
|
|||
<body background="images/bkgrnd.gif" style="margin: 0px;">
|
||||
<div style="width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 11px;">
|
||||
<div align="center"><img src="images/phpmailer.gif" style="height: 90px; width: 340px"></div><br>
|
||||
<br>
|
||||
This is a test of PHPMailer v2.0.0 rc1.<br>
|
||||
<br>
|
||||
This particular example uses <strong>HTML</strong>, with a <div> tag and inline<br>
|
||||
styles.<br>
|
||||
<br>
|
||||
Also note the use of the PHPMailer at the top with no specific code to handle
|
||||
including it in the body of the email.</div>
|
||||
</body>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>PHPMailer Test</title>
|
||||
</head>
|
||||
<body>
|
||||
<div style="width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 11px;">
|
||||
<h1>This is a test of PHPMailer.</h1>
|
||||
<div align="center">
|
||||
<a href="https://github.com/PHPMailer/PHPMailer/"><img src="images/phpmailer.png" height="90" width="340" alt="PHPMailer rocks"></a>
|
||||
</div>
|
||||
<p>This example uses <strong>HTML</strong>.</p>
|
||||
<p>ISO-8859-1 text: éèîüçÅñæß</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>PHPMailer Test</title>
|
||||
</head>
|
||||
<body>
|
||||
<div style="width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 11px;">
|
||||
<h1>This is a test of PHPMailer.</h1>
|
||||
<div align="center">
|
||||
<a href="https://github.com/PHPMailer/PHPMailer/"><img src="images/phpmailer.png" height="90" width="340" alt="PHPMailer rocks"></a>
|
||||
</div>
|
||||
<p>This example uses <strong>HTML</strong> with the UTF-8 Unicode charset.</p>
|
||||
<p>Chinese text: 郵件內容為空</p>
|
||||
<p>Russian text: Пустое тело сообщения</p>
|
||||
<p>Armenian text: Հաղորդագրությունը դատարկ է</p>
|
||||
<p>Czech text: Prázdné tělo zprávy</p>
|
||||
<p>Emoji: <span style="font-size: 48px">😂 🦄 💥 📤 📧</span></p>
|
||||
<p>Image data URL (base64)<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" alt="#"></p>
|
||||
<p>Image data URL (URL-encoded)<img src="data:image/gif,GIF89a%01%00%01%00%00%00%00%21%F9%04%01%0A%00%01%00%2C%00%00%00%00%01%00%01%00%00%02%02L%01%00%3B" alt="#"></p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows how to make use of PHPMailer's exceptions for error handling.
|
||||
*/
|
||||
|
||||
//Import PHPMailer classes into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
//Passing true to the constructor enables the use of exceptions for error handling
|
||||
$mail = new PHPMailer(true);
|
||||
try {
|
||||
//Set who the message is to be sent from
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
//Set an alternative reply-to address
|
||||
$mail->addReplyTo('replyto@example.com', 'First Last');
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer Exceptions test';
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//and convert the HTML into a basic plain-text alternative body
|
||||
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
|
||||
//Replace the plain text body with one created manually
|
||||
$mail->AltBody = 'This is a plain-text message body';
|
||||
//Attach an image file
|
||||
$mail->addAttachment('images/phpmailer_mini.png');
|
||||
//send the message
|
||||
//Note that we don't need check the response from this because it will throw an exception if it has trouble
|
||||
$mail->send();
|
||||
echo 'Message sent!';
|
||||
} catch (Exception $e) {
|
||||
echo $e->errorMessage(); //Pretty error messages from PHPMailer
|
||||
} catch (\Exception $e) { //The leading slash means the Global PHP Exception class will be caught
|
||||
echo $e->getMessage(); //Boring error messages from anything else!
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows how to extend PHPMailer to simplify your coding.
|
||||
* If PHPMailer doesn't do something the way you want it to, or your code
|
||||
* contains too much boilerplate, don't edit the library files,
|
||||
* create a subclass instead and customise that.
|
||||
* That way all your changes will be retained when PHPMailer is updated.
|
||||
*/
|
||||
|
||||
//Import PHPMailer classes into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
/**
|
||||
* Use PHPMailer as a base class and extend it
|
||||
*/
|
||||
class MyPHPMailer extends PHPMailer
|
||||
{
|
||||
/**
|
||||
* myPHPMailer constructor.
|
||||
*
|
||||
* @param bool|null $exceptions
|
||||
* @param string $body A default HTML message body
|
||||
*/
|
||||
public function __construct($exceptions, $body = '')
|
||||
{
|
||||
//Don't forget to do this or other things may not be set correctly!
|
||||
parent::__construct($exceptions);
|
||||
//Set a default 'From' address
|
||||
$this->setFrom('joe@example.com', 'Joe User');
|
||||
//Send via SMTP
|
||||
$this->isSMTP();
|
||||
//Equivalent to setting `Host`, `Port` and `SMTPSecure` all at once
|
||||
$this->Host = 'tls://smtp.example.com:587';
|
||||
//Set an HTML and plain-text body, import relative image references
|
||||
$this->msgHTML($body, './images/');
|
||||
//Show debug output
|
||||
$this->SMTPDebug = SMTP::DEBUG_SERVER;
|
||||
//Inject a new debug output handler
|
||||
$this->Debugoutput = static function ($str, $level) {
|
||||
echo "Debug level $level; message: $str\n";
|
||||
};
|
||||
}
|
||||
|
||||
//Extend the send function
|
||||
public function send()
|
||||
{
|
||||
$this->Subject = '[Yay for me!] ' . $this->Subject;
|
||||
$r = parent::send();
|
||||
echo 'I sent a message with subject ' . $this->Subject;
|
||||
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
|
||||
//Now creating and sending a message becomes simpler when you use this class in your app code
|
||||
try {
|
||||
//Instantiate your new class, making use of the new `$body` parameter
|
||||
$mail = new myPHPMailer(true, '<strong>This is the message body</strong>');
|
||||
//Now you only need to set things that are different from the defaults you defined
|
||||
$mail->addAddress('jane@example.com', 'Jane User');
|
||||
$mail->Subject = 'Here is the subject';
|
||||
$mail->addAttachment(__FILE__, 'myPHPMailer.php');
|
||||
$mail->send(); //No need to check for errors - the exception handler will do it
|
||||
} catch (Exception $e) {
|
||||
//Note that this is catching the PHPMailer Exception class, not the global \Exception type!
|
||||
echo 'Caught a ' . get_class($e) . ': ' . $e->getMessage();
|
||||
}
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows settings to use when sending via Google's Gmail servers.
|
||||
* This uses traditional id & password authentication - look at the gmail_xoauth.phps
|
||||
* example to see how to use XOAUTH2.
|
||||
* The IMAP section shows how to save this message to the 'Sent Mail' folder using IMAP commands.
|
||||
*/
|
||||
|
||||
//Import PHPMailer classes into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
|
||||
//Tell PHPMailer to use SMTP
|
||||
$mail->isSMTP();
|
||||
|
||||
//Enable SMTP debugging
|
||||
//SMTP::DEBUG_OFF = off (for production use)
|
||||
//SMTP::DEBUG_CLIENT = client messages
|
||||
//SMTP::DEBUG_SERVER = client and server messages
|
||||
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
|
||||
|
||||
//Set the hostname of the mail server
|
||||
$mail->Host = 'smtp.gmail.com';
|
||||
//Use `$mail->Host = gethostbyname('smtp.gmail.com');`
|
||||
//if your network does not support SMTP over IPv6,
|
||||
//though this may cause issues with TLS
|
||||
|
||||
//Set the SMTP port number:
|
||||
// - 465 for SMTP with implicit TLS, a.k.a. RFC8314 SMTPS or
|
||||
// - 587 for SMTP+STARTTLS
|
||||
$mail->Port = 465;
|
||||
|
||||
//Set the encryption mechanism to use:
|
||||
// - SMTPS (implicit TLS on port 465) or
|
||||
// - STARTTLS (explicit TLS on port 587)
|
||||
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
|
||||
|
||||
//Whether to use SMTP authentication
|
||||
$mail->SMTPAuth = true;
|
||||
|
||||
//Username to use for SMTP authentication - use full email address for gmail
|
||||
$mail->Username = 'username@gmail.com';
|
||||
|
||||
//Password to use for SMTP authentication
|
||||
$mail->Password = 'yourpassword';
|
||||
|
||||
//Set who the message is to be sent from
|
||||
//Note that with gmail you can only use your account address (same as `Username`)
|
||||
//or predefined aliases that you have configured within your account.
|
||||
//Do not use user-submitted addresses in here
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
|
||||
//Set an alternative reply-to address
|
||||
//This is a good place to put user-submitted addresses
|
||||
$mail->addReplyTo('replyto@example.com', 'First Last');
|
||||
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer GMail SMTP test';
|
||||
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//convert HTML into a basic plain-text alternative body
|
||||
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
|
||||
|
||||
//Replace the plain text body with one created manually
|
||||
$mail->AltBody = 'This is a plain-text message body';
|
||||
|
||||
//Attach an image file
|
||||
$mail->addAttachment('images/phpmailer_mini.png');
|
||||
|
||||
//send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
echo 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo 'Message sent!';
|
||||
//Section 2: IMAP
|
||||
//Uncomment these to save your message in the 'Sent Mail' folder.
|
||||
#save_mail($mail->getSentMIMEMessage());
|
||||
}
|
||||
|
||||
//Section 2: IMAP
|
||||
//This example uses the directorytree/imapengine IMAP library: https://imapengine.com
|
||||
//Earlier versions of this code used the deprecated PHP imap_* functions.
|
||||
function save_mail($message)
|
||||
{
|
||||
$mailbox = new \DirectoryTree\ImapEngine\Mailbox([
|
||||
'host' => 'imap.gmail.com',
|
||||
'port' => 993,
|
||||
'encryption' => 'ssl',
|
||||
'username' => 'user@example.com',
|
||||
'password' => 'password',
|
||||
]);
|
||||
|
||||
// Find the "sent" messages folder – yours may have a different name.
|
||||
$folder = $mailbox->folders()->find('Sent Mail');
|
||||
|
||||
$folder->messages()->append($message);
|
||||
}
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows how to send via Google's Gmail servers using XOAUTH2 authentication
|
||||
* using the league/oauth2-client to provide the OAuth2 token.
|
||||
* To use a different OAuth2 library create a wrapper class that implements OAuthTokenProvider and
|
||||
* pass that wrapper class to PHPMailer::setOAuth().
|
||||
*/
|
||||
|
||||
//Import PHPMailer classes into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
use PHPMailer\PHPMailer\OAuth;
|
||||
//Alias the League Google OAuth2 provider class
|
||||
use League\OAuth2\Client\Provider\Google;
|
||||
|
||||
//SMTP needs accurate times, and the PHP time zone MUST be set
|
||||
//This should be done in your php.ini, but this is how to do it if you don't have access to that
|
||||
date_default_timezone_set('Etc/UTC');
|
||||
|
||||
//Load dependencies from composer
|
||||
//If this causes an error, run 'composer install'
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
|
||||
//Tell PHPMailer to use SMTP
|
||||
$mail->isSMTP();
|
||||
|
||||
//Enable SMTP debugging
|
||||
//SMTP::DEBUG_OFF = off (for production use)
|
||||
//SMTP::DEBUG_CLIENT = client messages
|
||||
//SMTP::DEBUG_SERVER = client and server messages
|
||||
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
|
||||
|
||||
//Set the hostname of the mail server
|
||||
$mail->Host = 'smtp.gmail.com';
|
||||
|
||||
//Set the SMTP port number:
|
||||
// - 465 for SMTP with implicit TLS, a.k.a. RFC8314 SMTPS or
|
||||
// - 587 for SMTP+STARTTLS
|
||||
$mail->Port = 465;
|
||||
|
||||
//Set the encryption mechanism to use:
|
||||
// - SMTPS (implicit TLS on port 465) or
|
||||
// - STARTTLS (explicit TLS on port 587)
|
||||
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
|
||||
|
||||
//Whether to use SMTP authentication
|
||||
$mail->SMTPAuth = true;
|
||||
|
||||
//Set AuthType to use XOAUTH2
|
||||
$mail->AuthType = 'XOAUTH2';
|
||||
|
||||
//Start Option 1: Use league/oauth2-client as OAuth2 token provider
|
||||
//Fill in authentication details here
|
||||
//Either the gmail account owner, or the user that gave consent
|
||||
$email = 'someone@gmail.com';
|
||||
$clientId = 'RANDOMCHARS-----duv1n2.apps.googleusercontent.com';
|
||||
$clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';
|
||||
|
||||
//Obtained by configuring and running get_oauth_token.php
|
||||
//after setting up an app in Google Developer Console.
|
||||
$refreshToken = 'RANDOMCHARS-----DWxgOvPT003r-yFUV49TQYag7_Aod7y0';
|
||||
|
||||
//Create a new OAuth2 provider instance
|
||||
$provider = new Google(
|
||||
[
|
||||
'clientId' => $clientId,
|
||||
'clientSecret' => $clientSecret,
|
||||
]
|
||||
);
|
||||
|
||||
//Pass the OAuth provider instance to PHPMailer
|
||||
$mail->setOAuth(
|
||||
new OAuth(
|
||||
[
|
||||
'provider' => $provider,
|
||||
'clientId' => $clientId,
|
||||
'clientSecret' => $clientSecret,
|
||||
'refreshToken' => $refreshToken,
|
||||
'userName' => $email,
|
||||
]
|
||||
)
|
||||
);
|
||||
//End Option 1
|
||||
|
||||
//Option 2: Another OAuth library as OAuth2 token provider
|
||||
//Set up the other oauth library as per its documentation
|
||||
//Then create the wrapper class that implements OAuthTokenProvider
|
||||
$oauthTokenProvider = new MyOAuthTokenProvider(/* Email, ClientId, ClientSecret, etc. */);
|
||||
|
||||
//Pass the implementation of OAuthTokenProvider to PHPMailer
|
||||
$mail->setOAuth($oauthTokenProvider);
|
||||
//End Option 2
|
||||
|
||||
//Set who the message is to be sent from
|
||||
//For gmail, this generally needs to be the same as the user you logged in as
|
||||
$mail->setFrom($email, 'First Last');
|
||||
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('someone@gmail.com', 'John Doe');
|
||||
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer GMail XOAUTH2 SMTP test';
|
||||
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//convert HTML into a basic plain-text alternative body
|
||||
$mail->CharSet = PHPMailer::CHARSET_UTF8;
|
||||
$mail->msgHTML(file_get_contents('contentsutf8.html'), __DIR__);
|
||||
|
||||
//Replace the plain text body with one created manually
|
||||
$mail->AltBody = 'This is a plain-text message body';
|
||||
|
||||
//send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
echo 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo 'Message sent!';
|
||||
}
|
||||
|
After Width: | Height: | Size: 26 KiB |
|
|
@ -0,0 +1,209 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 1280 640" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g id="Background" transform="matrix(8.70744,5.33177e-16,-5.33177e-16,-4.35372,-4208.74,2147.69)">
|
||||
<path d="M630.351,346.3L483.35,346.3L483.35,493.301L630.351,493.301L630.351,346.3L630.351,346.3Z" style="fill:rgb(51,51,51);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g id="PHPMailer" transform="matrix(0.986688,0,0,0.986688,12.9314,1.29196)">
|
||||
<g transform="matrix(1.14074,0,0,1,-76.5738,0)">
|
||||
<g id="path68" transform="matrix(2.14981,0,0,-2.46335,-776.134,1230.68)">
|
||||
<path d="M614.574,416.832L584.18,445.184L584.18,381.999L644.963,381.999L644.963,445.181L614.574,416.832Z" style="fill:rgb(248,203,102);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g id="path74" transform="matrix(2.14981,0,0,-2.56665,-776.135,1278.22)">
|
||||
<path d="M644.989,460.2L584.155,460.2L614.574,432.967L644.989,460.2Z" style="fill:rgb(248,203,102);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g transform="matrix(260.4,0,0,280,52.6877,289.686)">
|
||||
<path d="M0.488,-0.47C0.488,-0.441 0.484,-0.412 0.476,-0.385C0.468,-0.357 0.455,-0.333 0.439,-0.312C0.422,-0.29 0.4,-0.274 0.374,-0.261C0.348,-0.248 0.318,-0.242 0.282,-0.242L0.173,-0.242L0.173,0L0.055,0L0.055,-0.688L0.277,-0.688C0.314,-0.688 0.345,-0.683 0.371,-0.672C0.398,-0.662 0.419,-0.647 0.437,-0.627C0.454,-0.608 0.467,-0.585 0.476,-0.559C0.484,-0.532 0.488,-0.502 0.488,-0.47ZM0.369,-0.468C0.369,-0.503 0.36,-0.53 0.343,-0.549C0.326,-0.567 0.299,-0.576 0.264,-0.576L0.173,-0.576L0.173,-0.353L0.268,-0.353C0.285,-0.353 0.3,-0.356 0.313,-0.361C0.326,-0.367 0.336,-0.375 0.345,-0.385C0.353,-0.395 0.359,-0.407 0.363,-0.421C0.367,-0.435 0.369,-0.451 0.369,-0.468Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(260.4,0,0,280,184.157,289.686)">
|
||||
<path d="M0.38,0L0.38,-0.273L0.173,-0.273L0.173,0L0.055,0L0.055,-0.688L0.173,-0.688L0.173,-0.382L0.38,-0.382L0.38,-0.688L0.498,-0.688L0.498,0L0.38,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(260.4,0,0,280,327.324,289.686)">
|
||||
<path d="M0.488,-0.47C0.488,-0.441 0.484,-0.412 0.476,-0.385C0.468,-0.357 0.455,-0.333 0.439,-0.312C0.422,-0.29 0.4,-0.274 0.374,-0.261C0.348,-0.248 0.318,-0.242 0.282,-0.242L0.173,-0.242L0.173,0L0.055,0L0.055,-0.688L0.277,-0.688C0.314,-0.688 0.345,-0.683 0.371,-0.672C0.398,-0.662 0.419,-0.647 0.437,-0.627C0.454,-0.608 0.467,-0.585 0.476,-0.559C0.484,-0.532 0.488,-0.502 0.488,-0.47ZM0.369,-0.468C0.369,-0.503 0.36,-0.53 0.343,-0.549C0.326,-0.567 0.299,-0.576 0.264,-0.576L0.173,-0.576L0.173,-0.353L0.268,-0.353C0.285,-0.353 0.3,-0.356 0.313,-0.361C0.326,-0.367 0.336,-0.375 0.345,-0.385C0.353,-0.395 0.359,-0.407 0.363,-0.421C0.367,-0.435 0.369,-0.451 0.369,-0.468Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<g transform="matrix(260.4,0,0,280,640.738,289.686)">
|
||||
<path d="M0.453,0L0.352,-0.161L0.128,-0.161L0.128,0L0.021,0L0.021,-0.688L0.128,-0.688L0.57,0L0.453,0ZM0.282,-0.27L0.128,-0.515L0.128,-0.27L0.282,-0.27Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(260.4,0,0,280,787.905,289.686)">
|
||||
<rect x="0.055" y="-0.688" width="0.119" height="0.688" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(260.4,0,0,280,816.346,289.686)">
|
||||
<path d="M0.124,0L0.124,-0.688L0.242,-0.688L0.242,-0.111L0.499,-0.111L0.499,0L0.124,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(260.4,0,0,280,936.864,289.686)">
|
||||
<path d="M0.089,0L0.089,-0.688L0.483,-0.688L0.483,-0.577L0.207,-0.577L0.207,-0.382L0.459,-0.382L0.459,-0.271L0.207,-0.271L0.207,-0.111L0.499,-0.111L0.499,0L0.089,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(233.533,0,0,280,1069.8,289.686)">
|
||||
<path d="M0.442,0L0.312,-0.261L0.173,-0.261L0.173,0L0.055,0L0.055,-0.688L0.336,-0.688C0.372,-0.688 0.402,-0.683 0.429,-0.674C0.455,-0.664 0.477,-0.65 0.495,-0.633C0.512,-0.615 0.525,-0.593 0.534,-0.568C0.543,-0.543 0.547,-0.514 0.547,-0.483C0.547,-0.457 0.544,-0.434 0.538,-0.412C0.531,-0.391 0.523,-0.372 0.512,-0.355C0.501,-0.339 0.487,-0.325 0.472,-0.314C0.457,-0.302 0.44,-0.294 0.422,-0.289L0.575,0L0.442,0ZM0.428,-0.477C0.428,-0.511 0.419,-0.535 0.401,-0.552C0.383,-0.568 0.357,-0.576 0.324,-0.576L0.173,-0.576L0.173,-0.373L0.327,-0.373C0.345,-0.373 0.36,-0.376 0.373,-0.381C0.385,-0.386 0.396,-0.393 0.404,-0.402C0.412,-0.411 0.418,-0.422 0.422,-0.435C0.426,-0.448 0.428,-0.462 0.428,-0.477Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1,73.8296,353)">
|
||||
<g transform="matrix(41,0,0,41,0,29.709)">
|
||||
<path d="M0.352,-0.612L0.352,0L0.259,0L0.259,-0.612L0.022,-0.612L0.022,-0.688L0.588,-0.688L0.588,-0.612L0.352,-0.612Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,25.0444,29.709)">
|
||||
<path d="M0.155,-0.438C0.165,-0.456 0.175,-0.471 0.187,-0.484C0.198,-0.496 0.21,-0.507 0.224,-0.515C0.238,-0.523 0.253,-0.529 0.269,-0.532C0.285,-0.536 0.304,-0.538 0.324,-0.538C0.358,-0.538 0.385,-0.534 0.407,-0.524C0.429,-0.515 0.446,-0.503 0.458,-0.486C0.471,-0.47 0.479,-0.45 0.484,-0.427C0.489,-0.404 0.491,-0.379 0.491,-0.352L0.491,0L0.403,0L0.403,-0.335C0.403,-0.357 0.401,-0.377 0.399,-0.394C0.396,-0.411 0.391,-0.425 0.383,-0.436C0.375,-0.448 0.364,-0.456 0.35,-0.462C0.335,-0.467 0.317,-0.47 0.294,-0.47C0.273,-0.47 0.254,-0.466 0.238,-0.459C0.221,-0.451 0.206,-0.441 0.195,-0.427C0.183,-0.414 0.174,-0.397 0.167,-0.377C0.16,-0.358 0.157,-0.336 0.157,-0.312L0.157,0L0.069,0L0.069,-0.725L0.157,-0.725L0.157,-0.536C0.157,-0.525 0.157,-0.515 0.157,-0.504C0.156,-0.493 0.156,-0.483 0.156,-0.474C0.155,-0.465 0.155,-0.457 0.154,-0.451C0.154,-0.445 0.154,-0.44 0.153,-0.438L0.155,-0.438Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,47.8467,29.709)">
|
||||
<path d="M0.135,-0.246C0.135,-0.218 0.138,-0.192 0.143,-0.169C0.149,-0.146 0.158,-0.126 0.17,-0.109C0.182,-0.092 0.197,-0.079 0.215,-0.07C0.234,-0.061 0.256,-0.056 0.282,-0.056C0.32,-0.056 0.351,-0.064 0.374,-0.079C0.397,-0.094 0.412,-0.114 0.42,-0.137L0.498,-0.115C0.492,-0.101 0.484,-0.086 0.474,-0.071C0.464,-0.056 0.451,-0.043 0.435,-0.031C0.418,-0.019 0.397,-0.009 0.372,-0.002C0.347,0.006 0.317,0.01 0.282,0.01C0.204,0.01 0.145,-0.014 0.104,-0.06C0.063,-0.107 0.042,-0.176 0.042,-0.268C0.042,-0.317 0.049,-0.359 0.061,-0.393C0.073,-0.428 0.09,-0.456 0.112,-0.477C0.133,-0.499 0.158,-0.514 0.187,-0.524C0.216,-0.533 0.246,-0.538 0.279,-0.538C0.323,-0.538 0.36,-0.531 0.39,-0.517C0.42,-0.502 0.444,-0.483 0.462,-0.457C0.48,-0.432 0.493,-0.402 0.5,-0.368C0.508,-0.334 0.512,-0.297 0.512,-0.257L0.512,-0.246L0.135,-0.246ZM0.421,-0.313C0.416,-0.369 0.402,-0.409 0.378,-0.435C0.355,-0.46 0.321,-0.473 0.277,-0.473C0.263,-0.473 0.247,-0.471 0.231,-0.466C0.215,-0.461 0.2,-0.453 0.187,-0.441C0.173,-0.429 0.161,-0.413 0.152,-0.392C0.142,-0.371 0.137,-0.345 0.136,-0.313L0.421,-0.313Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,82.04,29.709)">
|
||||
<path d="M0.614,-0.481C0.614,-0.451 0.609,-0.423 0.599,-0.397C0.589,-0.371 0.575,-0.349 0.555,-0.33C0.535,-0.311 0.511,-0.296 0.481,-0.285C0.451,-0.274 0.417,-0.268 0.377,-0.268L0.175,-0.268L0.175,0L0.082,0L0.082,-0.688L0.372,-0.688C0.412,-0.688 0.448,-0.683 0.478,-0.673C0.508,-0.663 0.534,-0.649 0.554,-0.631C0.574,-0.613 0.589,-0.591 0.599,-0.566C0.609,-0.54 0.614,-0.512 0.614,-0.481ZM0.521,-0.48C0.521,-0.524 0.507,-0.557 0.48,-0.579C0.454,-0.602 0.414,-0.613 0.36,-0.613L0.175,-0.613L0.175,-0.342L0.364,-0.342C0.418,-0.342 0.457,-0.354 0.483,-0.377C0.508,-0.401 0.521,-0.435 0.521,-0.48Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,109.387,29.709)">
|
||||
<path d="M0.547,0L0.547,-0.319L0.175,-0.319L0.175,0L0.082,0L0.082,-0.688L0.175,-0.688L0.175,-0.397L0.547,-0.397L0.547,-0.688L0.641,-0.688L0.641,0L0.547,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,138.996,29.709)">
|
||||
<path d="M0.614,-0.481C0.614,-0.451 0.609,-0.423 0.599,-0.397C0.589,-0.371 0.575,-0.349 0.555,-0.33C0.535,-0.311 0.511,-0.296 0.481,-0.285C0.451,-0.274 0.417,-0.268 0.377,-0.268L0.175,-0.268L0.175,0L0.082,0L0.082,-0.688L0.372,-0.688C0.412,-0.688 0.448,-0.683 0.478,-0.673C0.508,-0.663 0.534,-0.649 0.554,-0.631C0.574,-0.613 0.589,-0.591 0.599,-0.566C0.609,-0.54 0.614,-0.512 0.614,-0.481ZM0.521,-0.48C0.521,-0.524 0.507,-0.557 0.48,-0.579C0.454,-0.602 0.414,-0.613 0.36,-0.613L0.175,-0.613L0.175,-0.342L0.364,-0.342C0.418,-0.342 0.457,-0.354 0.483,-0.377C0.508,-0.401 0.521,-0.435 0.521,-0.48Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,176.993,29.709)">
|
||||
<path d="M0.135,-0.246C0.135,-0.218 0.138,-0.192 0.143,-0.169C0.149,-0.146 0.158,-0.126 0.17,-0.109C0.182,-0.092 0.197,-0.079 0.215,-0.07C0.234,-0.061 0.256,-0.056 0.282,-0.056C0.32,-0.056 0.351,-0.064 0.374,-0.079C0.397,-0.094 0.412,-0.114 0.42,-0.137L0.498,-0.115C0.492,-0.101 0.484,-0.086 0.474,-0.071C0.464,-0.056 0.451,-0.043 0.435,-0.031C0.418,-0.019 0.397,-0.009 0.372,-0.002C0.347,0.006 0.317,0.01 0.282,0.01C0.204,0.01 0.145,-0.014 0.104,-0.06C0.063,-0.107 0.042,-0.176 0.042,-0.268C0.042,-0.317 0.049,-0.359 0.061,-0.393C0.073,-0.428 0.09,-0.456 0.112,-0.477C0.133,-0.499 0.158,-0.514 0.187,-0.524C0.216,-0.533 0.246,-0.538 0.279,-0.538C0.323,-0.538 0.36,-0.531 0.39,-0.517C0.42,-0.502 0.444,-0.483 0.462,-0.457C0.48,-0.432 0.493,-0.402 0.5,-0.368C0.508,-0.334 0.512,-0.297 0.512,-0.257L0.512,-0.246L0.135,-0.246ZM0.421,-0.313C0.416,-0.369 0.402,-0.409 0.378,-0.435C0.355,-0.46 0.321,-0.473 0.277,-0.473C0.263,-0.473 0.247,-0.471 0.231,-0.466C0.215,-0.461 0.2,-0.453 0.187,-0.441C0.173,-0.429 0.161,-0.413 0.152,-0.392C0.142,-0.371 0.137,-0.345 0.136,-0.313L0.421,-0.313Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,199.795,29.709)">
|
||||
<path d="M0.375,0L0.375,-0.335C0.375,-0.361 0.373,-0.382 0.37,-0.399C0.367,-0.417 0.361,-0.431 0.354,-0.441C0.346,-0.452 0.336,-0.459 0.324,-0.464C0.311,-0.468 0.296,-0.47 0.278,-0.47C0.26,-0.47 0.243,-0.467 0.228,-0.459C0.213,-0.452 0.2,-0.441 0.19,-0.427C0.179,-0.414 0.171,-0.397 0.165,-0.376C0.16,-0.356 0.157,-0.333 0.157,-0.306L0.157,0L0.069,0L0.069,-0.416C0.069,-0.427 0.069,-0.438 0.069,-0.45C0.069,-0.463 0.069,-0.474 0.068,-0.485C0.068,-0.496 0.068,-0.505 0.067,-0.513C0.067,-0.521 0.067,-0.526 0.066,-0.528L0.149,-0.528C0.15,-0.527 0.15,-0.522 0.15,-0.515C0.151,-0.508 0.151,-0.5 0.152,-0.49C0.152,-0.481 0.153,-0.472 0.153,-0.462C0.153,-0.453 0.153,-0.444 0.153,-0.438L0.155,-0.438C0.163,-0.453 0.171,-0.467 0.18,-0.479C0.189,-0.492 0.2,-0.502 0.212,-0.511C0.224,-0.52 0.238,-0.526 0.254,-0.531C0.27,-0.536 0.288,-0.538 0.309,-0.538C0.349,-0.538 0.381,-0.53 0.404,-0.514C0.427,-0.498 0.444,-0.473 0.453,-0.438L0.454,-0.438C0.462,-0.453 0.471,-0.467 0.48,-0.479C0.49,-0.492 0.502,-0.502 0.515,-0.511C0.528,-0.52 0.542,-0.526 0.559,-0.531C0.575,-0.536 0.593,-0.538 0.614,-0.538C0.641,-0.538 0.664,-0.535 0.683,-0.527C0.703,-0.52 0.719,-0.509 0.731,-0.494C0.743,-0.479 0.752,-0.46 0.758,-0.436C0.764,-0.413 0.767,-0.385 0.767,-0.352L0.767,0L0.68,0L0.68,-0.335C0.68,-0.361 0.679,-0.382 0.675,-0.399C0.672,-0.417 0.667,-0.431 0.659,-0.441C0.651,-0.452 0.641,-0.459 0.629,-0.464C0.617,-0.468 0.601,-0.47 0.583,-0.47C0.565,-0.47 0.548,-0.467 0.533,-0.46C0.518,-0.453 0.505,-0.442 0.495,-0.429C0.484,-0.415 0.476,-0.398 0.47,-0.377C0.465,-0.357 0.462,-0.333 0.462,-0.306L0.462,0L0.375,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,233.948,29.709)">
|
||||
<path d="M0.202,0.01C0.149,0.01 0.109,-0.004 0.083,-0.032C0.056,-0.06 0.042,-0.099 0.042,-0.147C0.042,-0.182 0.049,-0.211 0.062,-0.233C0.075,-0.255 0.093,-0.273 0.114,-0.286C0.135,-0.298 0.16,-0.307 0.187,-0.312C0.214,-0.317 0.242,-0.32 0.271,-0.32L0.389,-0.322L0.389,-0.351C0.389,-0.373 0.387,-0.391 0.382,-0.407C0.378,-0.422 0.371,-0.434 0.361,-0.444C0.352,-0.453 0.34,-0.46 0.326,-0.465C0.312,-0.469 0.295,-0.471 0.276,-0.471C0.259,-0.471 0.244,-0.47 0.23,-0.468C0.216,-0.465 0.204,-0.461 0.194,-0.454C0.184,-0.448 0.176,-0.439 0.17,-0.428C0.164,-0.418 0.16,-0.404 0.158,-0.387L0.066,-0.396C0.069,-0.416 0.075,-0.435 0.084,-0.453C0.094,-0.47 0.107,-0.485 0.123,-0.498C0.14,-0.511 0.161,-0.521 0.186,-0.528C0.212,-0.535 0.242,-0.538 0.278,-0.538C0.344,-0.538 0.394,-0.523 0.428,-0.492C0.461,-0.462 0.478,-0.418 0.478,-0.36L0.478,-0.133C0.478,-0.107 0.481,-0.087 0.488,-0.074C0.495,-0.061 0.508,-0.054 0.527,-0.054C0.532,-0.054 0.537,-0.055 0.542,-0.055C0.547,-0.056 0.552,-0.057 0.556,-0.058L0.556,-0.003C0.545,0 0.534,0.002 0.523,0.003C0.512,0.004 0.501,0.005 0.488,0.005C0.472,0.005 0.457,0.003 0.446,-0.002C0.434,-0.006 0.424,-0.013 0.417,-0.022C0.409,-0.031 0.403,-0.042 0.399,-0.055C0.396,-0.068 0.393,-0.083 0.392,-0.101L0.389,-0.101C0.38,-0.084 0.369,-0.069 0.358,-0.055C0.347,-0.042 0.334,-0.03 0.319,-0.02C0.304,-0.011 0.287,-0.003 0.268,0.002C0.249,0.007 0.227,0.01 0.202,0.01ZM0.222,-0.056C0.25,-0.056 0.275,-0.061 0.296,-0.072C0.317,-0.082 0.334,-0.095 0.348,-0.111C0.362,-0.127 0.372,-0.144 0.379,-0.163C0.386,-0.182 0.389,-0.2 0.389,-0.217L0.389,-0.261L0.293,-0.259C0.271,-0.258 0.251,-0.257 0.232,-0.254C0.212,-0.251 0.195,-0.246 0.181,-0.238C0.166,-0.23 0.154,-0.218 0.146,-0.204C0.137,-0.189 0.133,-0.17 0.133,-0.146C0.133,-0.117 0.141,-0.095 0.156,-0.08C0.171,-0.064 0.194,-0.056 0.222,-0.056Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,256.75,29.709)">
|
||||
<path d="M0.067,-0.641L0.067,-0.725L0.155,-0.725L0.155,-0.641L0.067,-0.641ZM0.067,0L0.067,-0.528L0.155,-0.528L0.155,0L0.067,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,265.859,29.709)">
|
||||
<rect x="0.067" y="-0.725" width="0.088" height="0.725" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,286.359,29.709)">
|
||||
<path d="M0.134,-0.267C0.134,-0.236 0.136,-0.208 0.141,-0.183C0.145,-0.158 0.153,-0.136 0.163,-0.117C0.174,-0.099 0.187,-0.085 0.204,-0.075C0.221,-0.065 0.243,-0.06 0.268,-0.06C0.299,-0.06 0.325,-0.068 0.346,-0.085C0.367,-0.102 0.38,-0.128 0.385,-0.163L0.474,-0.157C0.471,-0.135 0.464,-0.114 0.455,-0.094C0.445,-0.074 0.432,-0.056 0.415,-0.041C0.398,-0.026 0.378,-0.013 0.354,-0.004C0.329,0.005 0.302,0.01 0.27,0.01C0.229,0.01 0.194,0.003 0.165,-0.011C0.136,-0.025 0.112,-0.045 0.094,-0.069C0.076,-0.094 0.063,-0.123 0.055,-0.156C0.047,-0.189 0.042,-0.226 0.042,-0.265C0.042,-0.3 0.045,-0.331 0.051,-0.359C0.057,-0.386 0.065,-0.41 0.076,-0.43C0.087,-0.45 0.099,-0.467 0.113,-0.481C0.128,-0.495 0.143,-0.506 0.16,-0.514C0.177,-0.523 0.194,-0.529 0.213,-0.532C0.231,-0.536 0.25,-0.538 0.269,-0.538C0.299,-0.538 0.325,-0.534 0.348,-0.526C0.371,-0.518 0.391,-0.507 0.408,-0.492C0.425,-0.478 0.438,-0.462 0.449,-0.442C0.459,-0.423 0.466,-0.403 0.471,-0.38L0.38,-0.374C0.376,-0.403 0.364,-0.426 0.346,-0.443C0.327,-0.461 0.301,-0.469 0.267,-0.469C0.242,-0.469 0.221,-0.465 0.204,-0.457C0.187,-0.448 0.174,-0.436 0.163,-0.419C0.153,-0.402 0.145,-0.381 0.141,-0.356C0.136,-0.331 0.134,-0.301 0.134,-0.267Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,306.859,29.709)">
|
||||
<rect x="0.067" y="-0.725" width="0.088" height="0.725" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,315.968,29.709)">
|
||||
<path d="M0.202,0.01C0.149,0.01 0.109,-0.004 0.083,-0.032C0.056,-0.06 0.042,-0.099 0.042,-0.147C0.042,-0.182 0.049,-0.211 0.062,-0.233C0.075,-0.255 0.093,-0.273 0.114,-0.286C0.135,-0.298 0.16,-0.307 0.187,-0.312C0.214,-0.317 0.242,-0.32 0.271,-0.32L0.389,-0.322L0.389,-0.351C0.389,-0.373 0.387,-0.391 0.382,-0.407C0.378,-0.422 0.371,-0.434 0.361,-0.444C0.352,-0.453 0.34,-0.46 0.326,-0.465C0.312,-0.469 0.295,-0.471 0.276,-0.471C0.259,-0.471 0.244,-0.47 0.23,-0.468C0.216,-0.465 0.204,-0.461 0.194,-0.454C0.184,-0.448 0.176,-0.439 0.17,-0.428C0.164,-0.418 0.16,-0.404 0.158,-0.387L0.066,-0.396C0.069,-0.416 0.075,-0.435 0.084,-0.453C0.094,-0.47 0.107,-0.485 0.123,-0.498C0.14,-0.511 0.161,-0.521 0.186,-0.528C0.212,-0.535 0.242,-0.538 0.278,-0.538C0.344,-0.538 0.394,-0.523 0.428,-0.492C0.461,-0.462 0.478,-0.418 0.478,-0.36L0.478,-0.133C0.478,-0.107 0.481,-0.087 0.488,-0.074C0.495,-0.061 0.508,-0.054 0.527,-0.054C0.532,-0.054 0.537,-0.055 0.542,-0.055C0.547,-0.056 0.552,-0.057 0.556,-0.058L0.556,-0.003C0.545,0 0.534,0.002 0.523,0.003C0.512,0.004 0.501,0.005 0.488,0.005C0.472,0.005 0.457,0.003 0.446,-0.002C0.434,-0.006 0.424,-0.013 0.417,-0.022C0.409,-0.031 0.403,-0.042 0.399,-0.055C0.396,-0.068 0.393,-0.083 0.392,-0.101L0.389,-0.101C0.38,-0.084 0.369,-0.069 0.358,-0.055C0.347,-0.042 0.334,-0.03 0.319,-0.02C0.304,-0.011 0.287,-0.003 0.268,0.002C0.249,0.007 0.227,0.01 0.202,0.01ZM0.222,-0.056C0.25,-0.056 0.275,-0.061 0.296,-0.072C0.317,-0.082 0.334,-0.095 0.348,-0.111C0.362,-0.127 0.372,-0.144 0.379,-0.163C0.386,-0.182 0.389,-0.2 0.389,-0.217L0.389,-0.261L0.293,-0.259C0.271,-0.258 0.251,-0.257 0.232,-0.254C0.212,-0.251 0.195,-0.246 0.181,-0.238C0.166,-0.23 0.154,-0.218 0.146,-0.204C0.137,-0.189 0.133,-0.17 0.133,-0.146C0.133,-0.117 0.141,-0.095 0.156,-0.08C0.171,-0.064 0.194,-0.056 0.222,-0.056Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,338.771,29.709)">
|
||||
<path d="M0.464,-0.146C0.464,-0.121 0.459,-0.099 0.449,-0.08C0.44,-0.06 0.426,-0.044 0.408,-0.031C0.389,-0.018 0.367,-0.008 0.341,-0.001C0.314,0.006 0.284,0.01 0.25,0.01C0.219,0.01 0.191,0.007 0.167,0.003C0.142,-0.002 0.121,-0.01 0.102,-0.02C0.083,-0.03 0.068,-0.044 0.055,-0.061C0.043,-0.078 0.034,-0.099 0.028,-0.124L0.105,-0.139C0.113,-0.111 0.128,-0.09 0.152,-0.077C0.175,-0.064 0.208,-0.057 0.25,-0.057C0.268,-0.057 0.286,-0.058 0.302,-0.061C0.317,-0.064 0.331,-0.068 0.342,-0.074C0.354,-0.081 0.363,-0.089 0.369,-0.1C0.375,-0.11 0.378,-0.124 0.378,-0.139C0.378,-0.155 0.375,-0.168 0.367,-0.178C0.36,-0.189 0.349,-0.197 0.336,-0.204C0.323,-0.211 0.306,-0.217 0.287,-0.222C0.268,-0.227 0.247,-0.233 0.225,-0.239C0.203,-0.244 0.182,-0.25 0.162,-0.257C0.141,-0.264 0.122,-0.273 0.105,-0.284C0.088,-0.296 0.075,-0.31 0.064,-0.326C0.054,-0.343 0.049,-0.364 0.049,-0.389C0.049,-0.437 0.066,-0.474 0.1,-0.499C0.135,-0.524 0.185,-0.537 0.25,-0.537C0.309,-0.537 0.355,-0.526 0.389,-0.506C0.424,-0.485 0.445,-0.452 0.455,-0.407L0.375,-0.397C0.373,-0.411 0.367,-0.423 0.359,-0.432C0.352,-0.441 0.342,-0.449 0.331,-0.454C0.32,-0.46 0.308,-0.464 0.294,-0.467C0.28,-0.469 0.265,-0.47 0.25,-0.47C0.211,-0.47 0.181,-0.464 0.163,-0.452C0.144,-0.44 0.134,-0.422 0.134,-0.397C0.134,-0.383 0.138,-0.371 0.145,-0.362C0.152,-0.353 0.162,-0.345 0.174,-0.339C0.187,-0.332 0.202,-0.327 0.219,-0.322C0.237,-0.317 0.256,-0.312 0.277,-0.307C0.291,-0.304 0.306,-0.3 0.32,-0.296C0.335,-0.292 0.349,-0.287 0.363,-0.281C0.377,-0.275 0.39,-0.269 0.402,-0.261C0.414,-0.253 0.425,-0.244 0.434,-0.233C0.443,-0.223 0.45,-0.21 0.456,-0.196C0.461,-0.181 0.464,-0.165 0.464,-0.146Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,359.271,29.709)">
|
||||
<path d="M0.464,-0.146C0.464,-0.121 0.459,-0.099 0.449,-0.08C0.44,-0.06 0.426,-0.044 0.408,-0.031C0.389,-0.018 0.367,-0.008 0.341,-0.001C0.314,0.006 0.284,0.01 0.25,0.01C0.219,0.01 0.191,0.007 0.167,0.003C0.142,-0.002 0.121,-0.01 0.102,-0.02C0.083,-0.03 0.068,-0.044 0.055,-0.061C0.043,-0.078 0.034,-0.099 0.028,-0.124L0.105,-0.139C0.113,-0.111 0.128,-0.09 0.152,-0.077C0.175,-0.064 0.208,-0.057 0.25,-0.057C0.268,-0.057 0.286,-0.058 0.302,-0.061C0.317,-0.064 0.331,-0.068 0.342,-0.074C0.354,-0.081 0.363,-0.089 0.369,-0.1C0.375,-0.11 0.378,-0.124 0.378,-0.139C0.378,-0.155 0.375,-0.168 0.367,-0.178C0.36,-0.189 0.349,-0.197 0.336,-0.204C0.323,-0.211 0.306,-0.217 0.287,-0.222C0.268,-0.227 0.247,-0.233 0.225,-0.239C0.203,-0.244 0.182,-0.25 0.162,-0.257C0.141,-0.264 0.122,-0.273 0.105,-0.284C0.088,-0.296 0.075,-0.31 0.064,-0.326C0.054,-0.343 0.049,-0.364 0.049,-0.389C0.049,-0.437 0.066,-0.474 0.1,-0.499C0.135,-0.524 0.185,-0.537 0.25,-0.537C0.309,-0.537 0.355,-0.526 0.389,-0.506C0.424,-0.485 0.445,-0.452 0.455,-0.407L0.375,-0.397C0.373,-0.411 0.367,-0.423 0.359,-0.432C0.352,-0.441 0.342,-0.449 0.331,-0.454C0.32,-0.46 0.308,-0.464 0.294,-0.467C0.28,-0.469 0.265,-0.47 0.25,-0.47C0.211,-0.47 0.181,-0.464 0.163,-0.452C0.144,-0.44 0.134,-0.422 0.134,-0.397C0.134,-0.383 0.138,-0.371 0.145,-0.362C0.152,-0.353 0.162,-0.345 0.174,-0.339C0.187,-0.332 0.202,-0.327 0.219,-0.322C0.237,-0.317 0.256,-0.312 0.277,-0.307C0.291,-0.304 0.306,-0.3 0.32,-0.296C0.335,-0.292 0.349,-0.287 0.363,-0.281C0.377,-0.275 0.39,-0.269 0.402,-0.261C0.414,-0.253 0.425,-0.244 0.434,-0.233C0.443,-0.223 0.45,-0.21 0.456,-0.196C0.461,-0.181 0.464,-0.165 0.464,-0.146Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,391.162,29.709)">
|
||||
<path d="M0.155,-0.438C0.165,-0.456 0.175,-0.471 0.187,-0.484C0.198,-0.496 0.21,-0.507 0.224,-0.515C0.238,-0.523 0.253,-0.529 0.269,-0.532C0.285,-0.536 0.304,-0.538 0.324,-0.538C0.358,-0.538 0.385,-0.534 0.407,-0.524C0.429,-0.515 0.446,-0.503 0.458,-0.486C0.471,-0.47 0.479,-0.45 0.484,-0.427C0.489,-0.404 0.491,-0.379 0.491,-0.352L0.491,0L0.403,0L0.403,-0.335C0.403,-0.357 0.401,-0.377 0.399,-0.394C0.396,-0.411 0.391,-0.425 0.383,-0.436C0.375,-0.448 0.364,-0.456 0.35,-0.462C0.335,-0.467 0.317,-0.47 0.294,-0.47C0.273,-0.47 0.254,-0.466 0.238,-0.459C0.221,-0.451 0.206,-0.441 0.195,-0.427C0.183,-0.414 0.174,-0.397 0.167,-0.377C0.16,-0.358 0.157,-0.336 0.157,-0.312L0.157,0L0.069,0L0.069,-0.725L0.157,-0.725L0.157,-0.536C0.157,-0.525 0.157,-0.515 0.157,-0.504C0.156,-0.493 0.156,-0.483 0.156,-0.474C0.155,-0.465 0.155,-0.457 0.154,-0.451C0.154,-0.445 0.154,-0.44 0.153,-0.438L0.155,-0.438Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,413.964,29.709)">
|
||||
<path d="M0.271,-0.004C0.257,0 0.244,0.003 0.23,0.005C0.216,0.007 0.2,0.008 0.182,0.008C0.111,0.008 0.076,-0.032 0.076,-0.112L0.076,-0.464L0.015,-0.464L0.015,-0.528L0.08,-0.528L0.105,-0.646L0.164,-0.646L0.164,-0.528L0.262,-0.528L0.262,-0.464L0.164,-0.464L0.164,-0.131C0.164,-0.105 0.168,-0.088 0.177,-0.077C0.185,-0.067 0.199,-0.062 0.22,-0.062C0.228,-0.062 0.236,-0.063 0.244,-0.064C0.252,-0.065 0.261,-0.067 0.271,-0.069L0.271,-0.004Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,425.355,29.709)">
|
||||
<path d="M0.271,-0.004C0.257,0 0.244,0.003 0.23,0.005C0.216,0.007 0.2,0.008 0.182,0.008C0.111,0.008 0.076,-0.032 0.076,-0.112L0.076,-0.464L0.015,-0.464L0.015,-0.528L0.08,-0.528L0.105,-0.646L0.164,-0.646L0.164,-0.528L0.262,-0.528L0.262,-0.464L0.164,-0.464L0.164,-0.131C0.164,-0.105 0.168,-0.088 0.177,-0.077C0.185,-0.067 0.199,-0.062 0.22,-0.062C0.228,-0.062 0.236,-0.063 0.244,-0.064C0.252,-0.065 0.261,-0.067 0.271,-0.069L0.271,-0.004Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,436.746,29.709)">
|
||||
<path d="M0.514,-0.267C0.514,-0.227 0.511,-0.19 0.504,-0.156C0.498,-0.122 0.487,-0.093 0.472,-0.068C0.457,-0.044 0.437,-0.025 0.412,-0.011C0.387,0.003 0.356,0.01 0.32,0.01C0.282,0.01 0.249,0.003 0.221,-0.012C0.192,-0.026 0.171,-0.049 0.156,-0.082L0.153,-0.082C0.154,-0.081 0.154,-0.078 0.154,-0.073C0.154,-0.068 0.154,-0.062 0.155,-0.054C0.155,-0.046 0.155,-0.037 0.155,-0.028C0.155,-0.018 0.155,-0.008 0.155,0.001L0.155,0.208L0.067,0.208L0.067,-0.42C0.067,-0.433 0.067,-0.445 0.067,-0.457C0.067,-0.469 0.067,-0.479 0.066,-0.489C0.066,-0.499 0.066,-0.507 0.065,-0.514C0.065,-0.521 0.065,-0.525 0.064,-0.528L0.149,-0.528C0.15,-0.527 0.15,-0.524 0.151,-0.518C0.151,-0.512 0.152,-0.505 0.152,-0.497C0.153,-0.489 0.153,-0.48 0.154,-0.47C0.154,-0.461 0.154,-0.452 0.154,-0.443L0.156,-0.443C0.164,-0.46 0.174,-0.475 0.184,-0.487C0.194,-0.498 0.206,-0.508 0.22,-0.516C0.233,-0.524 0.248,-0.529 0.264,-0.532C0.281,-0.536 0.299,-0.538 0.32,-0.538C0.356,-0.538 0.387,-0.531 0.412,-0.518C0.437,-0.505 0.457,-0.487 0.472,-0.463C0.487,-0.44 0.498,-0.411 0.504,-0.378C0.511,-0.344 0.514,-0.307 0.514,-0.267ZM0.422,-0.265C0.422,-0.297 0.42,-0.326 0.416,-0.352C0.412,-0.377 0.405,-0.398 0.396,-0.416C0.386,-0.434 0.373,-0.447 0.357,-0.456C0.341,-0.465 0.321,-0.47 0.297,-0.47C0.278,-0.47 0.259,-0.467 0.242,-0.461C0.225,-0.456 0.21,-0.445 0.197,-0.43C0.184,-0.414 0.174,-0.392 0.167,-0.365C0.159,-0.337 0.155,-0.302 0.155,-0.258C0.155,-0.22 0.158,-0.189 0.165,-0.163C0.171,-0.137 0.18,-0.116 0.192,-0.1C0.204,-0.084 0.218,-0.073 0.236,-0.066C0.253,-0.059 0.274,-0.055 0.296,-0.055C0.321,-0.055 0.341,-0.06 0.357,-0.069C0.373,-0.079 0.386,-0.092 0.396,-0.11C0.405,-0.128 0.412,-0.15 0.416,-0.176C0.42,-0.202 0.422,-0.231 0.422,-0.265Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,459.548,29.709)">
|
||||
<path d="M0.464,-0.146C0.464,-0.121 0.459,-0.099 0.449,-0.08C0.44,-0.06 0.426,-0.044 0.408,-0.031C0.389,-0.018 0.367,-0.008 0.341,-0.001C0.314,0.006 0.284,0.01 0.25,0.01C0.219,0.01 0.191,0.007 0.167,0.003C0.142,-0.002 0.121,-0.01 0.102,-0.02C0.083,-0.03 0.068,-0.044 0.055,-0.061C0.043,-0.078 0.034,-0.099 0.028,-0.124L0.105,-0.139C0.113,-0.111 0.128,-0.09 0.152,-0.077C0.175,-0.064 0.208,-0.057 0.25,-0.057C0.268,-0.057 0.286,-0.058 0.302,-0.061C0.317,-0.064 0.331,-0.068 0.342,-0.074C0.354,-0.081 0.363,-0.089 0.369,-0.1C0.375,-0.11 0.378,-0.124 0.378,-0.139C0.378,-0.155 0.375,-0.168 0.367,-0.178C0.36,-0.189 0.349,-0.197 0.336,-0.204C0.323,-0.211 0.306,-0.217 0.287,-0.222C0.268,-0.227 0.247,-0.233 0.225,-0.239C0.203,-0.244 0.182,-0.25 0.162,-0.257C0.141,-0.264 0.122,-0.273 0.105,-0.284C0.088,-0.296 0.075,-0.31 0.064,-0.326C0.054,-0.343 0.049,-0.364 0.049,-0.389C0.049,-0.437 0.066,-0.474 0.1,-0.499C0.135,-0.524 0.185,-0.537 0.25,-0.537C0.309,-0.537 0.355,-0.526 0.389,-0.506C0.424,-0.485 0.445,-0.452 0.455,-0.407L0.375,-0.397C0.373,-0.411 0.367,-0.423 0.359,-0.432C0.352,-0.441 0.342,-0.449 0.331,-0.454C0.32,-0.46 0.308,-0.464 0.294,-0.467C0.28,-0.469 0.265,-0.47 0.25,-0.47C0.211,-0.47 0.181,-0.464 0.163,-0.452C0.144,-0.44 0.134,-0.422 0.134,-0.397C0.134,-0.383 0.138,-0.371 0.145,-0.362C0.152,-0.353 0.162,-0.345 0.174,-0.339C0.187,-0.332 0.202,-0.327 0.219,-0.322C0.237,-0.317 0.256,-0.312 0.277,-0.307C0.291,-0.304 0.306,-0.3 0.32,-0.296C0.335,-0.292 0.349,-0.287 0.363,-0.281C0.377,-0.275 0.39,-0.269 0.402,-0.261C0.414,-0.253 0.425,-0.244 0.434,-0.233C0.443,-0.223 0.45,-0.21 0.456,-0.196C0.461,-0.181 0.464,-0.165 0.464,-0.146Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,480.048,29.709)">
|
||||
<path d="M0.091,-0.427L0.091,-0.528L0.187,-0.528L0.187,-0.427L0.091,-0.427ZM0.091,0L0.091,-0.101L0.187,-0.101L0.187,0L0.091,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,491.439,29.709)">
|
||||
<path d="M0,0.01L0.201,-0.725L0.278,-0.725L0.079,0.01L0,0.01Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,502.831,29.709)">
|
||||
<path d="M0,0.01L0.201,-0.725L0.278,-0.725L0.079,0.01L0,0.01Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,514.222,29.709)">
|
||||
<path d="M0.268,0.208C0.237,0.208 0.21,0.204 0.187,0.198C0.164,0.192 0.144,0.183 0.127,0.172C0.11,0.16 0.097,0.146 0.086,0.13C0.076,0.114 0.069,0.097 0.064,0.077L0.152,0.064C0.158,0.089 0.171,0.108 0.191,0.121C0.211,0.134 0.237,0.141 0.27,0.141C0.29,0.141 0.308,0.138 0.324,0.132C0.34,0.127 0.354,0.118 0.366,0.106C0.377,0.094 0.386,0.078 0.392,0.058C0.398,0.039 0.401,0.015 0.401,-0.013L0.401,-0.098L0.4,-0.098C0.394,-0.085 0.386,-0.072 0.376,-0.06C0.367,-0.048 0.355,-0.037 0.341,-0.027C0.327,-0.018 0.311,-0.01 0.293,-0.005C0.275,0.001 0.254,0.004 0.23,0.004C0.197,0.004 0.168,-0.002 0.144,-0.013C0.12,-0.024 0.101,-0.041 0.086,-0.063C0.071,-0.086 0.059,-0.114 0.052,-0.147C0.045,-0.181 0.042,-0.219 0.042,-0.263C0.042,-0.306 0.045,-0.344 0.052,-0.377C0.059,-0.411 0.071,-0.44 0.087,-0.464C0.102,-0.487 0.123,-0.505 0.148,-0.518C0.173,-0.53 0.204,-0.537 0.24,-0.537C0.278,-0.537 0.31,-0.528 0.338,-0.511C0.365,-0.494 0.386,-0.47 0.401,-0.438L0.402,-0.438C0.402,-0.446 0.403,-0.455 0.403,-0.465C0.404,-0.475 0.404,-0.485 0.405,-0.494C0.405,-0.503 0.406,-0.511 0.406,-0.517C0.407,-0.524 0.408,-0.527 0.408,-0.528L0.492,-0.528C0.491,-0.525 0.491,-0.52 0.491,-0.513C0.49,-0.506 0.49,-0.498 0.49,-0.488C0.489,-0.479 0.489,-0.468 0.489,-0.456C0.489,-0.444 0.489,-0.432 0.489,-0.419L0.489,-0.015C0.489,0.059 0.471,0.114 0.434,0.152C0.398,0.189 0.342,0.208 0.268,0.208ZM0.401,-0.264C0.401,-0.301 0.397,-0.332 0.389,-0.359C0.381,-0.385 0.371,-0.406 0.358,-0.423C0.345,-0.439 0.33,-0.452 0.313,-0.459C0.296,-0.467 0.279,-0.471 0.262,-0.471C0.239,-0.471 0.22,-0.467 0.204,-0.459C0.188,-0.452 0.174,-0.439 0.164,-0.423C0.153,-0.406 0.145,-0.384 0.14,-0.358C0.135,-0.332 0.133,-0.301 0.133,-0.264C0.133,-0.226 0.135,-0.194 0.14,-0.168C0.145,-0.142 0.153,-0.121 0.164,-0.105C0.174,-0.09 0.187,-0.078 0.203,-0.071C0.219,-0.064 0.238,-0.061 0.26,-0.061C0.278,-0.061 0.295,-0.065 0.312,-0.072C0.329,-0.08 0.344,-0.092 0.357,-0.108C0.37,-0.124 0.381,-0.145 0.389,-0.171C0.397,-0.197 0.401,-0.228 0.401,-0.264Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,537.024,29.709)">
|
||||
<path d="M0.067,-0.641L0.067,-0.725L0.155,-0.725L0.155,-0.641L0.067,-0.641ZM0.067,0L0.067,-0.528L0.155,-0.528L0.155,0L0.067,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,546.133,29.709)">
|
||||
<path d="M0.271,-0.004C0.257,0 0.244,0.003 0.23,0.005C0.216,0.007 0.2,0.008 0.182,0.008C0.111,0.008 0.076,-0.032 0.076,-0.112L0.076,-0.464L0.015,-0.464L0.015,-0.528L0.08,-0.528L0.105,-0.646L0.164,-0.646L0.164,-0.528L0.262,-0.528L0.262,-0.464L0.164,-0.464L0.164,-0.131C0.164,-0.105 0.168,-0.088 0.177,-0.077C0.185,-0.067 0.199,-0.062 0.22,-0.062C0.228,-0.062 0.236,-0.063 0.244,-0.064C0.252,-0.065 0.261,-0.067 0.271,-0.069L0.271,-0.004Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,557.524,29.709)">
|
||||
<path d="M0.155,-0.438C0.165,-0.456 0.175,-0.471 0.187,-0.484C0.198,-0.496 0.21,-0.507 0.224,-0.515C0.238,-0.523 0.253,-0.529 0.269,-0.532C0.285,-0.536 0.304,-0.538 0.324,-0.538C0.358,-0.538 0.385,-0.534 0.407,-0.524C0.429,-0.515 0.446,-0.503 0.458,-0.486C0.471,-0.47 0.479,-0.45 0.484,-0.427C0.489,-0.404 0.491,-0.379 0.491,-0.352L0.491,0L0.403,0L0.403,-0.335C0.403,-0.357 0.401,-0.377 0.399,-0.394C0.396,-0.411 0.391,-0.425 0.383,-0.436C0.375,-0.448 0.364,-0.456 0.35,-0.462C0.335,-0.467 0.317,-0.47 0.294,-0.47C0.273,-0.47 0.254,-0.466 0.238,-0.459C0.221,-0.451 0.206,-0.441 0.195,-0.427C0.183,-0.414 0.174,-0.397 0.167,-0.377C0.16,-0.358 0.157,-0.336 0.157,-0.312L0.157,0L0.069,0L0.069,-0.725L0.157,-0.725L0.157,-0.536C0.157,-0.525 0.157,-0.515 0.157,-0.504C0.156,-0.493 0.156,-0.483 0.156,-0.474C0.155,-0.465 0.155,-0.457 0.154,-0.451C0.154,-0.445 0.154,-0.44 0.153,-0.438L0.155,-0.438Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,580.326,29.709)">
|
||||
<path d="M0.153,-0.528L0.153,-0.193C0.153,-0.168 0.155,-0.146 0.159,-0.129C0.163,-0.112 0.169,-0.098 0.177,-0.087C0.186,-0.077 0.197,-0.069 0.211,-0.065C0.225,-0.06 0.242,-0.058 0.262,-0.058C0.283,-0.058 0.302,-0.062 0.319,-0.069C0.335,-0.076 0.35,-0.087 0.362,-0.101C0.373,-0.115 0.383,-0.132 0.389,-0.152C0.396,-0.172 0.399,-0.196 0.399,-0.222L0.399,-0.528L0.487,-0.528L0.487,-0.113C0.487,-0.102 0.487,-0.09 0.487,-0.078C0.487,-0.066 0.487,-0.054 0.488,-0.043C0.488,-0.032 0.488,-0.023 0.489,-0.015C0.489,-0.007 0.489,-0.002 0.49,0L0.407,0C0.406,-0.002 0.406,-0.006 0.406,-0.013C0.405,-0.02 0.405,-0.029 0.405,-0.038C0.404,-0.047 0.404,-0.057 0.403,-0.066C0.403,-0.076 0.403,-0.084 0.403,-0.09L0.401,-0.09C0.393,-0.075 0.384,-0.061 0.374,-0.049C0.363,-0.036 0.352,-0.026 0.338,-0.017C0.325,-0.009 0.31,-0.002 0.292,0.003C0.275,0.007 0.255,0.01 0.232,0.01C0.203,0.01 0.178,0.006 0.157,-0.001C0.136,-0.008 0.118,-0.019 0.104,-0.034C0.091,-0.049 0.081,-0.068 0.074,-0.092C0.068,-0.115 0.065,-0.143 0.065,-0.176L0.065,-0.528L0.153,-0.528Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,603.128,29.709)">
|
||||
<path d="M0.514,-0.267C0.514,-0.082 0.449,0.01 0.32,0.01C0.28,0.01 0.247,0.003 0.22,-0.012C0.193,-0.026 0.172,-0.05 0.155,-0.082L0.154,-0.082C0.154,-0.074 0.154,-0.065 0.154,-0.056C0.153,-0.047 0.153,-0.038 0.152,-0.03C0.152,-0.022 0.151,-0.016 0.151,-0.01C0.15,-0.005 0.15,-0.001 0.149,0L0.064,0C0.065,-0.003 0.065,-0.008 0.065,-0.015C0.066,-0.022 0.066,-0.03 0.066,-0.04C0.067,-0.05 0.067,-0.061 0.067,-0.072C0.067,-0.084 0.067,-0.096 0.067,-0.109L0.067,-0.725L0.155,-0.725L0.155,-0.518C0.155,-0.508 0.155,-0.499 0.155,-0.49C0.155,-0.481 0.155,-0.473 0.154,-0.466C0.154,-0.458 0.154,-0.451 0.153,-0.443L0.155,-0.443C0.172,-0.477 0.193,-0.501 0.22,-0.516C0.247,-0.531 0.28,-0.538 0.32,-0.538C0.387,-0.538 0.436,-0.516 0.467,-0.471C0.498,-0.426 0.514,-0.358 0.514,-0.267ZM0.422,-0.264C0.422,-0.3 0.42,-0.331 0.415,-0.357C0.41,-0.383 0.403,-0.405 0.393,-0.422C0.383,-0.438 0.37,-0.451 0.354,-0.458C0.339,-0.466 0.32,-0.47 0.297,-0.47C0.274,-0.47 0.254,-0.466 0.236,-0.459C0.218,-0.451 0.204,-0.439 0.192,-0.423C0.18,-0.406 0.171,-0.384 0.165,-0.357C0.158,-0.33 0.155,-0.297 0.155,-0.258C0.155,-0.221 0.158,-0.189 0.165,-0.163C0.171,-0.137 0.18,-0.116 0.192,-0.1C0.204,-0.084 0.218,-0.073 0.236,-0.066C0.253,-0.059 0.274,-0.055 0.296,-0.055C0.318,-0.055 0.336,-0.059 0.352,-0.066C0.368,-0.074 0.381,-0.086 0.391,-0.103C0.402,-0.119 0.409,-0.141 0.414,-0.167C0.419,-0.194 0.422,-0.226 0.422,-0.264Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,625.931,29.709)">
|
||||
<rect x="0.091" y="-0.107" width="0.095" height="0.107" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,637.322,29.709)">
|
||||
<path d="M0.134,-0.267C0.134,-0.236 0.136,-0.208 0.141,-0.183C0.145,-0.158 0.153,-0.136 0.163,-0.117C0.174,-0.099 0.187,-0.085 0.204,-0.075C0.221,-0.065 0.243,-0.06 0.268,-0.06C0.299,-0.06 0.325,-0.068 0.346,-0.085C0.367,-0.102 0.38,-0.128 0.385,-0.163L0.474,-0.157C0.471,-0.135 0.464,-0.114 0.455,-0.094C0.445,-0.074 0.432,-0.056 0.415,-0.041C0.398,-0.026 0.378,-0.013 0.354,-0.004C0.329,0.005 0.302,0.01 0.27,0.01C0.229,0.01 0.194,0.003 0.165,-0.011C0.136,-0.025 0.112,-0.045 0.094,-0.069C0.076,-0.094 0.063,-0.123 0.055,-0.156C0.047,-0.189 0.042,-0.226 0.042,-0.265C0.042,-0.3 0.045,-0.331 0.051,-0.359C0.057,-0.386 0.065,-0.41 0.076,-0.43C0.087,-0.45 0.099,-0.467 0.113,-0.481C0.128,-0.495 0.143,-0.506 0.16,-0.514C0.177,-0.523 0.194,-0.529 0.213,-0.532C0.231,-0.536 0.25,-0.538 0.269,-0.538C0.299,-0.538 0.325,-0.534 0.348,-0.526C0.371,-0.518 0.391,-0.507 0.408,-0.492C0.425,-0.478 0.438,-0.462 0.449,-0.442C0.459,-0.423 0.466,-0.403 0.471,-0.38L0.38,-0.374C0.376,-0.403 0.364,-0.426 0.346,-0.443C0.327,-0.461 0.301,-0.469 0.267,-0.469C0.242,-0.469 0.221,-0.465 0.204,-0.457C0.187,-0.448 0.174,-0.436 0.163,-0.419C0.153,-0.402 0.145,-0.381 0.141,-0.356C0.136,-0.331 0.134,-0.301 0.134,-0.267Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,657.822,29.709)">
|
||||
<path d="M0.514,-0.265C0.514,-0.172 0.494,-0.103 0.453,-0.058C0.412,-0.013 0.353,0.01 0.276,0.01C0.239,0.01 0.206,0.004 0.177,-0.007C0.148,-0.018 0.124,-0.035 0.104,-0.058C0.084,-0.08 0.068,-0.109 0.058,-0.143C0.047,-0.178 0.042,-0.218 0.042,-0.265C0.042,-0.447 0.121,-0.538 0.279,-0.538C0.32,-0.538 0.355,-0.532 0.385,-0.521C0.415,-0.51 0.439,-0.493 0.458,-0.47C0.477,-0.447 0.491,-0.418 0.5,-0.384C0.51,-0.35 0.514,-0.31 0.514,-0.265ZM0.422,-0.265C0.422,-0.306 0.419,-0.34 0.412,-0.366C0.406,-0.393 0.397,-0.414 0.385,-0.43C0.372,-0.446 0.357,-0.457 0.34,-0.464C0.322,-0.47 0.302,-0.473 0.28,-0.473C0.258,-0.473 0.238,-0.47 0.219,-0.463C0.201,-0.456 0.186,-0.445 0.173,-0.429C0.161,-0.413 0.151,-0.391 0.144,-0.365C0.138,-0.338 0.134,-0.305 0.134,-0.265C0.134,-0.224 0.138,-0.19 0.145,-0.163C0.152,-0.136 0.162,-0.115 0.175,-0.099C0.187,-0.083 0.202,-0.071 0.219,-0.065C0.236,-0.058 0.255,-0.055 0.275,-0.055C0.297,-0.055 0.318,-0.058 0.336,-0.065C0.354,-0.071 0.37,-0.082 0.382,-0.098C0.395,-0.114 0.405,-0.136 0.412,-0.163C0.418,-0.19 0.422,-0.224 0.422,-0.265Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,680.624,29.709)">
|
||||
<path d="M0.375,0L0.375,-0.335C0.375,-0.361 0.373,-0.382 0.37,-0.399C0.367,-0.417 0.361,-0.431 0.354,-0.441C0.346,-0.452 0.336,-0.459 0.324,-0.464C0.311,-0.468 0.296,-0.47 0.278,-0.47C0.26,-0.47 0.243,-0.467 0.228,-0.459C0.213,-0.452 0.2,-0.441 0.19,-0.427C0.179,-0.414 0.171,-0.397 0.165,-0.376C0.16,-0.356 0.157,-0.333 0.157,-0.306L0.157,0L0.069,0L0.069,-0.416C0.069,-0.427 0.069,-0.438 0.069,-0.45C0.069,-0.463 0.069,-0.474 0.068,-0.485C0.068,-0.496 0.068,-0.505 0.067,-0.513C0.067,-0.521 0.067,-0.526 0.066,-0.528L0.149,-0.528C0.15,-0.527 0.15,-0.522 0.15,-0.515C0.151,-0.508 0.151,-0.5 0.152,-0.49C0.152,-0.481 0.153,-0.472 0.153,-0.462C0.153,-0.453 0.153,-0.444 0.153,-0.438L0.155,-0.438C0.163,-0.453 0.171,-0.467 0.18,-0.479C0.189,-0.492 0.2,-0.502 0.212,-0.511C0.224,-0.52 0.238,-0.526 0.254,-0.531C0.27,-0.536 0.288,-0.538 0.309,-0.538C0.349,-0.538 0.381,-0.53 0.404,-0.514C0.427,-0.498 0.444,-0.473 0.453,-0.438L0.454,-0.438C0.462,-0.453 0.471,-0.467 0.48,-0.479C0.49,-0.492 0.502,-0.502 0.515,-0.511C0.528,-0.52 0.542,-0.526 0.559,-0.531C0.575,-0.536 0.593,-0.538 0.614,-0.538C0.641,-0.538 0.664,-0.535 0.683,-0.527C0.703,-0.52 0.719,-0.509 0.731,-0.494C0.743,-0.479 0.752,-0.46 0.758,-0.436C0.764,-0.413 0.767,-0.385 0.767,-0.352L0.767,0L0.68,0L0.68,-0.335C0.68,-0.361 0.679,-0.382 0.675,-0.399C0.672,-0.417 0.667,-0.431 0.659,-0.441C0.651,-0.452 0.641,-0.459 0.629,-0.464C0.617,-0.468 0.601,-0.47 0.583,-0.47C0.565,-0.47 0.548,-0.467 0.533,-0.46C0.518,-0.453 0.505,-0.442 0.495,-0.429C0.484,-0.415 0.476,-0.398 0.47,-0.377C0.465,-0.357 0.462,-0.333 0.462,-0.306L0.462,0L0.375,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,714.777,29.709)">
|
||||
<path d="M0,0.01L0.201,-0.725L0.278,-0.725L0.079,0.01L0,0.01Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,726.168,29.709)">
|
||||
<path d="M0.614,-0.481C0.614,-0.451 0.609,-0.423 0.599,-0.397C0.589,-0.371 0.575,-0.349 0.555,-0.33C0.535,-0.311 0.511,-0.296 0.481,-0.285C0.451,-0.274 0.417,-0.268 0.377,-0.268L0.175,-0.268L0.175,0L0.082,0L0.082,-0.688L0.372,-0.688C0.412,-0.688 0.448,-0.683 0.478,-0.673C0.508,-0.663 0.534,-0.649 0.554,-0.631C0.574,-0.613 0.589,-0.591 0.599,-0.566C0.609,-0.54 0.614,-0.512 0.614,-0.481ZM0.521,-0.48C0.521,-0.524 0.507,-0.557 0.48,-0.579C0.454,-0.602 0.414,-0.613 0.36,-0.613L0.175,-0.613L0.175,-0.342L0.364,-0.342C0.418,-0.342 0.457,-0.354 0.483,-0.377C0.508,-0.401 0.521,-0.435 0.521,-0.48Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,753.515,29.709)">
|
||||
<path d="M0.547,0L0.547,-0.319L0.175,-0.319L0.175,0L0.082,0L0.082,-0.688L0.175,-0.688L0.175,-0.397L0.547,-0.397L0.547,-0.688L0.641,-0.688L0.641,0L0.547,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,783.124,29.709)">
|
||||
<path d="M0.614,-0.481C0.614,-0.451 0.609,-0.423 0.599,-0.397C0.589,-0.371 0.575,-0.349 0.555,-0.33C0.535,-0.311 0.511,-0.296 0.481,-0.285C0.451,-0.274 0.417,-0.268 0.377,-0.268L0.175,-0.268L0.175,0L0.082,0L0.082,-0.688L0.372,-0.688C0.412,-0.688 0.448,-0.683 0.478,-0.673C0.508,-0.663 0.534,-0.649 0.554,-0.631C0.574,-0.613 0.589,-0.591 0.599,-0.566C0.609,-0.54 0.614,-0.512 0.614,-0.481ZM0.521,-0.48C0.521,-0.524 0.507,-0.557 0.48,-0.579C0.454,-0.602 0.414,-0.613 0.36,-0.613L0.175,-0.613L0.175,-0.342L0.364,-0.342C0.418,-0.342 0.457,-0.354 0.483,-0.377C0.508,-0.401 0.521,-0.435 0.521,-0.48Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,810.471,29.709)">
|
||||
<path d="M0.667,0L0.667,-0.459C0.667,-0.476 0.667,-0.493 0.667,-0.51C0.668,-0.527 0.668,-0.543 0.669,-0.557C0.67,-0.574 0.67,-0.59 0.671,-0.605C0.667,-0.589 0.662,-0.572 0.657,-0.556C0.653,-0.542 0.648,-0.527 0.643,-0.511C0.638,-0.496 0.633,-0.481 0.628,-0.469L0.451,0L0.385,0L0.205,-0.469C0.203,-0.474 0.201,-0.479 0.199,-0.486L0.185,-0.529C0.182,-0.537 0.18,-0.544 0.178,-0.552C0.172,-0.569 0.167,-0.587 0.162,-0.605C0.162,-0.587 0.162,-0.569 0.163,-0.551C0.164,-0.536 0.164,-0.52 0.165,-0.503C0.165,-0.486 0.165,-0.472 0.165,-0.459L0.165,0L0.082,0L0.082,-0.688L0.205,-0.688L0.388,-0.211C0.39,-0.204 0.393,-0.196 0.396,-0.186C0.399,-0.176 0.402,-0.165 0.405,-0.154C0.408,-0.144 0.411,-0.133 0.413,-0.124C0.416,-0.114 0.417,-0.107 0.418,-0.102C0.419,-0.107 0.421,-0.114 0.424,-0.124C0.426,-0.134 0.429,-0.144 0.433,-0.155C0.436,-0.166 0.44,-0.176 0.443,-0.186C0.446,-0.196 0.449,-0.204 0.452,-0.211L0.631,-0.688L0.751,-0.688L0.751,0L0.667,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,844.624,29.709)">
|
||||
<path d="M0.202,0.01C0.149,0.01 0.109,-0.004 0.083,-0.032C0.056,-0.06 0.042,-0.099 0.042,-0.147C0.042,-0.182 0.049,-0.211 0.062,-0.233C0.075,-0.255 0.093,-0.273 0.114,-0.286C0.135,-0.298 0.16,-0.307 0.187,-0.312C0.214,-0.317 0.242,-0.32 0.271,-0.32L0.389,-0.322L0.389,-0.351C0.389,-0.373 0.387,-0.391 0.382,-0.407C0.378,-0.422 0.371,-0.434 0.361,-0.444C0.352,-0.453 0.34,-0.46 0.326,-0.465C0.312,-0.469 0.295,-0.471 0.276,-0.471C0.259,-0.471 0.244,-0.47 0.23,-0.468C0.216,-0.465 0.204,-0.461 0.194,-0.454C0.184,-0.448 0.176,-0.439 0.17,-0.428C0.164,-0.418 0.16,-0.404 0.158,-0.387L0.066,-0.396C0.069,-0.416 0.075,-0.435 0.084,-0.453C0.094,-0.47 0.107,-0.485 0.123,-0.498C0.14,-0.511 0.161,-0.521 0.186,-0.528C0.212,-0.535 0.242,-0.538 0.278,-0.538C0.344,-0.538 0.394,-0.523 0.428,-0.492C0.461,-0.462 0.478,-0.418 0.478,-0.36L0.478,-0.133C0.478,-0.107 0.481,-0.087 0.488,-0.074C0.495,-0.061 0.508,-0.054 0.527,-0.054C0.532,-0.054 0.537,-0.055 0.542,-0.055C0.547,-0.056 0.552,-0.057 0.556,-0.058L0.556,-0.003C0.545,0 0.534,0.002 0.523,0.003C0.512,0.004 0.501,0.005 0.488,0.005C0.472,0.005 0.457,0.003 0.446,-0.002C0.434,-0.006 0.424,-0.013 0.417,-0.022C0.409,-0.031 0.403,-0.042 0.399,-0.055C0.396,-0.068 0.393,-0.083 0.392,-0.101L0.389,-0.101C0.38,-0.084 0.369,-0.069 0.358,-0.055C0.347,-0.042 0.334,-0.03 0.319,-0.02C0.304,-0.011 0.287,-0.003 0.268,0.002C0.249,0.007 0.227,0.01 0.202,0.01ZM0.222,-0.056C0.25,-0.056 0.275,-0.061 0.296,-0.072C0.317,-0.082 0.334,-0.095 0.348,-0.111C0.362,-0.127 0.372,-0.144 0.379,-0.163C0.386,-0.182 0.389,-0.2 0.389,-0.217L0.389,-0.261L0.293,-0.259C0.271,-0.258 0.251,-0.257 0.232,-0.254C0.212,-0.251 0.195,-0.246 0.181,-0.238C0.166,-0.23 0.154,-0.218 0.146,-0.204C0.137,-0.189 0.133,-0.17 0.133,-0.146C0.133,-0.117 0.141,-0.095 0.156,-0.08C0.171,-0.064 0.194,-0.056 0.222,-0.056Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,867.426,29.709)">
|
||||
<path d="M0.067,-0.641L0.067,-0.725L0.155,-0.725L0.155,-0.641L0.067,-0.641ZM0.067,0L0.067,-0.528L0.155,-0.528L0.155,0L0.067,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,876.535,29.709)">
|
||||
<rect x="0.067" y="-0.725" width="0.088" height="0.725" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,885.644,29.709)">
|
||||
<path d="M0.135,-0.246C0.135,-0.218 0.138,-0.192 0.143,-0.169C0.149,-0.146 0.158,-0.126 0.17,-0.109C0.182,-0.092 0.197,-0.079 0.215,-0.07C0.234,-0.061 0.256,-0.056 0.282,-0.056C0.32,-0.056 0.351,-0.064 0.374,-0.079C0.397,-0.094 0.412,-0.114 0.42,-0.137L0.498,-0.115C0.492,-0.101 0.484,-0.086 0.474,-0.071C0.464,-0.056 0.451,-0.043 0.435,-0.031C0.418,-0.019 0.397,-0.009 0.372,-0.002C0.347,0.006 0.317,0.01 0.282,0.01C0.204,0.01 0.145,-0.014 0.104,-0.06C0.063,-0.107 0.042,-0.176 0.042,-0.268C0.042,-0.317 0.049,-0.359 0.061,-0.393C0.073,-0.428 0.09,-0.456 0.112,-0.477C0.133,-0.499 0.158,-0.514 0.187,-0.524C0.216,-0.533 0.246,-0.538 0.279,-0.538C0.323,-0.538 0.36,-0.531 0.39,-0.517C0.42,-0.502 0.444,-0.483 0.462,-0.457C0.48,-0.432 0.493,-0.402 0.5,-0.368C0.508,-0.334 0.512,-0.297 0.512,-0.257L0.512,-0.246L0.135,-0.246ZM0.421,-0.313C0.416,-0.369 0.402,-0.409 0.378,-0.435C0.355,-0.46 0.321,-0.473 0.277,-0.473C0.263,-0.473 0.247,-0.471 0.231,-0.466C0.215,-0.461 0.2,-0.453 0.187,-0.441C0.173,-0.429 0.161,-0.413 0.152,-0.392C0.142,-0.371 0.137,-0.345 0.136,-0.313L0.421,-0.313Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,908.446,29.709)">
|
||||
<path d="M0.069,0L0.069,-0.405C0.069,-0.416 0.069,-0.428 0.069,-0.439C0.069,-0.451 0.069,-0.462 0.068,-0.473C0.068,-0.483 0.068,-0.493 0.067,-0.503C0.067,-0.512 0.067,-0.521 0.066,-0.528L0.149,-0.528L0.152,-0.473C0.153,-0.463 0.153,-0.453 0.153,-0.444C0.153,-0.435 0.153,-0.427 0.153,-0.42L0.155,-0.42C0.161,-0.441 0.168,-0.458 0.175,-0.473C0.182,-0.488 0.19,-0.5 0.2,-0.51C0.209,-0.519 0.22,-0.526 0.233,-0.531C0.246,-0.536 0.262,-0.538 0.281,-0.538C0.288,-0.538 0.295,-0.538 0.301,-0.536C0.308,-0.535 0.313,-0.534 0.316,-0.533L0.316,-0.453C0.311,-0.454 0.304,-0.455 0.296,-0.456C0.288,-0.457 0.279,-0.458 0.27,-0.458C0.249,-0.458 0.232,-0.453 0.218,-0.444C0.204,-0.435 0.192,-0.422 0.183,-0.406C0.174,-0.39 0.168,-0.371 0.164,-0.348C0.159,-0.326 0.157,-0.302 0.157,-0.275L0.157,0L0.069,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,922.1,29.709)">
|
||||
<path d="M0,0.01L0.201,-0.725L0.278,-0.725L0.079,0.01L0,0.01Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,933.491,29.709)">
|
||||
<path d="M0.614,-0.481C0.614,-0.451 0.609,-0.423 0.599,-0.397C0.589,-0.371 0.575,-0.349 0.555,-0.33C0.535,-0.311 0.511,-0.296 0.481,-0.285C0.451,-0.274 0.417,-0.268 0.377,-0.268L0.175,-0.268L0.175,0L0.082,0L0.082,-0.688L0.372,-0.688C0.412,-0.688 0.448,-0.683 0.478,-0.673C0.508,-0.663 0.534,-0.649 0.554,-0.631C0.574,-0.613 0.589,-0.591 0.599,-0.566C0.609,-0.54 0.614,-0.512 0.614,-0.481ZM0.521,-0.48C0.521,-0.524 0.507,-0.557 0.48,-0.579C0.454,-0.602 0.414,-0.613 0.36,-0.613L0.175,-0.613L0.175,-0.342L0.364,-0.342C0.418,-0.342 0.457,-0.354 0.483,-0.377C0.508,-0.401 0.521,-0.435 0.521,-0.48Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,960.837,29.709)">
|
||||
<path d="M0.547,0L0.547,-0.319L0.175,-0.319L0.175,0L0.082,0L0.082,-0.688L0.175,-0.688L0.175,-0.397L0.547,-0.397L0.547,-0.688L0.641,-0.688L0.641,0L0.547,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,990.446,29.709)">
|
||||
<path d="M0.614,-0.481C0.614,-0.451 0.609,-0.423 0.599,-0.397C0.589,-0.371 0.575,-0.349 0.555,-0.33C0.535,-0.311 0.511,-0.296 0.481,-0.285C0.451,-0.274 0.417,-0.268 0.377,-0.268L0.175,-0.268L0.175,0L0.082,0L0.082,-0.688L0.372,-0.688C0.412,-0.688 0.448,-0.683 0.478,-0.673C0.508,-0.663 0.534,-0.649 0.554,-0.631C0.574,-0.613 0.589,-0.591 0.599,-0.566C0.609,-0.54 0.614,-0.512 0.614,-0.481ZM0.521,-0.48C0.521,-0.524 0.507,-0.557 0.48,-0.579C0.454,-0.602 0.414,-0.613 0.36,-0.613L0.175,-0.613L0.175,-0.342L0.364,-0.342C0.418,-0.342 0.457,-0.354 0.483,-0.377C0.508,-0.401 0.521,-0.435 0.521,-0.48Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,1017.79,29.709)">
|
||||
<path d="M0.667,0L0.667,-0.459C0.667,-0.476 0.667,-0.493 0.667,-0.51C0.668,-0.527 0.668,-0.543 0.669,-0.557C0.67,-0.574 0.67,-0.59 0.671,-0.605C0.667,-0.589 0.662,-0.572 0.657,-0.556C0.653,-0.542 0.648,-0.527 0.643,-0.511C0.638,-0.496 0.633,-0.481 0.628,-0.469L0.451,0L0.385,0L0.205,-0.469C0.203,-0.474 0.201,-0.479 0.199,-0.486L0.185,-0.529C0.182,-0.537 0.18,-0.544 0.178,-0.552C0.172,-0.569 0.167,-0.587 0.162,-0.605C0.162,-0.587 0.162,-0.569 0.163,-0.551C0.164,-0.536 0.164,-0.52 0.165,-0.503C0.165,-0.486 0.165,-0.472 0.165,-0.459L0.165,0L0.082,0L0.082,-0.688L0.205,-0.688L0.388,-0.211C0.39,-0.204 0.393,-0.196 0.396,-0.186C0.399,-0.176 0.402,-0.165 0.405,-0.154C0.408,-0.144 0.411,-0.133 0.413,-0.124C0.416,-0.114 0.417,-0.107 0.418,-0.102C0.419,-0.107 0.421,-0.114 0.424,-0.124C0.426,-0.134 0.429,-0.144 0.433,-0.155C0.436,-0.166 0.44,-0.176 0.443,-0.186C0.446,-0.196 0.449,-0.204 0.452,-0.211L0.631,-0.688L0.751,-0.688L0.751,0L0.667,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,1051.95,29.709)">
|
||||
<path d="M0.202,0.01C0.149,0.01 0.109,-0.004 0.083,-0.032C0.056,-0.06 0.042,-0.099 0.042,-0.147C0.042,-0.182 0.049,-0.211 0.062,-0.233C0.075,-0.255 0.093,-0.273 0.114,-0.286C0.135,-0.298 0.16,-0.307 0.187,-0.312C0.214,-0.317 0.242,-0.32 0.271,-0.32L0.389,-0.322L0.389,-0.351C0.389,-0.373 0.387,-0.391 0.382,-0.407C0.378,-0.422 0.371,-0.434 0.361,-0.444C0.352,-0.453 0.34,-0.46 0.326,-0.465C0.312,-0.469 0.295,-0.471 0.276,-0.471C0.259,-0.471 0.244,-0.47 0.23,-0.468C0.216,-0.465 0.204,-0.461 0.194,-0.454C0.184,-0.448 0.176,-0.439 0.17,-0.428C0.164,-0.418 0.16,-0.404 0.158,-0.387L0.066,-0.396C0.069,-0.416 0.075,-0.435 0.084,-0.453C0.094,-0.47 0.107,-0.485 0.123,-0.498C0.14,-0.511 0.161,-0.521 0.186,-0.528C0.212,-0.535 0.242,-0.538 0.278,-0.538C0.344,-0.538 0.394,-0.523 0.428,-0.492C0.461,-0.462 0.478,-0.418 0.478,-0.36L0.478,-0.133C0.478,-0.107 0.481,-0.087 0.488,-0.074C0.495,-0.061 0.508,-0.054 0.527,-0.054C0.532,-0.054 0.537,-0.055 0.542,-0.055C0.547,-0.056 0.552,-0.057 0.556,-0.058L0.556,-0.003C0.545,0 0.534,0.002 0.523,0.003C0.512,0.004 0.501,0.005 0.488,0.005C0.472,0.005 0.457,0.003 0.446,-0.002C0.434,-0.006 0.424,-0.013 0.417,-0.022C0.409,-0.031 0.403,-0.042 0.399,-0.055C0.396,-0.068 0.393,-0.083 0.392,-0.101L0.389,-0.101C0.38,-0.084 0.369,-0.069 0.358,-0.055C0.347,-0.042 0.334,-0.03 0.319,-0.02C0.304,-0.011 0.287,-0.003 0.268,0.002C0.249,0.007 0.227,0.01 0.202,0.01ZM0.222,-0.056C0.25,-0.056 0.275,-0.061 0.296,-0.072C0.317,-0.082 0.334,-0.095 0.348,-0.111C0.362,-0.127 0.372,-0.144 0.379,-0.163C0.386,-0.182 0.389,-0.2 0.389,-0.217L0.389,-0.261L0.293,-0.259C0.271,-0.258 0.251,-0.257 0.232,-0.254C0.212,-0.251 0.195,-0.246 0.181,-0.238C0.166,-0.23 0.154,-0.218 0.146,-0.204C0.137,-0.189 0.133,-0.17 0.133,-0.146C0.133,-0.117 0.141,-0.095 0.156,-0.08C0.171,-0.064 0.194,-0.056 0.222,-0.056Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,1074.75,29.709)">
|
||||
<path d="M0.067,-0.641L0.067,-0.725L0.155,-0.725L0.155,-0.641L0.067,-0.641ZM0.067,0L0.067,-0.528L0.155,-0.528L0.155,0L0.067,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,1083.86,29.709)">
|
||||
<rect x="0.067" y="-0.725" width="0.088" height="0.725" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,1092.97,29.709)">
|
||||
<path d="M0.135,-0.246C0.135,-0.218 0.138,-0.192 0.143,-0.169C0.149,-0.146 0.158,-0.126 0.17,-0.109C0.182,-0.092 0.197,-0.079 0.215,-0.07C0.234,-0.061 0.256,-0.056 0.282,-0.056C0.32,-0.056 0.351,-0.064 0.374,-0.079C0.397,-0.094 0.412,-0.114 0.42,-0.137L0.498,-0.115C0.492,-0.101 0.484,-0.086 0.474,-0.071C0.464,-0.056 0.451,-0.043 0.435,-0.031C0.418,-0.019 0.397,-0.009 0.372,-0.002C0.347,0.006 0.317,0.01 0.282,0.01C0.204,0.01 0.145,-0.014 0.104,-0.06C0.063,-0.107 0.042,-0.176 0.042,-0.268C0.042,-0.317 0.049,-0.359 0.061,-0.393C0.073,-0.428 0.09,-0.456 0.112,-0.477C0.133,-0.499 0.158,-0.514 0.187,-0.524C0.216,-0.533 0.246,-0.538 0.279,-0.538C0.323,-0.538 0.36,-0.531 0.39,-0.517C0.42,-0.502 0.444,-0.483 0.462,-0.457C0.48,-0.432 0.493,-0.402 0.5,-0.368C0.508,-0.334 0.512,-0.297 0.512,-0.257L0.512,-0.246L0.135,-0.246ZM0.421,-0.313C0.416,-0.369 0.402,-0.409 0.378,-0.435C0.355,-0.46 0.321,-0.473 0.277,-0.473C0.263,-0.473 0.247,-0.471 0.231,-0.466C0.215,-0.461 0.2,-0.453 0.187,-0.441C0.173,-0.429 0.161,-0.413 0.152,-0.392C0.142,-0.371 0.137,-0.345 0.136,-0.313L0.421,-0.313Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(41,0,0,41,1115.77,29.709)">
|
||||
<path d="M0.069,0L0.069,-0.405C0.069,-0.416 0.069,-0.428 0.069,-0.439C0.069,-0.451 0.069,-0.462 0.068,-0.473C0.068,-0.483 0.068,-0.493 0.067,-0.503C0.067,-0.512 0.067,-0.521 0.066,-0.528L0.149,-0.528L0.152,-0.473C0.153,-0.463 0.153,-0.453 0.153,-0.444C0.153,-0.435 0.153,-0.427 0.153,-0.42L0.155,-0.42C0.161,-0.441 0.168,-0.458 0.175,-0.473C0.182,-0.488 0.19,-0.5 0.2,-0.51C0.209,-0.519 0.22,-0.526 0.233,-0.531C0.246,-0.536 0.262,-0.538 0.281,-0.538C0.288,-0.538 0.295,-0.538 0.301,-0.536C0.308,-0.535 0.313,-0.534 0.316,-0.533L0.316,-0.453C0.311,-0.454 0.304,-0.455 0.296,-0.456C0.288,-0.457 0.279,-0.458 0.27,-0.458C0.249,-0.458 0.232,-0.453 0.218,-0.444C0.204,-0.435 0.192,-0.422 0.183,-0.406C0.174,-0.39 0.168,-0.371 0.164,-0.348C0.159,-0.326 0.157,-0.302 0.157,-0.275L0.157,0L0.069,0Z" style="fill:rgb(255,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 49 B |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
|
@ -1,73 +0,0 @@
|
|||
<p>The example file "test_mail.php" contents include:</p>
|
||||
<div style="width: 600px; background-color: #CCCCCC;">
|
||||
<code>
|
||||
<?php<br>
|
||||
<br>
|
||||
include_once('../class.phpmailer.php');<br>
|
||||
<br>
|
||||
$mail = new PHPMailer();<br>
|
||||
<br>
|
||||
$body = $mail->getFile('contents.html');<br>
|
||||
<br>
|
||||
$body = eregi_replace("[\]",'',$body);<br>
|
||||
$subject = eregi_replace("[\]",'',$subject);<br>
|
||||
<br>
|
||||
$mail->From = "name@yourdomain.com";<br>
|
||||
$mail->FromName = "First Last";<br>
|
||||
<br>
|
||||
$mail->Subject = "PHPMailer Test Subject";<br>
|
||||
<br>
|
||||
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test<br>
|
||||
<br>
|
||||
$mail->MsgHTML($body);<br>
|
||||
<br>
|
||||
$mail->AddAddress("whoto@otherdomain.com", "John Doe");<br>
|
||||
<br>
|
||||
if(!$mail->Send()) {<br>
|
||||
echo 'Failed to send mail';<br>
|
||||
} else {<br>
|
||||
echo 'Mail sent';<br>
|
||||
}<br>
|
||||
<br>
|
||||
?>
|
||||
</code>
|
||||
</div>
|
||||
<br>
|
||||
Although you could use full compabitility with PHPMailer 1.7.3, this example
|
||||
shows how to use the new features. If you view 'contents.html', you will note
|
||||
that there is a background image used in the <body tag as well as an image used
|
||||
with a regular <img tag. Here's what the HTML file looks like:<br>
|
||||
<br>
|
||||
<div style="width: 600px; background-color: #CCCCCC;">
|
||||
<code>
|
||||
<body background="images/bkgrnd.gif" style="margin: 0px;"><br>
|
||||
<div style="width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 11px;"><br>
|
||||
<div align="center"><img src="images/phpmailer.gif" style="height: 90px; width: 340px"></div><br><br>
|
||||
<br><br>
|
||||
This is a test of PHPMailer v2.0.0 rc1.<br><br>
|
||||
<br><br>
|
||||
This particular example uses <strong>HTML</strong>, with a <div> tag and inline<br><br>
|
||||
styles.<br><br>
|
||||
<br><br>
|
||||
Also note the use of the PHPMailer at the top with no specific code to handle<br>
|
||||
including it in the body of the email.</div><br>
|
||||
</body><br>
|
||||
</code>
|
||||
</div>
|
||||
<br>
|
||||
A few things to notice in the PHP script that generates the email:
|
||||
<ul>
|
||||
<li>the use of $mail->AltBody is completely optional. If not used, PHPMailer
|
||||
will use the HTML text with htmlentities().</li>
|
||||
<li>the background= and <img src= images were processed without any directives
|
||||
or methods from the PHP script</li>
|
||||
<li>there is no specific code to define the image type ... that is handled
|
||||
automatically by PHPMailer when it parses the images</li>
|
||||
<li>we are using a new class method '$mail->MsgHTML($body)' ... that is what will handle the parsing of the images and creating the AltBody text</li>
|
||||
</ul>
|
||||
<p>Of course, you can still use PHPMailer the same way you have in the past.
|
||||
That provides full compatibility with all existing scripts, while new scripts
|
||||
can take advantage of the new features.</p>
|
||||
<p>Modify test_mail.php now with your own email address and try it out.</p>
|
||||
To see what the email SHOULD look like in your HTML compatible email viewer: <a href="contents.html">click here</a><br>
|
||||
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows sending a message using PHP's mail() function.
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
//Set who the message is to be sent from
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
//Set an alternative reply-to address
|
||||
$mail->addReplyTo('replyto@example.com', 'First Last');
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer mail() test';
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//convert HTML into a basic plain-text alternative body
|
||||
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
|
||||
//Replace the plain text body with one created manually
|
||||
$mail->AltBody = 'This is a plain-text message body';
|
||||
//Attach an image file
|
||||
$mail->addAttachment('images/phpmailer_mini.png');
|
||||
|
||||
//send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
echo 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo 'Message sent!';
|
||||
}
|
||||
|
|
@ -0,0 +1,96 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows how to send a message to a whole list of recipients efficiently.
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
error_reporting(E_ALL);
|
||||
|
||||
date_default_timezone_set('Etc/UTC');
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Passing `true` enables PHPMailer exceptions
|
||||
$mail = new PHPMailer(true);
|
||||
|
||||
$body = file_get_contents('contents.html');
|
||||
|
||||
$mail->isSMTP();
|
||||
$mail->Host = 'smtp.example.com';
|
||||
$mail->SMTPAuth = true;
|
||||
$mail->SMTPKeepAlive = true; //SMTP connection will not close after each email sent, reduces SMTP overhead
|
||||
$mail->Port = 25;
|
||||
$mail->Username = 'yourname@example.com';
|
||||
$mail->Password = 'yourpassword';
|
||||
$mail->setFrom('list@example.com', 'List manager');
|
||||
$mail->addReplyTo('list@example.com', 'List manager');
|
||||
$mail->addCustomHeader(
|
||||
'List-Unsubscribe',
|
||||
'<mailto:unsubscribes@example.com>, <https://www.example.com/unsubscribe.php>'
|
||||
);
|
||||
$mail->Subject = 'PHPMailer Simple database mailing list test';
|
||||
|
||||
//Same body for all messages, so set this before the sending loop
|
||||
//If you generate a different body for each recipient (e.g. you're using a templating system),
|
||||
//set it inside the loop
|
||||
$mail->msgHTML($body);
|
||||
//msgHTML also sets AltBody, but if you want a custom one, set it afterwards
|
||||
$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!';
|
||||
|
||||
//Connect to the database and select the recipients from your mailing list that have not yet been sent to
|
||||
//You'll need to alter this to match your database
|
||||
$mysql = mysqli_connect('localhost', 'username', 'password');
|
||||
mysqli_select_db($mysql, 'mydb');
|
||||
$result = mysqli_query($mysql, 'SELECT full_name, email, photo FROM mailinglist WHERE sent = FALSE');
|
||||
|
||||
foreach ($result as $row) {
|
||||
try {
|
||||
$mail->addAddress($row['email'], $row['full_name']);
|
||||
} catch (Exception $e) {
|
||||
printf(
|
||||
'Invalid address skipped: %s<br>',
|
||||
htmlspecialchars($row['email'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401)
|
||||
);
|
||||
continue;
|
||||
}
|
||||
if (!empty($row['photo'])) {
|
||||
//Assumes the image data is stored in the DB
|
||||
$mail->addStringAttachment($row['photo'], 'YourPhoto.jpg');
|
||||
}
|
||||
$mail->replaceCustomHeader(
|
||||
'List-Unsubscribe',
|
||||
'<mailto:unsubscribes@example.com>, <https://www.example.com/unsubscribe.php?email=' .
|
||||
rawurlencode($row['email']) . '>'
|
||||
);
|
||||
|
||||
try {
|
||||
$mail->send();
|
||||
printf(
|
||||
'Message sent to : %s (%s)<br>',
|
||||
htmlspecialchars($row['full_name'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401),
|
||||
htmlspecialchars($row['email'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401)
|
||||
);
|
||||
//Mark it as sent in the DB
|
||||
mysqli_query(
|
||||
$mysql,
|
||||
"UPDATE mailinglist SET sent = TRUE WHERE email = '" .
|
||||
mysqli_real_escape_string($mysql, $row['email']) . "'"
|
||||
);
|
||||
} catch (Exception $e) {
|
||||
printf(
|
||||
'Mailer Error (%s) %s<br>',
|
||||
htmlspecialchars($row['email'], ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401),
|
||||
$mail->ErrorInfo
|
||||
);
|
||||
//Reset the connection to abort sending this message
|
||||
//The loop will continue trying to send to the rest of the list
|
||||
$mail->getSMTPInstance()->reset();
|
||||
}
|
||||
//Clear all addresses and attachments for the next iteration
|
||||
$mail->clearAddresses();
|
||||
$mail->clearAttachments();
|
||||
}
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>POP before SMTP Test</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<pre>
|
||||
<?php
|
||||
require 'class.phpmailer.php';
|
||||
require 'class.pop3.php';
|
||||
|
||||
$pop = new POP3();
|
||||
$pop->Authorise('pop3.example.com', 110, 30, 'mailer', 'password', 1);
|
||||
|
||||
$mail = new PHPMailer();
|
||||
|
||||
$mail->IsSMTP();
|
||||
$mail->SMTPDebug = 2;
|
||||
$mail->IsHTML(false);
|
||||
|
||||
$mail->Host = 'relay.example.com';
|
||||
|
||||
$mail->From = 'mailer@example.com';
|
||||
$mail->FromName = 'Example Mailer';
|
||||
|
||||
$mail->Subject = 'My subject';
|
||||
$mail->Body = 'Hello world';
|
||||
$mail->AddAddress('name@anydomain.com', 'First Last');
|
||||
|
||||
if (!$mail->Send())
|
||||
{
|
||||
echo $mail->ErrorInfo;
|
||||
}
|
||||
?>
|
||||
</pre>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows how to use POP-before-SMTP for authentication.
|
||||
* POP-before-SMTP is a very old technology that is hardly used any more.
|
||||
*/
|
||||
|
||||
//Import PHPMailer classes into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
use PHPMailer\PHPMailer\POP3;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Authenticate via POP3.
|
||||
//After this you should be allowed to submit messages over SMTP for a few minutes.
|
||||
//Only applies if your host supports POP-before-SMTP.
|
||||
$pop = POP3::popBeforeSmtp('pop3.example.com', 110, 30, 'username', 'password', 1);
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
//Passing true to the constructor enables the use of exceptions for error handling
|
||||
$mail = new PHPMailer(true);
|
||||
try {
|
||||
$mail->isSMTP();
|
||||
//Enable SMTP debugging
|
||||
//SMTP::DEBUG_OFF = off (for production use)
|
||||
//SMTP::DEBUG_CLIENT = client messages
|
||||
//SMTP::DEBUG_SERVER = client and server messages
|
||||
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
|
||||
//Set the hostname of the mail server
|
||||
$mail->Host = 'mail.example.com';
|
||||
//Set the SMTP port number - likely to be 25, 465 or 587
|
||||
$mail->Port = 25;
|
||||
//Whether to use SMTP authentication
|
||||
$mail->SMTPAuth = false;
|
||||
//Set who the message is to be sent from
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
//Set an alternative reply-to address
|
||||
$mail->addReplyTo('replyto@example.com', 'First Last');
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer POP-before-SMTP test';
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//and convert the HTML into a basic plain-text alternative body
|
||||
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
|
||||
//Replace the plain text body with one created manually
|
||||
$mail->AltBody = 'This is a plain-text message body';
|
||||
//Attach an image file
|
||||
$mail->addAttachment('images/phpmailer_mini.png');
|
||||
//send the message
|
||||
//Note that we don't need check the response from this because it will throw an exception if it has trouble
|
||||
$mail->send();
|
||||
echo 'Message sent!';
|
||||
} catch (Exception $e) {
|
||||
echo $e->errorMessage(); //Pretty error messages from PHPMailer
|
||||
} catch (\Exception $e) {
|
||||
echo $e->getMessage(); //Boring error messages from anything else!
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHPMailer simple file upload and send example.
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
$msg = '';
|
||||
if (array_key_exists('userfile', $_FILES)) {
|
||||
//First handle the upload
|
||||
//Don't trust provided filename - same goes for MIME types
|
||||
//See https://www.php.net/manual/en/features.file-upload.php#114004 for more thorough upload validation
|
||||
//Extract an extension from the provided filename
|
||||
$ext = PHPMailer::mb_pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);
|
||||
//Define a safe location to move the uploaded file to, preserving the extension
|
||||
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name'])) . '.' . $ext;
|
||||
|
||||
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
|
||||
//Upload handled successfully
|
||||
//Now create a message
|
||||
$mail = new PHPMailer();
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
$mail->Subject = 'PHPMailer file sender';
|
||||
$mail->Body = 'My message body';
|
||||
//Attach the uploaded file
|
||||
if (!$mail->addAttachment($uploadfile, 'My uploaded file')) {
|
||||
$msg .= 'Failed to attach file ' . $_FILES['userfile']['name'];
|
||||
}
|
||||
if (!$mail->send()) {
|
||||
$msg .= 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
$msg .= 'Message sent!';
|
||||
}
|
||||
} else {
|
||||
$msg .= 'Failed to move file to ' . $uploadfile;
|
||||
}
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>PHPMailer Upload</title>
|
||||
</head>
|
||||
<body>
|
||||
<?php if (empty($msg)) { ?>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="100000"> Send this file: <input name="userfile" type="file">
|
||||
<input type="submit" value="Send File">
|
||||
</form>
|
||||
<?php } else {
|
||||
echo htmlspecialchars($msg, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401);
|
||||
} ?>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHPMailer multiple files upload and send example
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
$msg = '';
|
||||
if (array_key_exists('userfile', $_FILES)) {
|
||||
//Create a message
|
||||
$mail = new PHPMailer();
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
$mail->Subject = 'PHPMailer file sender';
|
||||
$mail->Body = 'My message body';
|
||||
//Attach multiple files one by one
|
||||
for ($ct = 0, $ctMax = count($_FILES['userfile']['tmp_name']); $ct < $ctMax; $ct++) {
|
||||
//Extract an extension from the provided filename
|
||||
$ext = PHPMailer::mb_pathinfo($_FILES['userfile']['name'][$ct], PATHINFO_EXTENSION);
|
||||
//Define a safe location to move the uploaded file to, preserving the extension
|
||||
$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile']['name'][$ct])) . '.' . $ext;
|
||||
$filename = $_FILES['userfile']['name'][$ct];
|
||||
if (move_uploaded_file($_FILES['userfile']['tmp_name'][$ct], $uploadfile)) {
|
||||
if (!$mail->addAttachment($uploadfile, $filename)) {
|
||||
$msg .= 'Failed to attach file ' . $filename;
|
||||
}
|
||||
} else {
|
||||
$msg .= 'Failed to move file to ' . $uploadfile;
|
||||
}
|
||||
}
|
||||
if (!$mail->send()) {
|
||||
$msg .= 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
$msg .= 'Message sent!';
|
||||
}
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>PHPMailer Upload</title>
|
||||
</head>
|
||||
<body>
|
||||
<?php if (empty($msg)) { ?>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="100000">
|
||||
Select one or more files:
|
||||
<input name="userfile[]" type="file" multiple="multiple">
|
||||
<input type="submit" value="Send Files">
|
||||
</form>
|
||||
<?php } else {
|
||||
echo htmlspecialchars($msg, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401);
|
||||
} ?>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows sending a message using a local sendmail binary.
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
//Set PHPMailer to use the sendmail transport
|
||||
$mail->isSendmail();
|
||||
//Set who the message is to be sent from
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
//Set an alternative reply-to address
|
||||
$mail->addReplyTo('replyto@example.com', 'First Last');
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer sendmail test';
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//convert HTML into a basic plain-text alternative body
|
||||
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
|
||||
//Replace the plain text body with one created manually
|
||||
$mail->AltBody = 'This is a plain-text message body';
|
||||
//Attach an image file
|
||||
$mail->addAttachment('images/phpmailer_mini.png');
|
||||
|
||||
//send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
echo 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo 'Message sent!';
|
||||
}
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* The SendOauth2 wrapper supports OAuth2 and Basic authorization/authentication for
|
||||
* Microsoft 365 Exchange email and Google Gmail. Both TheLeague's Google provider + client
|
||||
* and Google's 'official' GoogleAPI client are supported. The wrapper supports any authentication
|
||||
* mechanism provided by these systems: authorization_code grant and client_credentials grant
|
||||
* (aka Google 'service accounts'), client secrets and X.509 certificates, $_SESSION 'state'
|
||||
* and PKCE code exchanges, and creation on the fly of GoogleAPI's .json credentials files.
|
||||
* Appropriate scopes (client permissions) and 'provider' overrides are added automatically.
|
||||
*
|
||||
* The wrapper is installed with Composer from the decomplexity/SendOauth2 repo; see its README.
|
||||
*
|
||||
* The wrapper can also be invoked using fewer (or even no) arguments; this is for those websites
|
||||
* that use PHPMailer in several places. See the repo for details.
|
||||
*/
|
||||
|
||||
// Import PHPMailer classes
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
// Import SendOauth2B class
|
||||
use decomplexity\SendOauth2\SendOauth2B;
|
||||
|
||||
// Uncomment the next two lines to display PHP errors
|
||||
// error_reporting(E_ALL);
|
||||
// ini_set("display_errors", 1);
|
||||
|
||||
// Load Composer's autoloader
|
||||
require 'vendor/autoload.php';
|
||||
|
||||
// Set timezone for SMTP
|
||||
date_default_timezone_set('Etc/UTC');
|
||||
|
||||
// Create an instance; passing `true` enables exceptions
|
||||
$mail = new PHPMailer(true);
|
||||
|
||||
try {
|
||||
// Server settings
|
||||
$mail->isSMTP(); // Use SMTP
|
||||
$mail->SMTPDebug = SMTP::DEBUG_OFF; // Set DEBUG_LOWLEVEL for SMTP diagnostics
|
||||
$mail->SMTPAuth = true; // Enable SMTP authentication
|
||||
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; // Enable implicit TLS encryption
|
||||
$mail->Port = 587; // TCP port; MSFT doesn't like 465
|
||||
$mail->AuthType = 'XOAUTH2'; // Set AuthType to use XOAUTH2 ('LOGIN' for Basic auth)
|
||||
|
||||
// Sender and recipients
|
||||
$mail->setFrom('from@example.com', 'Mailer'); // 'Header' From address with optional sender name
|
||||
$mail->addAddress('joe@example.net', 'Joe User'); // Add a To: recipient
|
||||
|
||||
/**
|
||||
* Authenticate
|
||||
* Note that any ClientCertificatePrivateKey should include the -----BEGIN PRIVATE KEY----- and
|
||||
* -----END PRIVATE KEY-----
|
||||
*/
|
||||
|
||||
$oauthTokenProvider = new SendOauth2B(
|
||||
[
|
||||
'mail' => $mail, // PHPMailer instance
|
||||
'clientId' => 'long string', // for Google service account, Unique ID
|
||||
'clientSecret' => 'long string', // or null if using a certificate
|
||||
'clientCertificatePrivateKey' => 'ultra long string', // or null if using a clientSecret
|
||||
'clientCertificateThumbprint' => 'long string', // or null if using a clientSecret
|
||||
'serviceProvider' => 'Microsoft', // literal: also 'Google' or 'GoogleAPI'
|
||||
'authTypeSetting' => $mail->AuthType, // is set above - or insert here as 'XOAUTH2'
|
||||
'mailSMTPAddress' => 'me@mydomain.com', // Envelope/mailFrom/reverse-path From address
|
||||
'refreshToken' => 'very long string', // null if grantType is 'client_credentials'
|
||||
'grantType' => 'authorization_code', // or 'client_credentials'
|
||||
|
||||
'tenant' => 'long string', // MSFT tenant GUID. Null for Gmail
|
||||
|
||||
'hostedDomain' => 'mydomain.com', // Any Google (and optional). Null for MSFT
|
||||
|
||||
'projectID' => 'string', // GoogleAPI only. Else null
|
||||
'serviceAccountName' => 'string', // GoogleAPI service account only. Else null
|
||||
'impersonate' => 'you@mydomain.com', // Google API service account only. Else null
|
||||
// default to 'mailSMTPAddress', must be
|
||||
// a Google Wspace email adddress, not @gmail
|
||||
'gmailXoauth2Credentials' => 'your credentials.json', // File name - defaults to:
|
||||
// gmail-xoauth2-credentials.json
|
||||
'writeGmailCredentialsFile' => 'yes' or 'no', // Defaults to 'yes'; meaning the
|
||||
// credentials json is dynamically created
|
||||
]
|
||||
);
|
||||
|
||||
|
||||
$mail->setOAuth($oauthTokenProvider); // Pass OAuthTokenProvider to PHPMailer
|
||||
$mail->Host = 'smtp.office365.com'; // Set SMTP server (smtp.gmail.com for Gmail)
|
||||
|
||||
// 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: ' . htmlspecialchars($mail->ErrorInfo, ENT_QUOTES);
|
||||
}
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHPMailer simple contact form example.
|
||||
* If you want to accept and send uploads in your form, look at the send_file_upload example.
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
if (array_key_exists('email', $_POST)) {
|
||||
$err = false;
|
||||
$msg = '';
|
||||
$email = '';
|
||||
//Apply some basic validation and filtering to the subject
|
||||
if (array_key_exists('subject', $_POST)) {
|
||||
$subject = substr(strip_tags($_POST['subject']), 0, 255);
|
||||
} else {
|
||||
$subject = 'No subject given';
|
||||
}
|
||||
//Apply some basic validation and filtering to the query
|
||||
if (array_key_exists('query', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$query = substr(strip_tags($_POST['query']), 0, 16384);
|
||||
} else {
|
||||
$query = '';
|
||||
$msg = 'No query provided!';
|
||||
$err = true;
|
||||
}
|
||||
//Apply some basic validation and filtering to the name
|
||||
if (array_key_exists('name', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$name = substr(strip_tags($_POST['name']), 0, 255);
|
||||
} else {
|
||||
$name = '';
|
||||
}
|
||||
//Validate to address
|
||||
//Never allow arbitrary input for the 'to' address as it will turn your form into a spam gateway!
|
||||
//Substitute appropriate addresses from your own domain, or simply use a single, fixed address
|
||||
if (array_key_exists('to', $_POST) && in_array($_POST['to'], ['sales', 'support', 'accounts'], true)) {
|
||||
$to = $_POST['to'] . '@example.com';
|
||||
} else {
|
||||
$to = 'support@example.com';
|
||||
}
|
||||
//Make sure the address they provided is valid before trying to use it
|
||||
if (PHPMailer::validateAddress($_POST['email'])) {
|
||||
$email = $_POST['email'];
|
||||
} else {
|
||||
$msg .= 'Error: invalid email address provided';
|
||||
$err = true;
|
||||
}
|
||||
if (!$err) {
|
||||
$mail = new PHPMailer();
|
||||
$mail->isSMTP();
|
||||
$mail->Host = 'localhost';
|
||||
$mail->Port = 25;
|
||||
$mail->CharSet = PHPMailer::CHARSET_UTF8;
|
||||
//It's important not to use the submitter's address as the from address as it's forgery,
|
||||
//which will cause your messages to fail SPF checks.
|
||||
//Use an address in your own domain as the from address, put the submitter's address in a reply-to
|
||||
$mail->setFrom('contact@example.com', (empty($name) ? 'Contact form' : $name));
|
||||
$mail->addAddress($to);
|
||||
$mail->addReplyTo($email, $name);
|
||||
$mail->Subject = 'Contact form: ' . $subject;
|
||||
$mail->Body = "Contact form submission\n\n" . $query;
|
||||
if (!$mail->send()) {
|
||||
$msg .= 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
$msg .= 'Message sent!';
|
||||
}
|
||||
}
|
||||
} ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<title>PHPMailer Contact Form</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Contact us</h1>
|
||||
<?php if (empty($msg)) { ?>
|
||||
<form method="post">
|
||||
<label for="to">Send to:</label>
|
||||
<select name="to" id="to">
|
||||
<option value="sales">Sales</option>
|
||||
<option value="support" selected="selected">Support</option>
|
||||
<option value="accounts">Accounts</option>
|
||||
</select><br>
|
||||
<label for="subject">Subject: <input type="text" name="subject" id="subject" maxlength="255"></label><br>
|
||||
<label for="name">Your name: <input type="text" name="name" id="name" maxlength="255"></label><br>
|
||||
<label for="email">Your email address: <input type="email" name="email" id="email" maxlength="255"></label><br>
|
||||
<label for="query">Your question:</label><br>
|
||||
<textarea cols="30" rows="8" name="query" id="query" placeholder="Your question"></textarea><br>
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
<?php } else {
|
||||
echo $msg;
|
||||
} ?>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This PHPMailer example shows S/MIME signing a message and then sending.
|
||||
*
|
||||
* Before you can sign the mail certificates are needed.
|
||||
*
|
||||
*
|
||||
* STEP 1 - Creating a certificate:
|
||||
* You can either use a self-signed certificate, pay for a signed one,
|
||||
* or use free alternatives such as StartSSL, Comodo etc.
|
||||
* Check out this link for more providers: https://kb.mozillazine.org/Getting_an_SMIME_certificate
|
||||
* In this example I am using Comodo.
|
||||
* The form is directly available via https://secure.comodo.com/products/frontpage?area=SecureEmailCertificate
|
||||
* Fill it out and you'll get an email with a link to download your certificate.
|
||||
* Usually the certificate will be directly installed into your browser (FireFox/Chrome).
|
||||
*
|
||||
*
|
||||
* STEP 2 - Exporting the certificate
|
||||
* This is specific to your browser, however, most browsers will give you the option
|
||||
* to export your recently added certificate in PKCS12 (.pfx)
|
||||
* Include your private key if you are asked for it.
|
||||
* Set up a password to protect your exported file.
|
||||
*
|
||||
* STEP 3 - Splitting the .pfx into a private key and the certificate.
|
||||
* I use openssl for this. You only need two commands. In my case the certificate file is called 'exported-cert.pfx'
|
||||
* To create the private key do the following:
|
||||
*
|
||||
* openssl pkcs12 -in exported-cert.pfx -nocerts -out cert.key
|
||||
*
|
||||
* Of course the way you name your file (-out) is up to you.
|
||||
* You will be asked for a password for the Import password. This is the password you
|
||||
* set while exporting the certificate into the pfx file.
|
||||
* Afterwards, you can password protect your private key (recommended)
|
||||
* Also make sure to set the permissions to a minimum level and suitable for your application.
|
||||
* To create the certificate file use the following command:
|
||||
*
|
||||
* openssl pkcs12 -in exported-cert.pfx -clcerts -nokeys -out cert.crt
|
||||
*
|
||||
* Again, the way you name your certificate is up to you. You will be also asked for the Import Password.
|
||||
* To create the certificate-chain file use the following command:
|
||||
*
|
||||
* openssl pkcs12 -in exported-cert.pfx -cacerts -out certchain.pem
|
||||
*
|
||||
* Again, the way you name your chain file is up to you. You will be also asked for the Import Password.
|
||||
*
|
||||
*
|
||||
* STEP 3 - Code
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
//Set who the message is to be sent from
|
||||
//IMPORTANT: This must match the email address of your certificate.
|
||||
//Although the certificate will be valid, an error will be thrown since it cannot be verified
|
||||
//that the sender and the signer are the same person.
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
//Set an alternative reply-to address
|
||||
$mail->addReplyTo('replyto@example.com', 'First Last');
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer mail() test';
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//Convert HTML into a basic plain-text alternative body
|
||||
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
|
||||
//Replace the plain text body with one created manually
|
||||
$mail->AltBody = 'This is a plain-text message body';
|
||||
//Attach an image file
|
||||
$mail->addAttachment('images/phpmailer_mini.png');
|
||||
|
||||
//Configure message signing (the actual signing does not occur until sending)
|
||||
$mail->sign(
|
||||
'/path/to/cert.crt', //The location of your certificate file
|
||||
'/path/to/cert.key', //The location of your private key file
|
||||
//The password you protected your private key with (not the Import Password!
|
||||
//May be empty but the parameter must not be omitted!
|
||||
'yourSecretPrivateKeyPassword',
|
||||
'/path/to/certchain.pem' //The location of your chain file
|
||||
);
|
||||
|
||||
//Send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
echo 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo 'Message sent!';
|
||||
}
|
||||
/*
|
||||
* REMARKS:
|
||||
* If your email client does not support S/MIME it will most likely just show an attachment smime.p7s,
|
||||
* which is the signature contained in the email.
|
||||
* Other clients, such as Thunderbird support S/MIME natively and will validate the signature
|
||||
* automatically and report the result in some way.
|
||||
*/
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows making an SMTP connection with authentication.
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
|
||||
//SMTP needs accurate times, and the PHP time zone MUST be set
|
||||
//This should be done in your php.ini, but this is how to do it if you don't have access to that
|
||||
date_default_timezone_set('Etc/UTC');
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
//Tell PHPMailer to use SMTP
|
||||
$mail->isSMTP();
|
||||
//Enable SMTP debugging
|
||||
//SMTP::DEBUG_OFF = off (for production use)
|
||||
//SMTP::DEBUG_CLIENT = client messages
|
||||
//SMTP::DEBUG_SERVER = client and server messages
|
||||
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
|
||||
//Set the hostname of the mail server
|
||||
$mail->Host = 'mail.example.com';
|
||||
//Set the SMTP port number - likely to be 25, 465 or 587
|
||||
$mail->Port = 25;
|
||||
//Whether to use SMTP authentication
|
||||
$mail->SMTPAuth = true;
|
||||
//Username to use for SMTP authentication
|
||||
$mail->Username = 'yourname@example.com';
|
||||
//Password to use for SMTP authentication
|
||||
$mail->Password = 'yourpassword';
|
||||
//Set who the message is to be sent from
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
//Set an alternative reply-to address
|
||||
$mail->addReplyTo('replyto@example.com', 'First Last');
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer SMTP test';
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//convert HTML into a basic plain-text alternative body
|
||||
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
|
||||
//Replace the plain text body with one created manually
|
||||
$mail->AltBody = 'This is a plain-text message body';
|
||||
//Attach an image file
|
||||
$mail->addAttachment('images/phpmailer_mini.png');
|
||||
|
||||
//SMTP XCLIENT attributes can be passed with setSMTPXclientAttribute method
|
||||
//$mail->setSMTPXclientAttribute('LOGIN', 'yourname@example.com');
|
||||
//$mail->setSMTPXclientAttribute('ADDR', '10.10.10.10');
|
||||
//$mail->setSMTPXclientAttribute('HELO', 'test.example.com');
|
||||
|
||||
//send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
echo 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo 'Message sent!';
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This uses the SMTP class alone to check that a connection can be made to an SMTP server,
|
||||
* authenticate, then disconnect
|
||||
*/
|
||||
|
||||
//Import the PHPMailer SMTP class into the global namespace
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//SMTP needs accurate times, and the PHP time zone MUST be set
|
||||
//This should be done in your php.ini, but this is how to do it if you don't have access to that
|
||||
date_default_timezone_set('Etc/UTC');
|
||||
|
||||
//Create a new SMTP instance
|
||||
$smtp = new SMTP();
|
||||
|
||||
//Enable connection-level debug output
|
||||
$smtp->do_debug = SMTP::DEBUG_CONNECTION;
|
||||
|
||||
try {
|
||||
//Connect to an SMTP server
|
||||
if (!$smtp->connect('mail.example.com', 25)) {
|
||||
throw new Exception('Connect failed');
|
||||
}
|
||||
//Say hello
|
||||
if (!$smtp->hello(gethostname())) {
|
||||
throw new Exception('EHLO failed: ' . $smtp->getError()['error']);
|
||||
}
|
||||
//Get the list of ESMTP services the server offers
|
||||
$e = $smtp->getServerExtList();
|
||||
//If server can do TLS encryption, use it
|
||||
if (is_array($e) && array_key_exists('STARTTLS', $e)) {
|
||||
$tlsok = $smtp->startTLS();
|
||||
if (!$tlsok) {
|
||||
throw new Exception('Failed to start encryption: ' . $smtp->getError()['error']);
|
||||
}
|
||||
//Repeat EHLO after STARTTLS
|
||||
if (!$smtp->hello(gethostname())) {
|
||||
throw new Exception('EHLO (2) failed: ' . $smtp->getError()['error']);
|
||||
}
|
||||
//Get new capabilities list, which will usually now include AUTH if it didn't before
|
||||
$e = $smtp->getServerExtList();
|
||||
}
|
||||
//If server supports authentication, do it (even if no encryption)
|
||||
if (is_array($e) && array_key_exists('AUTH', $e)) {
|
||||
if ($smtp->authenticate('username', 'password')) {
|
||||
echo 'Connected ok!';
|
||||
} else {
|
||||
throw new Exception('Authentication failed: ' . $smtp->getError()['error']);
|
||||
}
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
echo 'SMTP error: ' . $e->getMessage(), "\n";
|
||||
}
|
||||
//Whatever happened, close the connection.
|
||||
$smtp->quit();
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* SMTP low memory example.
|
||||
*/
|
||||
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
|
||||
/**
|
||||
* This class demonstrates sending an already-built RFC822 message via SMTP
|
||||
* by extending PHPMailer's SMTP class.
|
||||
* It uses less memory than PHPMailer's usual approach because it keeps
|
||||
* the message as a single string rather than splitting its lines into
|
||||
* an array, which can consume very large amounts of memory if you have
|
||||
* large attachments. The downside is that it's somewhat slower.
|
||||
* This is mainly of academic interest, but shows how you can change how
|
||||
* core classes work without having to alter the library itself.
|
||||
*/
|
||||
class SMTPLowMemory extends SMTP
|
||||
{
|
||||
public function data($msg_data)
|
||||
{
|
||||
//This will use the standard timelimit
|
||||
if (!$this->sendCommand('DATA', 'DATA', 354)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* The server is ready to accept data!
|
||||
* According to rfc821 we should not send more than 1000 characters on a single line (including the LE)
|
||||
* so we will break the data up into lines by \r and/or \n then if needed we will break each of those into
|
||||
* smaller lines to fit within the limit.
|
||||
* We will also look for lines that start with a '.' and prepend an additional '.' (which does not count
|
||||
* towards the line-length limit), in order to implement the "dot stuffing" required by RFC5321 sections:
|
||||
* https://datatracker.ietf.org/doc/html/rfc5321#section-4.5.2
|
||||
* https://datatracker.ietf.org/doc/html/rfc5321#section-4.5.3.1.6.
|
||||
*/
|
||||
|
||||
//Normalize line breaks
|
||||
$msg_data = str_replace(["\r\n", "\r"], "\n", $msg_data);
|
||||
|
||||
/* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
|
||||
* of the first line (':' separated) does not contain a space then it _should_ be a header and we will
|
||||
* process all lines before a blank line as headers.
|
||||
*/
|
||||
|
||||
$firstline = substr($msg_data, 0, strcspn($msg_data, "\n", 0));
|
||||
$field = substr($firstline, 0, strpos($firstline, ':'));
|
||||
$in_headers = false;
|
||||
if (!empty($field) && strpos($field, ' ') === false) {
|
||||
$in_headers = true;
|
||||
}
|
||||
|
||||
$offset = 0;
|
||||
$len = strlen($msg_data);
|
||||
while ($offset < $len) {
|
||||
//Get position of next line break
|
||||
$linelen = strcspn($msg_data, "\n", $offset);
|
||||
//Get the next line
|
||||
$line = substr($msg_data, $offset, $linelen);
|
||||
//Remember where we have got to
|
||||
$offset += ($linelen + 1);
|
||||
$lines_out = [];
|
||||
if ($in_headers && $line === '') {
|
||||
$in_headers = false;
|
||||
}
|
||||
//We need to break this line up into several smaller lines
|
||||
//This is a small micro-optimisation: isset($str[$len]) is equivalent to (strlen($str) > $len)
|
||||
while (isset($line[self::MAX_LINE_LENGTH])) {
|
||||
//Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on
|
||||
//so as to avoid breaking in the middle of a word
|
||||
$pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');
|
||||
//Deliberately matches both false and 0
|
||||
if (!$pos) {
|
||||
//No nice break found, add a hard break
|
||||
$pos = self::MAX_LINE_LENGTH - 1;
|
||||
$lines_out[] = substr($line, 0, $pos);
|
||||
$line = substr($line, $pos);
|
||||
} else {
|
||||
//Break at the found point
|
||||
$lines_out[] = substr($line, 0, $pos);
|
||||
//Move along by the amount we dealt with
|
||||
$line = substr($line, $pos + 1);
|
||||
}
|
||||
//If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1
|
||||
if ($in_headers) {
|
||||
$line = "\t" . $line;
|
||||
}
|
||||
}
|
||||
$lines_out[] = $line;
|
||||
|
||||
//Send the lines to the server
|
||||
foreach ($lines_out as $line_out) {
|
||||
//RFC2821 section 4.5.2
|
||||
if (!empty($line_out) && $line_out[0] === '.') {
|
||||
$line_out = '.' . $line_out;
|
||||
}
|
||||
$this->client_send($line_out . self::LE);
|
||||
}
|
||||
}
|
||||
|
||||
//Message data has been sent, complete the command
|
||||
//Increase timelimit for end of DATA command
|
||||
$savetimelimit = $this->Timelimit;
|
||||
$this->Timelimit *= 2;
|
||||
$result = $this->sendCommand('DATA END', '.', 250);
|
||||
//Restore timelimit
|
||||
$this->Timelimit = $savetimelimit;
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
//To make PHPMailer use our custom SMTP class, we need to give it an instance
|
||||
$mail = new PHPMailer(true);
|
||||
$mail->setSMTPInstance(new SMTPLowMemory());
|
||||
//Now carry on as normal
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows making an SMTP connection without using authentication.
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
|
||||
//SMTP needs accurate times, and the PHP time zone MUST be set
|
||||
//This should be done in your php.ini, but this is how to do it if you don't have access to that
|
||||
date_default_timezone_set('Etc/UTC');
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
//Tell PHPMailer to use SMTP
|
||||
$mail->isSMTP();
|
||||
//Enable SMTP debugging
|
||||
//SMTP::DEBUG_OFF = off (for production use)
|
||||
//SMTP::DEBUG_CLIENT = client messages
|
||||
//SMTP::DEBUG_SERVER = client and server messages
|
||||
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
|
||||
//Set the hostname of the mail server
|
||||
$mail->Host = 'mail.example.com';
|
||||
//Set the SMTP port number - likely to be 25, 465 or 587
|
||||
$mail->Port = 25;
|
||||
//We don't need to set this as it's the default value
|
||||
//$mail->SMTPAuth = false;
|
||||
//Set who the message is to be sent from
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
//Set an alternative reply-to address
|
||||
$mail->addReplyTo('replyto@example.com', 'First Last');
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer SMTP without auth test';
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//convert HTML into a basic plain-text alternative body
|
||||
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
|
||||
//Replace the plain text body with one created manually
|
||||
$mail->AltBody = 'This is a plain-text message body';
|
||||
//Attach an image file
|
||||
$mail->addAttachment('images/phpmailer_mini.png');
|
||||
|
||||
//send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
echo 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo 'Message sent!';
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* This example shows settings to use when sending over SMTP with TLS and custom connection options.
|
||||
*/
|
||||
|
||||
//Import the PHPMailer class into the global namespace
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
|
||||
//SMTP needs accurate times, and the PHP time zone MUST be set
|
||||
//This should be done in your php.ini, but this is how to do it if you don't have access to that
|
||||
date_default_timezone_set('Etc/UTC');
|
||||
|
||||
require '../vendor/autoload.php';
|
||||
|
||||
//Create a new PHPMailer instance
|
||||
$mail = new PHPMailer();
|
||||
|
||||
//Tell PHPMailer to use SMTP
|
||||
$mail->isSMTP();
|
||||
|
||||
//Enable SMTP debugging
|
||||
//SMTP::DEBUG_OFF = off (for production use)
|
||||
//SMTP::DEBUG_CLIENT = client messages
|
||||
//SMTP::DEBUG_SERVER = client and server messages
|
||||
$mail->SMTPDebug = SMTP::DEBUG_CONNECTION;
|
||||
|
||||
//Set the hostname of the mail server
|
||||
$mail->Host = 'smtp.example.com';
|
||||
|
||||
//Set the SMTP port number:
|
||||
// - 465 for SMTP with implicit TLS, a.k.a. RFC8314 SMTPS or
|
||||
// - 587 for SMTP+STARTTLS
|
||||
$mail->Port = 465;
|
||||
|
||||
//Set the encryption mechanism to use:
|
||||
// - SMTPS (implicit TLS on port 465) or
|
||||
// - STARTTLS (explicit TLS on port 587)
|
||||
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
|
||||
|
||||
//Custom connection options
|
||||
//Note that these settings are INSECURE
|
||||
$mail->SMTPOptions = array(
|
||||
'ssl' => [
|
||||
'verify_peer' => true,
|
||||
'verify_depth' => 3,
|
||||
'allow_self_signed' => true,
|
||||
'peer_name' => 'smtp.example.com',
|
||||
'cafile' => '/etc/ssl/ca_cert.pem',
|
||||
],
|
||||
);
|
||||
|
||||
//Whether to use SMTP authentication
|
||||
$mail->SMTPAuth = true;
|
||||
|
||||
//Username to use for SMTP authentication - use full email address for gmail
|
||||
$mail->Username = 'username@example.com';
|
||||
|
||||
//Password to use for SMTP authentication
|
||||
$mail->Password = 'yourpassword';
|
||||
|
||||
//Set who the message is to be sent from
|
||||
$mail->setFrom('from@example.com', 'First Last');
|
||||
|
||||
//Set who the message is to be sent to
|
||||
$mail->addAddress('whoto@example.com', 'John Doe');
|
||||
|
||||
//Set the subject line
|
||||
$mail->Subject = 'PHPMailer SMTP options test';
|
||||
|
||||
//Read an HTML message body from an external file, convert referenced images to embedded,
|
||||
//convert HTML into a basic plain-text alternative body
|
||||
$mail->msgHTML(file_get_contents('contents.html'), __DIR__);
|
||||
|
||||
//Send the message, check for errors
|
||||
if (!$mail->send()) {
|
||||
echo 'Mailer Error: ' . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo 'Message sent!';
|
||||
}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
<?php
|
||||
|
||||
include_once('../class.phpmailer.php');
|
||||
|
||||
$mail = new PHPMailer();
|
||||
|
||||
$body = $mail->getFile('contents.html');
|
||||
|
||||
$body = eregi_replace("[\]",'',$body);
|
||||
$subject = eregi_replace("[\]",'',$subject);
|
||||
|
||||
$mail->From = "name@yourdomain.com";
|
||||
$mail->FromName = "First Last";
|
||||
|
||||
$mail->Subject = "PHPMailer Test Subject";
|
||||
|
||||
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
|
||||
|
||||
$mail->MsgHTML($body);
|
||||
|
||||
$mail->AddAddress("whoto@otherdomain.com", "John Doe");
|
||||
|
||||
if(!$mail->Send()) {
|
||||
echo 'Failed to send mail';
|
||||
} else {
|
||||
echo 'Mail sent';
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
<?php
|
||||
|
||||
//error_reporting(E_ALL);
|
||||
error_reporting(E_STRICT);
|
||||
|
||||
date_default_timezone_set('America/Toronto');
|
||||
|
||||
include("class.phpmailer.php");
|
||||
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded
|
||||
|
||||
$mail = new PHPMailer();
|
||||
|
||||
$body = $mail->getFile('contents.html');
|
||||
$body = eregi_replace("[\]",'',$body);
|
||||
|
||||
$mail->IsSMTP();
|
||||
$mail->SMTPAuth = true; // enable SMTP authentication
|
||||
$mail->SMTPSecure = "ssl"; // sets the prefix to the servier
|
||||
$mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server
|
||||
$mail->Port = 465; // set the SMTP port for the GMAIL server
|
||||
|
||||
$mail->Username = "yourusername@gmail.com"; // GMAIL username
|
||||
$mail->Password = "yourpassword"; // GMAIL password
|
||||
|
||||
$mail->AddReplyTo("yourusername@gmail.com","First Last");
|
||||
|
||||
$mail->From = "name@yourdomain.com";
|
||||
$mail->FromName = "First Last";
|
||||
|
||||
$mail->Subject = "PHPMailer Test Subject via gmail";
|
||||
|
||||
//$mail->Body = "Hi,<br>This is the HTML BODY<br>"; //HTML Body
|
||||
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
|
||||
$mail->WordWrap = 50; // set word wrap
|
||||
|
||||
$mail->MsgHTML($body);
|
||||
|
||||
$mail->AddAddress("whoto@otherdomain.com", "John Doe");
|
||||
|
||||
$mail->AddAttachment("images/phpmailer.gif"); // attachment
|
||||
|
||||
$mail->IsHTML(true); // send as HTML
|
||||
|
||||
if(!$mail->Send()) {
|
||||
echo "Mailer Error: " . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo "Message sent!";
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
<?php
|
||||
|
||||
include_once('../class.phpmailer.php');
|
||||
|
||||
$mail = new PHPMailer(); // defaults to using php "mail()"
|
||||
|
||||
$body = $mail->getFile('contents.html');
|
||||
$body = eregi_replace("[\]",'',$body);
|
||||
|
||||
$mail->From = "name@yourdomain.com";
|
||||
$mail->FromName = "First Last";
|
||||
|
||||
$mail->Subject = "PHPMailer Test Subject via mail()";
|
||||
|
||||
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
|
||||
|
||||
$mail->MsgHTML($body);
|
||||
|
||||
$mail->AddAddress("whoto@otherdomain.com", "John Doe");
|
||||
|
||||
$mail->AddAttachment("images/phpmailer.gif"); // attachment
|
||||
|
||||
if(!$mail->Send()) {
|
||||
echo "Mailer Error: " . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo "Message sent!";
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
<?php
|
||||
|
||||
//error_reporting(E_ALL);
|
||||
error_reporting(E_STRICT);
|
||||
|
||||
|
||||
date_default_timezone_set('America/Toronto');
|
||||
//date_default_timezone_set(date_default_timezone_get());
|
||||
|
||||
include_once('class.phpmailer.php');
|
||||
|
||||
$mail = new PHPMailer();
|
||||
$body = $mail->getFile('contents.html');
|
||||
$body = eregi_replace("[\]",'',$body);
|
||||
|
||||
$mail->IsSendmail(); // telling the class to use SendMail transport
|
||||
|
||||
$mail->From = "name@yourdomain.com";
|
||||
$mail->FromName = "First Last";
|
||||
|
||||
$mail->Subject = "PHPMailer Test Subject via smtp";
|
||||
|
||||
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
|
||||
|
||||
$mail->MsgHTML($body);
|
||||
|
||||
$mail->AddAddress("whoto@otherdomain.com", "John Doe");
|
||||
|
||||
$mail->AddAttachment("images/phpmailer.gif"); // attachment
|
||||
|
||||
if(!$mail->Send()) {
|
||||
echo "Mailer Error: " . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo "Message sent!";
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
<?php
|
||||
|
||||
//error_reporting(E_ALL);
|
||||
error_reporting(E_STRICT);
|
||||
|
||||
date_default_timezone_set('America/Toronto');
|
||||
//date_default_timezone_set(date_default_timezone_get());
|
||||
|
||||
include_once('class.phpmailer.php');
|
||||
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded
|
||||
|
||||
$mail = new PHPMailer();
|
||||
|
||||
$body = $mail->getFile('contents.html');
|
||||
$body = eregi_replace("[\]",'',$body);
|
||||
|
||||
$mail->IsSMTP(); // telling the class to use SMTP
|
||||
$mail->Host = "mail.worxteam.com"; // SMTP server
|
||||
|
||||
$mail->From = "name@yourdomain.com";
|
||||
$mail->FromName = "First Last";
|
||||
|
||||
$mail->Subject = "PHPMailer Test Subject via smtp";
|
||||
|
||||
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
|
||||
|
||||
$mail->MsgHTML($body);
|
||||
|
||||
$mail->AddAddress("whoto@otherdomain.com", "John Doe");
|
||||
|
||||
$mail->AddAttachment("images/phpmailer.gif"); // attachment
|
||||
|
||||
if(!$mail->Send()) {
|
||||
echo "Mailer Error: " . $mail->ErrorInfo;
|
||||
} else {
|
||||
echo "Message sent!";
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1,182 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHPMailer - PHP email creation and transport class.
|
||||
* PHP Version 5.5
|
||||
* @package PHPMailer
|
||||
* @see https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
|
||||
* @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
|
||||
* @author Jim Jagielski (jimjag) <jimjag@gmail.com>
|
||||
* @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
|
||||
* @author Brent R. Matzelle (original founder)
|
||||
* @copyright 2012 - 2020 Marcus Bointon
|
||||
* @copyright 2010 - 2012 Jim Jagielski
|
||||
* @copyright 2004 - 2009 Andy Prevost
|
||||
* @license https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html GNU Lesser General Public License
|
||||
* @note This program is distributed in the hope that it will be useful - WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get an OAuth2 token from an OAuth2 provider.
|
||||
* * Install this script on your server so that it's accessible
|
||||
* as [https/http]://<yourdomain>/<folder>/get_oauth_token.php
|
||||
* e.g.: http://localhost/phpmailer/get_oauth_token.php
|
||||
* * Ensure dependencies are installed with 'composer install'
|
||||
* * Set up an app in your Google/Yahoo/Microsoft account
|
||||
* * Set the script address as the app's redirect URL
|
||||
* If no refresh token is obtained when running this file,
|
||||
* revoke access to your app and run the script again.
|
||||
*/
|
||||
|
||||
namespace PHPMailer\PHPMailer;
|
||||
|
||||
/**
|
||||
* Aliases for League Provider Classes
|
||||
* Make sure you have added these to your composer.json and run `composer install`
|
||||
* Plenty to choose from here:
|
||||
* @see https://oauth2-client.thephpleague.com/providers/thirdparty/
|
||||
*/
|
||||
//@see https://github.com/thephpleague/oauth2-google
|
||||
use League\OAuth2\Client\Provider\Google;
|
||||
//@see https://packagist.org/packages/hayageek/oauth2-yahoo
|
||||
use Hayageek\OAuth2\Client\Provider\Yahoo;
|
||||
//@see https://github.com/stevenmaguire/oauth2-microsoft
|
||||
use Stevenmaguire\OAuth2\Client\Provider\Microsoft;
|
||||
//@see https://github.com/greew/oauth2-azure-provider
|
||||
use Greew\OAuth2\Client\Provider\Azure;
|
||||
|
||||
if (!isset($_GET['code']) && !isset($_POST['provider'])) {
|
||||
?>
|
||||
<html>
|
||||
<body>
|
||||
<form method="post">
|
||||
<h1>Select Provider</h1>
|
||||
<input type="radio" name="provider" value="Google" id="providerGoogle">
|
||||
<label for="providerGoogle">Google</label><br>
|
||||
<input type="radio" name="provider" value="Yahoo" id="providerYahoo">
|
||||
<label for="providerYahoo">Yahoo</label><br>
|
||||
<input type="radio" name="provider" value="Microsoft" id="providerMicrosoft">
|
||||
<label for="providerMicrosoft">Microsoft</label><br>
|
||||
<input type="radio" name="provider" value="Azure" id="providerAzure">
|
||||
<label for="providerAzure">Azure</label><br>
|
||||
<h1>Enter id and secret</h1>
|
||||
<p>These details are obtained by setting up an app in your provider's developer console.
|
||||
</p>
|
||||
<p>ClientId: <input type="text" name="clientId"><p>
|
||||
<p>ClientSecret: <input type="text" name="clientSecret"></p>
|
||||
<p>TenantID (only relevant for Azure): <input type="text" name="tenantId"></p>
|
||||
<input type="submit" value="Continue">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
exit;
|
||||
}
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
|
||||
session_start();
|
||||
|
||||
$providerName = '';
|
||||
$clientId = '';
|
||||
$clientSecret = '';
|
||||
$tenantId = '';
|
||||
|
||||
if (array_key_exists('provider', $_POST)) {
|
||||
$providerName = $_POST['provider'];
|
||||
$clientId = $_POST['clientId'];
|
||||
$clientSecret = $_POST['clientSecret'];
|
||||
$tenantId = $_POST['tenantId'];
|
||||
$_SESSION['provider'] = $providerName;
|
||||
$_SESSION['clientId'] = $clientId;
|
||||
$_SESSION['clientSecret'] = $clientSecret;
|
||||
$_SESSION['tenantId'] = $tenantId;
|
||||
} elseif (array_key_exists('provider', $_SESSION)) {
|
||||
$providerName = $_SESSION['provider'];
|
||||
$clientId = $_SESSION['clientId'];
|
||||
$clientSecret = $_SESSION['clientSecret'];
|
||||
$tenantId = $_SESSION['tenantId'];
|
||||
}
|
||||
|
||||
//If you don't want to use the built-in form, set your client id and secret here
|
||||
//$clientId = 'RANDOMCHARS-----duv1n2.apps.googleusercontent.com';
|
||||
//$clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';
|
||||
|
||||
//If this automatic URL doesn't work, set it yourself manually to the URL of this script
|
||||
$redirectUri = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
|
||||
//$redirectUri = 'http://localhost/PHPMailer/redirect';
|
||||
|
||||
$params = [
|
||||
'clientId' => $clientId,
|
||||
'clientSecret' => $clientSecret,
|
||||
'redirectUri' => $redirectUri,
|
||||
'accessType' => 'offline'
|
||||
];
|
||||
|
||||
$options = [];
|
||||
$provider = null;
|
||||
|
||||
switch ($providerName) {
|
||||
case 'Google':
|
||||
$provider = new Google($params);
|
||||
$options = [
|
||||
'scope' => [
|
||||
'https://mail.google.com/'
|
||||
]
|
||||
];
|
||||
break;
|
||||
case 'Yahoo':
|
||||
$provider = new Yahoo($params);
|
||||
break;
|
||||
case 'Microsoft':
|
||||
$provider = new Microsoft($params);
|
||||
$options = [
|
||||
'scope' => [
|
||||
'wl.imap',
|
||||
'wl.offline_access'
|
||||
]
|
||||
];
|
||||
break;
|
||||
case 'Azure':
|
||||
$params['tenantId'] = $tenantId;
|
||||
|
||||
$provider = new Azure($params);
|
||||
$options = [
|
||||
'scope' => [
|
||||
'https://outlook.office.com/SMTP.Send',
|
||||
'offline_access'
|
||||
]
|
||||
];
|
||||
break;
|
||||
}
|
||||
|
||||
if (null === $provider) {
|
||||
exit('Provider missing');
|
||||
}
|
||||
|
||||
if (!isset($_GET['code'])) {
|
||||
//If we don't have an authorization code then get one
|
||||
$authUrl = $provider->getAuthorizationUrl($options);
|
||||
$_SESSION['oauth2state'] = $provider->getState();
|
||||
header('Location: ' . $authUrl);
|
||||
exit;
|
||||
//Check given state against previously stored one to mitigate CSRF attack
|
||||
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
|
||||
unset($_SESSION['oauth2state']);
|
||||
unset($_SESSION['provider']);
|
||||
exit('Invalid state');
|
||||
} else {
|
||||
unset($_SESSION['provider']);
|
||||
//Try to get an access token (using the authorization code grant)
|
||||
$token = $provider->getAccessToken(
|
||||
'authorization_code',
|
||||
[
|
||||
'code' => $_GET['code']
|
||||
]
|
||||
);
|
||||
//Use this to interact with an API on the users behalf
|
||||
//Use this to get a new access token if the old one expires
|
||||
echo 'Refresh Token: ', htmlspecialchars($token->getRefreshToken(), ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401);
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Afrikaans PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP-fout: kon nie geverifieer word nie.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP-fout: kon nie aan SMTP-verbind nie.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP-fout: data nie aanvaar nie.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Boodskapliggaam leeg.';
|
||||
$PHPMAILER_LANG['encoding'] = 'Onbekende kodering: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Kon nie uitvoer nie: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Kon nie lêer oopmaak nie: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Lêerfout: Kon nie lêer oopmaak nie: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Die volgende Van adres misluk: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Kon nie posfunksie instansieer nie.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Ongeldige adres: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer word nie ondersteun nie.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'U moet ten minste een ontvanger e-pos adres verskaf.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP-fout: Die volgende ontvangers het misluk: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Ondertekening Fout: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP-verbinding () misluk.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'SMTP-bediener fout: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Kan nie veranderlike instel of herstel nie: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Uitbreiding ontbreek: ';
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Arabic PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author bahjat al mostafa <bahjat983@hotmail.com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'خطأ SMTP : لا يمكن تأكيد الهوية.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'خطأ SMTP: لا يمكن الاتصال بالخادم SMTP.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'خطأ SMTP: لم يتم قبول المعلومات .';
|
||||
$PHPMAILER_LANG['empty_message'] = 'نص الرسالة فارغ';
|
||||
$PHPMAILER_LANG['encoding'] = 'ترميز غير معروف: ';
|
||||
$PHPMAILER_LANG['execute'] = 'لا يمكن تنفيذ : ';
|
||||
$PHPMAILER_LANG['file_access'] = 'لا يمكن الوصول للملف: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'خطأ في الملف: لا يمكن فتحه: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'خطأ على مستوى عنوان المرسل : ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'لا يمكن توفير خدمة البريد.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'الإرسال غير ممكن لأن عنوان البريد الإلكتروني غير صالح: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' برنامج الإرسال غير مدعوم.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'يجب توفير عنوان البريد الإلكتروني لمستلم واحد على الأقل.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'خطأ SMTP: الأخطاء التالية فشل في الارسال لكل من : ';
|
||||
$PHPMAILER_LANG['signing'] = 'خطأ في التوقيع: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() غير ممكن.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'خطأ على مستوى الخادم SMTP: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'لا يمكن تعيين أو إعادة تعيين متغير: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'الإضافة غير موجودة: ';
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Assamese PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Manish Sarkar <manish.n.manish@gmail.com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP ত্ৰুটি: প্ৰমাণীকৰণ কৰিব নোৱাৰি';
|
||||
$PHPMAILER_LANG['buggy_php'] = 'আপোনাৰ PHP সংস্কৰণ এটা বাগৰ দ্বাৰা প্ৰভাৱিত হয় যাৰ ফলত নষ্ট বাৰ্তা হব পাৰে । ইয়াক সমাধান কৰিবলে, প্ৰেৰণ কৰিবলে SMTP ব্যৱহাৰ কৰক, আপোনাৰ php.ini ত mail.add_x_header বিকল্প নিষ্ক্ৰিয় কৰক, MacOS বা Linux লৈ সলনি কৰক, বা আপোনাৰ PHP সংস্কৰণ 7.0.17+ বা 7.1.3+ লৈ সলনি কৰক ।';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP ত্ৰুটি: SMTP চাৰ্ভাৰৰ সৈতে সংযোগ কৰিবলে অক্ষম';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP ত্ৰুটি: তথ্য গ্ৰহণ কৰা হোৱা নাই';
|
||||
$PHPMAILER_LANG['empty_message'] = 'বাৰ্তাৰ মূখ্য অংশ খালী।';
|
||||
$PHPMAILER_LANG['encoding'] = 'অজ্ঞাত এনকোডিং: ';
|
||||
$PHPMAILER_LANG['execute'] = 'এক্সিকিউট কৰিব নোৱাৰি: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'সম্প্ৰসাৰণ নোহোৱা হৈছে: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'ফাইল অভিগম কৰিবলে অক্ষম: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'ফাইল ত্ৰুটি: ফাইল খোলিবলৈ অক্ষম: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'নিম্নলিখিত প্ৰেৰকৰ ঠিকনা(সমূহ) ব্যৰ্থ: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'মেইল ফাংচনৰ এটা উদাহৰণ সৃষ্টি কৰিবলে অক্ষম';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'প্ৰেৰণ কৰিব নোৱাৰি: অবৈধ ইমেইল ঠিকনা: ';
|
||||
$PHPMAILER_LANG['invalid_header'] = 'অবৈধ হেডাৰৰ নাম বা মান';
|
||||
$PHPMAILER_LANG['invalid_hostentry'] = 'অবৈধ হোষ্টেন্ট্ৰি: ';
|
||||
$PHPMAILER_LANG['invalid_host'] = 'অবৈধ হস্ট:';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = 'মেইলাৰ সমৰ্থিত নহয়।';
|
||||
$PHPMAILER_LANG['provide_address'] = 'আপুনি অন্ততঃ এটা গন্তব্য ইমেইল ঠিকনা দিব লাগিব';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP ত্ৰুটি: নিম্নলিখিত গন্তব্যস্থানসমূহ ব্যৰ্থ: ';
|
||||
$PHPMAILER_LANG['signing'] = 'স্বাক্ষৰ কৰাত ব্যৰ্থ: ';
|
||||
$PHPMAILER_LANG['smtp_code'] = 'SMTP কড: ';
|
||||
$PHPMAILER_LANG['smtp_code_ex'] = 'অতিৰিক্ত SMTP তথ্য: ';
|
||||
$PHPMAILER_LANG['smtp_detail'] = 'বিৱৰণ:';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP সংযোগ() ব্যৰ্থ';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'SMTP চাৰ্ভাৰৰ ত্ৰুটি: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'চলক নিৰ্ধাৰণ কৰিব পৰা নগল: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'অনুপস্থিত সম্প্ৰসাৰণ: ';
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Azerbaijani PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author @mirjalal
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP xətası: Giriş uğursuz oldu.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP xətası: SMTP serverinə qoşulma uğursuz oldu.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP xətası: Verilənlər qəbul edilməyib.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Boş mesaj göndərilə bilməz.';
|
||||
$PHPMAILER_LANG['encoding'] = 'Qeyri-müəyyən kodlaşdırma: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Əmr yerinə yetirilmədi: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Fayla giriş yoxdur: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Fayl xətası: Fayl açıla bilmədi: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Göstərilən poçtlara göndərmə uğursuz oldu: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Mail funksiyası işə salına bilmədi.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Düzgün olmayan e-mail adresi: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' - e-mail kitabxanası dəstəklənmir.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Ən azı bir e-mail adresi daxil edilməlidir.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP xətası: Aşağıdakı ünvanlar üzrə alıcılara göndərmə uğursuzdur: ';
|
||||
$PHPMAILER_LANG['signing'] = 'İmzalama xətası: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP serverinə qoşulma uğursuz oldu.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'SMTP serveri xətası: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Dəyişənin quraşdırılması uğursuz oldu: ';
|
||||
//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: ';
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Bosnian PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Ermin Islamagić <ermin@islamagic.com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP Greška: Neuspjela prijava.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP Greška: Nije moguće spojiti se sa SMTP serverom.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Greška: Podatci nisu prihvaćeni.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Sadržaj poruke je prazan.';
|
||||
$PHPMAILER_LANG['encoding'] = 'Nepoznata kriptografija: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Nije moguće izvršiti naredbu: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Nije moguće pristupiti datoteci: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Nije moguće otvoriti datoteku: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'SMTP Greška: Slanje sa navedenih e-mail adresa nije uspjelo: ';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP Greška: Slanje na navedene e-mail adrese nije uspjelo: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Ne mogu pokrenuti mail funkcionalnost.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'E-mail nije poslan. Neispravna e-mail adresa: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nije podržan.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Definišite barem jednu adresu primaoca.';
|
||||
$PHPMAILER_LANG['signing'] = 'Greška prilikom prijave: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'Spajanje na SMTP server nije uspjelo.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'SMTP greška: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Nije moguće postaviti varijablu ili je vratiti nazad: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Nedostaje ekstenzija: ';
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Belarusian PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Aleksander Maksymiuk <info@setpro.pl>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'Памылка SMTP: памылка ідэнтыфікацыі.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'Памылка SMTP: нельга ўстанавіць сувязь з SMTP-серверам.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'Памылка SMTP: звесткі непрынятыя.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Пустое паведамленне.';
|
||||
$PHPMAILER_LANG['encoding'] = 'Невядомая кадыроўка тэксту: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Нельга выканаць каманду: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Няма доступу да файла: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Нельга адкрыць файл: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Няправільны адрас адпраўніка: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Нельга прымяніць функцыю mail().';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Нельга даслаць паведамленне, няправільны email атрымальніка: ';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Запоўніце, калі ласка, правільны email атрымальніка.';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' - паштовы сервер не падтрымліваецца.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'Памылка SMTP: няправільныя атрымальнікі: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Памылка подпісу паведамлення: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'Памылка сувязі з SMTP-серверам.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Памылка SMTP: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Нельга ўстанавіць або перамяніць значэнне пераменнай: ';
|
||||
//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: ';
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Bulgarian PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Mikhail Kyosev <mialygk@gmail.com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP грешка: Не може да се удостовери пред сървъра.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP грешка: Не може да се свърже с SMTP хоста.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP грешка: данните не са приети.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Съдържанието на съобщението е празно';
|
||||
$PHPMAILER_LANG['encoding'] = 'Неизвестно кодиране: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Не може да се изпълни: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Няма достъп до файл: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Файлова грешка: Не може да се отвори файл: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Следните адреси за подател са невалидни: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Не може да се инстанцира функцията mail.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Невалиден адрес: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' - пощенски сървър не се поддържа.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Трябва да предоставите поне един email адрес за получател.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP грешка: Следните адреси за Получател са невалидни: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Грешка при подписване: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP провален connect().';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'SMTP сървърна грешка: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Не може да се установи или възстанови променлива: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Липсва разширение: ';
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Bengali PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Manish Sarkar <manish.n.manish@gmail.com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP ত্রুটি: প্রমাণীকরণ করতে অক্ষম৷';
|
||||
$PHPMAILER_LANG['buggy_php'] = 'আপনার PHP সংস্করণ একটি বাগ দ্বারা প্রভাবিত হয় যার ফলে দূষিত বার্তা হতে পারে। এটি ঠিক করতে, পাঠাতে SMTP ব্যবহার করুন, আপনার php.ini এ mail.add_x_header বিকল্পটি নিষ্ক্রিয় করুন, MacOS বা Linux-এ স্যুইচ করুন, অথবা আপনার PHP সংস্করণকে 7.0.17+ বা 7.1.3+ এ পরিবর্তন করুন।';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP ত্রুটি: SMTP সার্ভারের সাথে সংযোগ করতে অক্ষম৷';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP ত্রুটি: ডেটা গ্রহণ করা হয়নি৷';
|
||||
$PHPMAILER_LANG['empty_message'] = 'বার্তার অংশটি খালি।';
|
||||
$PHPMAILER_LANG['encoding'] = 'অজানা এনকোডিং: ';
|
||||
$PHPMAILER_LANG['execute'] = 'নির্বাহ করতে অক্ষম: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'এক্সটেনশন অনুপস্থিত:';
|
||||
$PHPMAILER_LANG['file_access'] = 'ফাইল অ্যাক্সেস করতে অক্ষম: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'ফাইল ত্রুটি: ফাইল খুলতে অক্ষম: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'নিম্নলিখিত প্রেরকের ঠিকানা(গুলি) ব্যর্থ হয়েছে: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'মেল ফাংশনের একটি উদাহরণ তৈরি করতে অক্ষম৷';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'পাঠাতে অক্ষম: অবৈধ ইমেল ঠিকানা: ';
|
||||
$PHPMAILER_LANG['invalid_header'] = 'অবৈধ হেডার নাম বা মান';
|
||||
$PHPMAILER_LANG['invalid_hostentry'] = 'অবৈধ হোস্টেন্ট্রি: ';
|
||||
$PHPMAILER_LANG['invalid_host'] = 'অবৈধ হোস্ট:';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = 'মেইলার সমর্থিত নয়।';
|
||||
$PHPMAILER_LANG['provide_address'] = 'আপনাকে অবশ্যই অন্তত একটি গন্তব্য ইমেল ঠিকানা প্রদান করতে হবে৷';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP ত্রুটি: নিম্নলিখিত গন্তব্যগুলি ব্যর্থ হয়েছে: ';
|
||||
$PHPMAILER_LANG['signing'] = 'স্বাক্ষর করতে ব্যর্থ হয়েছে: ';
|
||||
$PHPMAILER_LANG['smtp_code'] = 'SMTP কোড: ';
|
||||
$PHPMAILER_LANG['smtp_code_ex'] = 'অতিরিক্ত SMTP তথ্য:';
|
||||
$PHPMAILER_LANG['smtp_detail'] = 'বর্ণনা: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP সংযোগ() ব্যর্থ হয়েছে৷';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'SMTP সার্ভার ত্রুটি: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'পরিবর্তনশীল সেট করা যায়নি: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'অনুপস্থিত এক্সটেনশন: ';
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* Portuguese Version
|
||||
* By Paulo Henrique Garcia - paulo@controllerweb.com.br
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
$PHPMAILER_LANG["provide_address"] = 'Você deve fornecer pelo menos um endereço de destinatário de email.';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = ' mailer não suportado.';
|
||||
$PHPMAILER_LANG["execute"] = 'Não foi possível executar: ';
|
||||
$PHPMAILER_LANG["instantiate"] = 'Não foi possível instanciar a função mail.';
|
||||
$PHPMAILER_LANG["authenticate"] = 'Erro de SMTP: Não foi possível autenticar.';
|
||||
$PHPMAILER_LANG["from_failed"] = 'Os endereços de rementente a seguir falharam: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'Erro de SMTP: Os endereços de destinatário a seguir falharam: ';
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'Erro de SMTP: Dados não aceitos.';
|
||||
$PHPMAILER_LANG["connect_host"] = 'Erro de SMTP: Não foi possível conectar com o servidor SMTP.';
|
||||
$PHPMAILER_LANG["file_access"] = 'Não foi possível acessar o arquivo: ';
|
||||
$PHPMAILER_LANG["file_open"] = 'Erro de Arquivo: Não foi possível abrir o arquivo: ';
|
||||
$PHPMAILER_LANG["encoding"] = 'Codificação desconhecida: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
|
||||
|
||||
?>
|
||||
|
||||
|
|
@ -1,24 +1,27 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* Catalan Version
|
||||
* By Ivan: web AT microstudi DOT com
|
||||
* Catalan PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Ivan <web AT microstudi DOT com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
|
||||
$PHPMAILER_LANG["provide_address"] = 'S\'ha de proveir almenys una adreça d\'email com a destinatari.';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = ' mailer no està suportat';
|
||||
$PHPMAILER_LANG["execute"] = 'No es pot executar: ';
|
||||
$PHPMAILER_LANG["instantiate"] = 'No s\'ha pogut crear una instància de la funció Mail.';
|
||||
$PHPMAILER_LANG["authenticate"] = 'Error SMTP: No s\'hapogut autenticar.';
|
||||
$PHPMAILER_LANG["from_failed"] = 'La(s) següent(s) adreces de remitent han fallat: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'Error SMTP: Els següents destinataris han fallat: ';
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'Error SMTP: Dades no acceptades.';
|
||||
$PHPMAILER_LANG["connect_host"] = 'Error SMTP: No es pot connectar al servidor SMTP.';
|
||||
$PHPMAILER_LANG["file_access"] = 'No es pot accedir a l\'arxiu: ';
|
||||
$PHPMAILER_LANG["file_open"] = 'Error d\'Arxiu: No es pot obrir l\'arxiu: ';
|
||||
$PHPMAILER_LANG["encoding"] = 'Codificació desconeguda: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
|
||||
|
||||
?>
|
||||
$PHPMAILER_LANG['authenticate'] = 'Error SMTP: No s’ha pogut autenticar.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'Error SMTP: No es pot connectar al servidor SMTP.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Dades no acceptades.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'El cos del missatge està buit.';
|
||||
$PHPMAILER_LANG['encoding'] = 'Codificació desconeguda: ';
|
||||
$PHPMAILER_LANG['execute'] = 'No es pot executar: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'No es pot accedir a l’arxiu: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Error d’Arxiu: No es pot obrir l’arxiu: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'La(s) següent(s) adreces de remitent han fallat: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'No s’ha pogut crear una instància de la funció Mail.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Adreça d’email invalida: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no està suportat';
|
||||
$PHPMAILER_LANG['provide_address'] = 'S’ha de proveir almenys una adreça d’email com a destinatari.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Els següents destinataris han fallat: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Error al signar: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'Ha fallat el SMTP Connect().';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'No s’ha pogut establir o restablir la variable: ';
|
||||
//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: ';
|
||||
|
|
|
|||
|
|
@ -1,24 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* Chinese Version
|
||||
* By LiuXin: www.80x86.cn/blog/
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
|
||||
$PHPMAILER_LANG["provide_address"] = '您必须提供至少一个 ' .
|
||||
'收信人的email地址。';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = ' 您所选择的发送邮件的方法并不支持。';
|
||||
$PHPMAILER_LANG["execute"] = '不能执行: ';
|
||||
$PHPMAILER_LANG["instantiate"] = '不能实现mail方法。';
|
||||
$PHPMAILER_LANG["authenticate"] = 'SMTP 错误:身份验证失败。';
|
||||
$PHPMAILER_LANG["from_failed"] = '下面的发送地址邮件发送失败了: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'SMTP 错误: 下面的 ' .
|
||||
'收件人失败了: ';
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'SMTP 错误: 数据不可接受。';
|
||||
$PHPMAILER_LANG["connect_host"] = 'SMTP 错误: 不能连接SMTP主机。';
|
||||
$PHPMAILER_LANG["file_access"] = '不能访问文件:';
|
||||
$PHPMAILER_LANG["file_open"] = '文件错误:不能打开文件:';
|
||||
$PHPMAILER_LANG["encoding"] = '未知编码:';
|
||||
?>
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Czech PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'Chyba SMTP: Autentizace selhala.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'Chyba SMTP: Nelze navázat spojení se SMTP serverem.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'Chyba SMTP: Data nebyla přijata.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Prázdné tělo zprávy';
|
||||
$PHPMAILER_LANG['encoding'] = 'Neznámé kódování: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Nelze provést: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Nelze získat přístup k souboru: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Chyba souboru: Nelze otevřít soubor pro čtení: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Následující adresa odesílatele je nesprávná: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Nelze vytvořit instanci emailové funkce.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Neplatná adresa: ';
|
||||
$PHPMAILER_LANG['invalid_hostentry'] = 'Záznam hostitele je nesprávný: ';
|
||||
$PHPMAILER_LANG['invalid_host'] = 'Hostitel je nesprávný: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer není podporován.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Musíte zadat alespoň jednu emailovou adresu příjemce.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'Chyba SMTP: Následující adresy příjemců nejsou správně: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Chyba přihlašování: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() selhal.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Chyba SMTP serveru: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Nelze nastavit nebo změnit proměnnou: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Chybí rozšíření: ';
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* Czech Version
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
|
||||
$PHPMAILER_LANG["provide_address"] = 'Musíte zadat alespoò jednu ' .
|
||||
'emailovou adresu pøíjemce.';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = ' mailový klient není podporován.';
|
||||
$PHPMAILER_LANG["execute"] = 'Nelze provést: ';
|
||||
$PHPMAILER_LANG["instantiate"] = 'Nelze vytvoøit instanci emailové funkce.';
|
||||
$PHPMAILER_LANG["authenticate"] = 'SMTP Error: Chyba autentikace.';
|
||||
$PHPMAILER_LANG["from_failed"] = 'Následující adresa From je nesprávná: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: Adresy pøíjemcù ' .
|
||||
'nejsou správné ' .
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data nebyla pøijata';
|
||||
$PHPMAILER_LANG["connect_host"] = 'SMTP Error: Nelze navázat spojení se ' .
|
||||
' SMTP serverem.';
|
||||
$PHPMAILER_LANG["file_access"] = 'Soubor nenalezen: ';
|
||||
$PHPMAILER_LANG["file_open"] = 'File Error: Nelze otevøít soubor pro ètení: ';
|
||||
$PHPMAILER_LANG["encoding"] = 'Neznámé kódování: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Danish PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author John Sebastian <jms@iwb.dk>
|
||||
* Rewrite and extension of the work by Mikael Stokkebro <info@stokkebro.dk>
|
||||
*
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP fejl: Login mislykkedes.';
|
||||
$PHPMAILER_LANG['buggy_php'] = 'Din version af PHP er berørt af en fejl, som gør at dine beskeder muligvis vises forkert. For at rette dette kan du skifte til SMTP, slå mail.add_x_header headeren i din php.ini fil fra, skifte til MacOS eller Linux eller opgradere din version af PHP til 7.0.17+ eller 7.1.3+.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP fejl: Forbindelse til SMTP serveren kunne ikke oprettes.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fejl: Data blev ikke accepteret.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Meddelelsen er uden indhold';
|
||||
$PHPMAILER_LANG['encoding'] = 'Ukendt encode-format: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Kunne ikke afvikle: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Udvidelse mangler: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Kunne ikke tilgå filen: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Fil fejl: Kunne ikke åbne filen: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Følgende afsenderadresse er forkert: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Email funktionen kunne ikke initialiseres.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Udgyldig adresse: ';
|
||||
$PHPMAILER_LANG['invalid_header'] = 'Ugyldig header navn eller værdi';
|
||||
$PHPMAILER_LANG['invalid_hostentry'] = 'Ugyldig hostentry: ';
|
||||
$PHPMAILER_LANG['invalid_host'] = 'Ugyldig vært: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer understøttes ikke.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Indtast mindst en modtagers email adresse.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP fejl: Følgende modtagere fejlede: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Signeringsfejl: ';
|
||||
$PHPMAILER_LANG['smtp_code'] = 'SMTP kode: ';
|
||||
$PHPMAILER_LANG['smtp_code_ex'] = 'Yderligere SMTP info: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fejlede.';
|
||||
$PHPMAILER_LANG['smtp_detail'] = 'Detalje: ';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'SMTP server fejl: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Kunne ikke definere eller nulstille variablen: ';
|
||||
$PHPMAILER_LANG['no_smtputf8'] = 'Serveren understøtter ikke SMTPUTF8 som påkrævet for at sende til Unicode adresser';
|
||||
$PHPMAILER_LANG['imap_recommended'] = 'Brug af forenklet adresseparser anbefales ikke. Installer PHP IMAP udvidelsen for fuld RFC822 parsing.';
|
||||
$PHPMAILER_LANG['deprecated_argument'] = 'Udfaset argument: ';
|
||||
|
|
@ -1,27 +1,28 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* German Version
|
||||
* Thanks to Yann-Patrick Schlame for the latest update!
|
||||
* German PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
|
||||
$PHPMAILER_LANG["provide_address"] = 'Bitte geben Sie mindestens eine ' .
|
||||
'Empfänger Emailadresse an.';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = ' mailer wird nicht unterstützt.';
|
||||
$PHPMAILER_LANG["execute"] = 'Konnte folgenden Befehl nicht ausführen: ';
|
||||
$PHPMAILER_LANG["instantiate"] = 'Mail Funktion konnte nicht initialisiert werden.';
|
||||
$PHPMAILER_LANG["authenticate"] = 'SMTP Fehler: Authentifizierung fehlgeschlagen.';
|
||||
$PHPMAILER_LANG["from_failed"] = 'Die folgende Absenderadresse ist nicht korrekt: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'SMTP Fehler: Die folgenden ' .
|
||||
'Empfänger sind nicht korrekt: ';
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Fehler: Daten werden nicht akzeptiert.';
|
||||
$PHPMAILER_LANG["connect_host"] = 'SMTP Fehler: Konnte keine Verbindung zum SMTP-Host herstellen.';
|
||||
$PHPMAILER_LANG["file_access"] = 'Zugriff auf folgende Datei fehlgeschlagen: ';
|
||||
$PHPMAILER_LANG["file_open"] = 'Datei Fehler: konnte folgende Datei nicht öffnen: ';
|
||||
$PHPMAILER_LANG["encoding"] = 'Unbekanntes Encoding-Format: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Fehler beim Signieren: ';
|
||||
|
||||
?>
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP-Fehler: Authentifizierung fehlgeschlagen.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP-Fehler: Konnte keine Verbindung zum SMTP-Host herstellen.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP-Fehler: Daten werden nicht akzeptiert.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'E-Mail-Inhalt ist leer.';
|
||||
$PHPMAILER_LANG['encoding'] = 'Unbekannte Kodierung: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Konnte folgenden Befehl nicht ausführen: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Zugriff auf folgende Datei fehlgeschlagen: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Dateifehler: Konnte folgende Datei nicht öffnen: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Die folgende Absenderadresse ist nicht korrekt: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Mail-Funktion konnte nicht initialisiert werden.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Die Adresse ist ungültig: ';
|
||||
$PHPMAILER_LANG['invalid_hostentry'] = 'Ungültiger Hosteintrag: ';
|
||||
$PHPMAILER_LANG['invalid_host'] = 'Ungültiger Host: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wird nicht unterstützt.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Bitte geben Sie mindestens eine Empfängeradresse an.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP-Fehler: Die folgenden Empfänger sind nicht korrekt: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Fehler beim Signieren: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'Verbindung zum SMTP-Server fehlgeschlagen.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Fehler vom SMTP-Server: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Kann Variable nicht setzen oder zurücksetzen: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Fehlende Erweiterung: ';
|
||||
|
|
|
|||
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* Danish Version
|
||||
* Author: Mikael Stokkebro <info@stokkebro.dk>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
|
||||
$PHPMAILER_LANG["provide_address"] = 'Du skal indtaste mindst en ' .
|
||||
'modtagers emailadresse.';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = ' mailer understøttes ikke.';
|
||||
$PHPMAILER_LANG["execute"] = 'Kunne ikke køre: ';
|
||||
$PHPMAILER_LANG["instantiate"] = 'Kunne ikke initialisere email funktionen.';
|
||||
$PHPMAILER_LANG["authenticate"] = 'SMTP fejl: Kunne ikke logge på.';
|
||||
$PHPMAILER_LANG["from_failed"] = 'Følgende afsenderadresse er forkert: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'SMTP fejl: Følgende' .
|
||||
'modtagere er forkerte: ';
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'SMTP fejl: Data kunne ikke accepteres.';
|
||||
$PHPMAILER_LANG["connect_host"] = 'SMTP fejl: Kunne ikke tilslutte SMTP serveren.';
|
||||
$PHPMAILER_LANG["file_access"] = 'Ingen adgang til fil: ';
|
||||
$PHPMAILER_LANG["file_open"] = 'Fil fejl: Kunne ikke åbne filen: ';
|
||||
$PHPMAILER_LANG["encoding"] = 'Ukendt encode-format: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Greek PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'Σφάλμα SMTP: Αδυναμία πιστοποίησης.';
|
||||
$PHPMAILER_LANG['buggy_php'] = 'Η έκδοση PHP που χρησιμοποιείτε παρουσιάζει σφάλμα που μπορεί να έχει ως αποτέλεσμα κατεστραμένα μηνύματα. Για να το διορθώσετε, αλλάξτε τον τρόπο αποστολής σε SMTP, απενεργοποιήστε την επιλογή mail.add_x_header στο αρχείο php.ini, αλλάξτε λειτουργικό σε MacOS ή Linux ή αναβαθμίστε την PHP σε έκδοση 7.0.17+ ή 7.1.3+.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'Σφάλμα SMTP: Αδυναμία σύνδεσης με τον φιλοξενητή SMTP.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'Σφάλμα SMTP: Μη αποδεκτά δεδομένα.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Η ηλεκτρονική επιστολή δεν έχει περιεχόμενο.';
|
||||
$PHPMAILER_LANG['encoding'] = 'Άγνωστη μορφή κωδικοποίησης: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Αδυναμία εκτέλεσης: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Απουσία επέκτασης: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Αδυναμία πρόσβασης στο αρχείο: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Σφάλμα Αρχείου: Αδυναμία ανοίγματος αρχείου: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Η ακόλουθη διεύθυνση αποστολέα δεν είναι σωστή: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Αδυναμία εκκίνησης συνάρτησης Mail.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Μη έγκυρη διεύθυνση: ';
|
||||
$PHPMAILER_LANG['invalid_header'] = 'Μη έγκυρο όνομα κεφαλίδας ή τιμή';
|
||||
$PHPMAILER_LANG['invalid_hostentry'] = 'Μη έγκυρη εισαγωγή φιλοξενητή: ';
|
||||
$PHPMAILER_LANG['invalid_host'] = 'Μη έγκυρος φιλοξενητής: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer δεν υποστηρίζεται.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Δώστε τουλάχιστον μια ηλεκτρονική διεύθυνση παραλήπτη.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'Σφάλμα SMTP: Οι παρακάτω διευθύνσεις παραλήπτη δεν είναι έγκυρες: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Σφάλμα υπογραφής: ';
|
||||
$PHPMAILER_LANG['smtp_code'] = 'Κώδικάς SMTP: ';
|
||||
$PHPMAILER_LANG['smtp_code_ex'] = 'Πρόσθετες πληροφορίες SMTP: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'Αποτυχία σύνδεσης SMTP.';
|
||||
$PHPMAILER_LANG['smtp_detail'] = 'Λεπτομέρεια: ';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Σφάλμα με τον διακομιστή SMTP: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Αδυναμία ορισμού ή επαναφοράς μεταβλητής: ';
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* English Version
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
|
||||
$PHPMAILER_LANG["provide_address"] = 'You must provide at least one ' .
|
||||
'recipient email address.';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = ' mailer is not supported.';
|
||||
$PHPMAILER_LANG["execute"] = 'Could not execute: ';
|
||||
$PHPMAILER_LANG["instantiate"] = 'Could not instantiate mail function.';
|
||||
$PHPMAILER_LANG["authenticate"] = 'SMTP Error: Could not authenticate.';
|
||||
$PHPMAILER_LANG["from_failed"] = 'The following From address failed: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: The following ' .
|
||||
'recipients failed: ';
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data not accepted.';
|
||||
$PHPMAILER_LANG["connect_host"] = 'SMTP Error: Could not connect to SMTP host.';
|
||||
$PHPMAILER_LANG["file_access"] = 'Could not access file: ';
|
||||
$PHPMAILER_LANG["file_open"] = 'File Error: Could not open file: ';
|
||||
$PHPMAILER_LANG["encoding"] = 'Unknown encoding: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
|
||||
|
||||
?>
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Esperanto PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Robin van der Vliet <info@robinvandervliet.com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP-eraro: Ne eblis aŭtentigi.';
|
||||
$PHPMAILER_LANG['buggy_php'] = 'Via versio de PHP estas trafita de cimo, kiu povas kaŭzi difektitajn mesaĝojn. Por ripari tion, ŝanĝu al sendado per SMTP, malŝaltu la opcion mail.add_x_header en via php.ini, ŝanĝu al MacOS aŭ Linux, aŭ ĝisdatigu vian PHP al versio 7.0.17+ aŭ 7.1.3+.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP-eraro: Ne eblis konektiĝi al la SMTP-gastiganto.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP-eraro: Datumoj ne akceptitaj.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Mesaĝokorpo malplena';
|
||||
$PHPMAILER_LANG['encoding'] = 'Nekonata kodoprezento: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Ne eblis plenumi: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Kromprogramo mankas: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Ne eblis aliri la dosieron: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Dosiera eraro: Ne eblis malfermi la dosieron: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'La sekva(j) sendinto(j) malsukcesis: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Ne eblis funkciigi la retpoŝtan funkcion.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Nevalida adreso: ';
|
||||
$PHPMAILER_LANG['invalid_header'] = 'Nevalida kaplinia nomo aŭ valoro';
|
||||
$PHPMAILER_LANG['invalid_hostentry'] = 'Nevalida enigo de gastiganto: ';
|
||||
$PHPMAILER_LANG['invalid_host'] = 'Nevalida gastiganto: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' retpoŝtilo ne estas subtenata.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Vi devas provizi almenaŭ unu retpoŝtadreson de ricevonto.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP-eraro: La sekva(j) ricevonto(j) malsukcesis: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Subskriba eraro: ';
|
||||
$PHPMAILER_LANG['smtp_code'] = 'SMTP-kodo: ';
|
||||
$PHPMAILER_LANG['smtp_code_ex'] = 'Pliaj SMTP-informoj: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'La SMTP-konektiĝo malsukcesis.';
|
||||
$PHPMAILER_LANG['smtp_detail'] = 'Informoj: ';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Eraro de SMTP-servilo: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Ne eblas agordi aŭ reagordi la variablon: ';
|
||||
$PHPMAILER_LANG['no_smtputf8'] = 'La servilo ne subtenas SMTPUTF8, kiu estas bezonata por sendi al Unicode-adresoj.';
|
||||
$PHPMAILER_LANG['imap_recommended'] = 'Uzado de la simpligita adresanalizilo ne estas rekomendita. Instalu la IMAP-kromprogramon por PHP por plena RFC822-analizado.';
|
||||
$PHPMAILER_LANG['deprecated_argument'] = 'Malrekomendita argumento: ';
|
||||
|
|
@ -1,25 +1,38 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* Versión en español
|
||||
* Spanish PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Matt Sturdy <matt.sturdy@gmail.com>
|
||||
* @author Crystopher Glodzienski Cardoso <crystopher.glodzienski@gmail.com>
|
||||
* @author Daniel Cruz <danicruz0415@gmail.com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
|
||||
$PHPMAILER_LANG["provide_address"] = 'Debe proveer al menos una ' .
|
||||
'dirección de email como destinatario.';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = ' mailer no está soportado.';
|
||||
$PHPMAILER_LANG["execute"] = 'No puedo ejecutar: ';
|
||||
$PHPMAILER_LANG["instantiate"] = 'No pude crear una instancia de la función Mail.';
|
||||
$PHPMAILER_LANG["authenticate"] = 'Error SMTP: No se pudo autentificar.';
|
||||
$PHPMAILER_LANG["from_failed"] = 'La(s) siguiente(s) direcciones de remitente fallaron: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'Error SMTP: Los siguientes ' .
|
||||
'destinatarios fallaron: ';
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'Error SMTP: Datos no aceptados.';
|
||||
$PHPMAILER_LANG["connect_host"] = 'Error SMTP: No puedo conectar al servidor SMTP.';
|
||||
$PHPMAILER_LANG["file_access"] = 'No puedo acceder al archivo: ';
|
||||
$PHPMAILER_LANG["file_open"] = 'Error de Archivo: No puede abrir el archivo: ';
|
||||
$PHPMAILER_LANG["encoding"] = 'Codificación desconocida: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Error al firmar: ';
|
||||
|
||||
?>
|
||||
$PHPMAILER_LANG['authenticate'] = 'Error SMTP: Imposible autentificar.';
|
||||
$PHPMAILER_LANG['buggy_php'] = 'Tu versión de PHP ha sido afectada por un bug que puede resultar en mensajes corruptos. Para arreglarlo, cambia a enviar usando SMTP, deshabilita la opción mail.add_x_header en tu php.ini, cambia a MacOS o Linux, o actualiza tu PHP a la versión 7.0.17+ o 7.1.3+.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'Error SMTP: Imposible conectar al servidor SMTP.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Datos no aceptados.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'El cuerpo del mensaje está vacío.';
|
||||
$PHPMAILER_LANG['encoding'] = 'Codificación desconocida: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Imposible ejecutar: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Extensión faltante: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Imposible acceder al archivo: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Error de Archivo: Imposible abrir el archivo: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'La siguiente dirección de remitente falló: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Imposible crear una instancia de la función Mail.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Imposible enviar: dirección de email inválido: ';
|
||||
$PHPMAILER_LANG['invalid_header'] = 'Nombre o valor de encabezado no válido';
|
||||
$PHPMAILER_LANG['invalid_hostentry'] = 'Hostentry inválido: ';
|
||||
$PHPMAILER_LANG['invalid_host'] = 'Host inválido: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no está soportado.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Debe proporcionar al menos una dirección de email de destino.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Los siguientes destinos fallaron: ';
|
||||
$PHPMAILER_LANG['signing'] = 'Error al firmar: ';
|
||||
$PHPMAILER_LANG['smtp_code'] = 'Código del servidor SMTP: ';
|
||||
$PHPMAILER_LANG['smtp_code_ex'] = 'Información adicional del servidor SMTP: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falló.';
|
||||
$PHPMAILER_LANG['smtp_detail'] = 'Detalle: ';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'No se pudo configurar la variable: ';
|
||||
$PHPMAILER_LANG['imap_recommended'] = 'No se recomienda usar el analizador de direcciones simplificado. Instala la extensión IMAP de PHP para un análisis RFC822 más completo.';
|
||||
$PHPMAILER_LANG['deprecated_argument'] = 'Argumento obsoleto: ';
|
||||
|
|
|
|||
|
|
@ -1,24 +1,28 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* Estonian Version
|
||||
* By Indrek Päri
|
||||
* Estonian PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Indrek Päri
|
||||
* @author Elan Ruusamäe <glen@delfi.ee>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
|
||||
$PHPMAILER_LANG["provide_address"] = 'Te peate määrama vähemalt ühe saaja e-posti aadressi.';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = ' maileri tugi puudub.';
|
||||
$PHPMAILER_LANG["execute"] = 'Tegevus ebaõnnestus: ';
|
||||
$PHPMAILER_LANG["instantiate"] = 'mail funktiooni käivitamine ebaõnnestus.';
|
||||
$PHPMAILER_LANG["authenticate"] = 'SMTP Viga: Autoriseerimise viga.';
|
||||
$PHPMAILER_LANG["from_failed"] = 'Järgnev saatja e-posti aadress on vigane: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'SMTP Viga: Järgnevate saajate e-posti aadressid on vigased: ';
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Viga: Vigased andmed.';
|
||||
$PHPMAILER_LANG["connect_host"] = 'SMTP Viga: Ei õnnestunud luua ühendust SMTP serveriga.';
|
||||
$PHPMAILER_LANG["file_access"] = 'Pole piisavalt õiguseid järgneva faili avamiseks: ';
|
||||
$PHPMAILER_LANG["file_open"] = 'Faili Viga: Faili avamine ebaõnnestus: ';
|
||||
$PHPMAILER_LANG["encoding"] = 'Tundmatu Unknown kodeering: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
|
||||
|
||||
?>
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP Viga: Autoriseerimise viga.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP Viga: Ei õnnestunud luua ühendust SMTP serveriga.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Viga: Vigased andmed.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'Tühi kirja sisu';
|
||||
$PHPMAILER_LANG["encoding"] = 'Tundmatu kodeering: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Tegevus ebaõnnestus: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Pole piisavalt õiguseid järgneva faili avamiseks: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Faili Viga: Faili avamine ebaõnnestus: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Järgnev saatja e-posti aadress on vigane: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'mail funktiooni käivitamine ebaõnnestus.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'Saatmine peatatud, e-posti address vigane: ';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Te peate määrama vähemalt ühe saaja e-posti aadressi.';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' maileri tugi puudub.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP Viga: Järgnevate saajate e-posti aadressid on vigased: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Viga allkirjastamisel: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() ebaõnnestus.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'SMTP serveri viga: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'Ei õnnestunud määrata või lähtestada muutujat: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'Nõutud laiendus on puudu: ';
|
||||
|
|
|
|||
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Persian/Farsi PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Ali Jazayeri <jaza.ali@gmail.com>
|
||||
* @author Mohammad Hossein Mojtahedi <mhm5000@gmail.com>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG['authenticate'] = 'خطای SMTP: احراز هویت با شکست مواجه شد.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'خطای SMTP: اتصال به سرور SMTP برقرار نشد.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'خطای SMTP: دادهها نادرست هستند.';
|
||||
$PHPMAILER_LANG['empty_message'] = 'بخش متن پیام خالی است.';
|
||||
$PHPMAILER_LANG['encoding'] = 'کدگذاری ناشناخته: ';
|
||||
$PHPMAILER_LANG['execute'] = 'امکان اجرا وجود ندارد: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'امکان دسترسی به فایل وجود ندارد: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'خطای File: امکان بازکردن فایل وجود ندارد: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'آدرس فرستنده اشتباه است: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'امکان معرفی تابع ایمیل وجود ندارد.';
|
||||
$PHPMAILER_LANG['invalid_address'] = 'آدرس ایمیل معتبر نیست: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' mailer پشتیبانی نمیشود.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'باید حداقل یک آدرس گیرنده وارد کنید.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'خطای SMTP: ارسال به آدرس گیرنده با خطا مواجه شد: ';
|
||||
$PHPMAILER_LANG['signing'] = 'خطا در امضا: ';
|
||||
$PHPMAILER_LANG['smtp_connect_failed'] = 'خطا در اتصال به SMTP.';
|
||||
$PHPMAILER_LANG['smtp_error'] = 'خطا در SMTP Server: ';
|
||||
$PHPMAILER_LANG['variable_set'] = 'امکان ارسال یا ارسال مجدد متغیرها وجود ندارد: ';
|
||||
$PHPMAILER_LANG['extension_missing'] = 'افزونه موجود نیست: ';
|
||||
|
|
@ -1,25 +1,27 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* Finnish Version
|
||||
* By Jyry Kuukanen
|
||||
* Finnish PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Jyry Kuukanen
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
|
||||
$PHPMAILER_LANG["provide_address"] = 'Aseta vähintään yksi vastaanottajan ' .
|
||||
'sähköpostiosoite.';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = 'postivälitintyyppiä ei tueta.';
|
||||
$PHPMAILER_LANG["execute"] = 'Suoritus epäonnistui: ';
|
||||
$PHPMAILER_LANG["instantiate"] = 'mail-funktion luonti epäonnistui.';
|
||||
$PHPMAILER_LANG["authenticate"] = 'SMTP-virhe: käyttäjätunnistus epäonnistui.';
|
||||
$PHPMAILER_LANG["from_failed"] = 'Seuraava lähettäjän osoite on virheellinen: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'SMTP-virhe: seuraava vastaanottaja osoite on virheellinen.';
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'SMTP-virhe: data on virheellinen.';
|
||||
$PHPMAILER_LANG["connect_host"] = 'SMTP-virhe: yhteys palvelimeen ei onnistu.';
|
||||
$PHPMAILER_LANG["file_access"] = 'Seuraavaan tiedostoon ei ole oikeuksia: ';
|
||||
$PHPMAILER_LANG["file_open"] = 'Tiedostovirhe: Ei voida avata tiedostoa: ';
|
||||
$PHPMAILER_LANG["encoding"] = 'Tuntematon koodaustyyppi: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
|
||||
|
||||
?>
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP-virhe: käyttäjätunnistus epäonnistui.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP-virhe: yhteys palvelimeen ei onnistu.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP-virhe: data on virheellinen.';
|
||||
//$PHPMAILER_LANG['empty_message'] = 'Message body empty';
|
||||
$PHPMAILER_LANG['encoding'] = 'Tuntematon koodaustyyppi: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Suoritus epäonnistui: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Seuraavaan tiedostoon ei ole oikeuksia: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Tiedostovirhe: Ei voida avata tiedostoa: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'Seuraava lähettäjän osoite on virheellinen: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'mail-funktion luonti epäonnistui.';
|
||||
//$PHPMAILER_LANG['invalid_address'] = 'Invalid address: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = 'postivälitintyyppiä ei tueta.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Aseta vähintään yksi vastaanottajan sähköpostiosoite.';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP-virhe: seuraava vastaanottaja osoite on virheellinen.';
|
||||
//$PHPMAILER_LANG['signing'] = 'Signing Error: ';
|
||||
//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.';
|
||||
//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: ';
|
||||
//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: ';
|
||||
//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: ';
|
||||
|
|
|
|||
|
|
@ -1,27 +1,27 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PHPMailer language file.
|
||||
* Faroese Version [language of the Faroe Islands, a Danish dominion]
|
||||
* This file created: 11-06-2004
|
||||
* Supplied by Dávur Sørensen [www.profo-webdesign.dk]
|
||||
* Faroese PHPMailer language file: refer to English translation for definitive list
|
||||
* @package PHPMailer
|
||||
* @author Dávur Sørensen <http://www.profo-webdesign.dk>
|
||||
*/
|
||||
|
||||
$PHPMAILER_LANG = array();
|
||||
|
||||
$PHPMAILER_LANG["provide_address"] = 'Tú skal uppgeva minst ' .
|
||||
'móttakara-emailadressu(r).';
|
||||
$PHPMAILER_LANG["mailer_not_supported"] = ' er ikki supporterað.';
|
||||
$PHPMAILER_LANG["execute"] = 'Kundi ikki útføra: ';
|
||||
$PHPMAILER_LANG["instantiate"] = 'Kuni ikki instantiera mail funktión.';
|
||||
$PHPMAILER_LANG["authenticate"] = 'SMTP feilur: Kundi ikki góðkenna.';
|
||||
$PHPMAILER_LANG["from_failed"] = 'fylgjandi Frá/From adressa miseydnaðist: ';
|
||||
$PHPMAILER_LANG["recipients_failed"] = 'SMTP Feilur: Fylgjandi ' .
|
||||
'móttakarar miseydnaðust: ';
|
||||
$PHPMAILER_LANG["data_not_accepted"] = 'SMTP feilur: Data ikki góðkent.';
|
||||
$PHPMAILER_LANG["connect_host"] = 'SMTP feilur: Kundi ikki knýta samband við SMTP vert.';
|
||||
$PHPMAILER_LANG["file_access"] = 'Kundi ikki tilganga fílu: ';
|
||||
$PHPMAILER_LANG["file_open"] = 'Fílu feilur: Kundi ikki opna fílu: ';
|
||||
$PHPMAILER_LANG["encoding"] = 'Ókend encoding: ';
|
||||
$PHPMAILER_LANG["signing"] = 'Signing Error: ';
|
||||
|
||||
?>
|
||||
$PHPMAILER_LANG['authenticate'] = 'SMTP feilur: Kundi ikki góðkenna.';
|
||||
$PHPMAILER_LANG['connect_host'] = 'SMTP feilur: Kundi ikki knýta samband við SMTP vert.';
|
||||
$PHPMAILER_LANG['data_not_accepted'] = 'SMTP feilur: Data ikki góðkent.';
|
||||
//$PHPMAILER_LANG['empty_message'] = 'Message body empty';
|
||||
$PHPMAILER_LANG['encoding'] = 'Ókend encoding: ';
|
||||
$PHPMAILER_LANG['execute'] = 'Kundi ikki útføra: ';
|
||||
$PHPMAILER_LANG['file_access'] = 'Kundi ikki tilganga fílu: ';
|
||||
$PHPMAILER_LANG['file_open'] = 'Fílu feilur: Kundi ikki opna fílu: ';
|
||||
$PHPMAILER_LANG['from_failed'] = 'fylgjandi Frá/From adressa miseydnaðist: ';
|
||||
$PHPMAILER_LANG['instantiate'] = 'Kuni ikki instantiera mail funktión.';
|
||||
//$PHPMAILER_LANG['invalid_address'] = 'Invalid address: ';
|
||||
$PHPMAILER_LANG['mailer_not_supported'] = ' er ikki supporterað.';
|
||||
$PHPMAILER_LANG['provide_address'] = 'Tú skal uppgeva minst móttakara-emailadressu(r).';
|
||||
$PHPMAILER_LANG['recipients_failed'] = 'SMTP Feilur: Fylgjandi móttakarar miseydnaðust: ';
|
||||
//$PHPMAILER_LANG['signing'] = 'Signing Error: ';
|
||||
//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.';
|
||||
//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: ';
|
||||
//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: ';
|
||||
//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: ';
|
||||
|
|
|
|||