From 8c18e477a3844b8e6ad437960f2dc474f14fd11e Mon Sep 17 00:00:00 2001
From: Marcus Bointon
Date: Thu, 7 Aug 2008 12:41:59 +0000
Subject: [PATCH] Move the rest
---
phpmailer/ChangeLog.txt | 10 +
phpmailer/LICENSE | 504 ++++++++++++++++++
phpmailer/README | 80 +++
phpmailer/class.phpmailer.php | 387 ++++++++++++++
phpmailer/class.smtp.php | 937 +++++++++++++++++++++++++++++++++
phpmailer/docs/extending.html | 80 +++
phpmailer/docs/faq.html | 66 +++
phpmailer/docs/manual.html | 231 ++++++++
phpmailer/docs/timeoutfix.diff | 23 +
9 files changed, 2318 insertions(+)
create mode 100644 phpmailer/ChangeLog.txt
create mode 100644 phpmailer/LICENSE
create mode 100644 phpmailer/README
create mode 100644 phpmailer/class.phpmailer.php
create mode 100644 phpmailer/class.smtp.php
create mode 100644 phpmailer/docs/extending.html
create mode 100644 phpmailer/docs/faq.html
create mode 100644 phpmailer/docs/manual.html
create mode 100644 phpmailer/docs/timeoutfix.diff
diff --git a/phpmailer/ChangeLog.txt b/phpmailer/ChangeLog.txt
new file mode 100644
index 00000000..424f923b
--- /dev/null
+++ b/phpmailer/ChangeLog.txt
@@ -0,0 +1,10 @@
+ChangeLog
+
+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.9 (Tue, April 17 2001)
+* Intial public release
\ No newline at end of file
diff --git a/phpmailer/LICENSE b/phpmailer/LICENSE
new file mode 100644
index 00000000..f3f1b3b6
--- /dev/null
+++ b/phpmailer/LICENSE
@@ -0,0 +1,504 @@
+ 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
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+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
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+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
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+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
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+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
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+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.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+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
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+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
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+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
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+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
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+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
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ 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
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/phpmailer/README b/phpmailer/README
new file mode 100644
index 00000000..abfa1426
--- /dev/null
+++ b/phpmailer/README
@@ -0,0 +1,80 @@
+phpmailer - PHP email class
+==============================
+http://phpmailer.sourceforge.net
+
+Please read LICENSE for information on this softwares availability and
+distribution.
+
+Class Features:
+- Can send HTML emails, multiple attachments, use multiple main and
+backup SMTP servers, wrap emails for Pine and Kmail client users
+- Can send using three different mail methods: via a SMTP class, the
+/usr/sbin/sendmail program (and the qmail equivalent), and the PHP
+mail() function. This can be changed without changing any existing
+code
+- Uses the same methods as the very popular AspEmail and AspMail
+Windows COM components
+- Class can be extended to include new methods or replace existing
+methods
+- Ease transition of ASP based sites to PHP
+- Expose advanced email functionality without hacking headers
+- Works on both Windows and Unix
+- Hopes to provide a stable and standard way to access email
+functions in PHP
+
+
+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.
+
+Example
+
+IsSMTP(); // set mailer to use SMTP
+$mail->From = "from@email.com";
+$mail->FromName = "Mailer";
+$mail->Host = "smtp1.site.com;smtp2.site.com"; // specify main and backup server
+$mail->AddAddress("josh@site.com", "Josh Adams");
+$mail->AddAddress("ellen@site.com"); // name is optional
+$mail->AddReplyTo("info@site.com", "Information");
+$mail->WordWrap = 50; // set word wrap
+$mail->AddAttachment("c:\\temp\\js-bak.sql"); // add attachments
+$mail->AddAttachment("c:/temp/11-10-00.zip");
+
+$mail->IsHTML(true); // set email format to HTML
+$mail->Subject = "Here is the subject";
+$mail->Body = "This is the message body";
+$mail->Send(); // send message
+?>
+
+CHANGELOG
+
+See ChangeLog.txt
+
+
+Download: http://phpmailer.sourceforge.net/phpmailer-0.92.tar.gz
+
+Brent R. Matzelle
diff --git a/phpmailer/class.phpmailer.php b/phpmailer/class.phpmailer.php
new file mode 100644
index 00000000..b859f050
--- /dev/null
+++ b/phpmailer/class.phpmailer.php
@@ -0,0 +1,387 @@
+ContentType = "text/html";
+ else
+ $this->ContentType = "text/plain";
+ }
+
+ // Sets mailer to use SMTP
+ function IsSMTP() {
+ $this->mailer = "smtp";
+ }
+
+ // Sets mailer to use PHP mail() function
+ function IsMail() {
+ $this->mailer = "mail";
+ }
+
+ // Sets mailer to directly use $sendmail program
+ function IsSendmail() {
+ $this->mailer = "sendmail";
+ }
+
+ // Sets $sendmail to qmail MTA
+ function IsQmail() {
+ $this->sendmail = "/var/qmail/bin/qmail-inject";
+ }
+
+
+ /////////////////////////////////////////////////
+ // RECIPIENT METHODS
+ /////////////////////////////////////////////////
+
+ // Add a "to" address
+ function AddAddress($address, $name = "") {
+ $cur = count($this->to);
+ $this->to[$cur][0] = trim($address);
+ $this->to[$cur][1] = $name;
+ }
+
+ // Add a "cc" address
+ function AddCC($address, $name = "") {
+ $cur = count($this->cc);
+ $this->cc[$cur][0] = trim($address);
+ $this->cc[$cur][1] = $name;
+ }
+
+ // Add a "bcc" address
+ function AddBCC($address, $name = "") {
+ $cur = count($this->bcc);
+ $this->bcc[$cur][0] = trim($address);
+ $this->bcc[$cur][1] = $name;
+ }
+
+ // Add a "Reply-to" address
+ function AddReplyTo($address, $name = "") {
+ $cur = count($this->ReplyTo);
+ $this->ReplyTo[$cur][0] = trim($address);
+ $this->ReplyTo[$cur][1] = $name;
+ }
+
+
+ /////////////////////////////////////////////////
+ // MAIL SENDING METHODS
+ /////////////////////////////////////////////////
+
+ // Create message and assign to mailer
+ function Send() {
+ if(count($this->to) < 1)
+ $this->error_handler("You must provide at least one recipient email address");
+
+ $header = $this->create_header();
+ $body = $this->create_body();
+
+ // Choose the mailer
+ if($this->mailer == "sendmail")
+ $this->sendmail_send($header, $body);
+ elseif($this->mailer == "mail")
+ $this->mail_send($header, $body);
+ elseif($this->mailer == "smtp")
+ $this->smtp_send($header, $body);
+ else
+ $this->error_handler(sprintf("%s mailer is not supported", $this->mailer));
+ }
+
+ // Send using the $sendmail program
+ function sendmail_send($header, $body) {
+ $sendmail = sprintf("%s -f %s -t", $this->sendmail, $this->From);
+
+ if(!$mail = popen($sendmail, "w"))
+ $this->error_handler(sprintf("Could not open %s", $this->sendmail));
+
+ fputs($mail, $header);
+ fputs($mail, $body);
+ pclose($mail);
+ }
+
+ // Send via the PHP mail() function
+ function mail_send($header, $body) {
+ // Create mail recipient list
+ $to = $this->to[0][0]; // no extra comma
+ for($x = 1; $x < count($this->to); $x++)
+ $to .= sprintf(",%s", $this->to[$x][0]);
+ for($x = 0; $x < count($this->cc); $x++)
+ $to .= sprintf(",%s", $this->cc[$x][0]);
+ for($x = 0; $x < count($this->bcc); $x++)
+ $to .= sprintf(",%s", $this->bcc[$x][0]);
+
+ if(!mail($to, $this->Subject, $body, $header))
+ $this->error_handler("Could not instantiate mail()");
+ }
+
+ // Send message via SMTP using PhpSMTP
+ // PhpSMTP written by Chris Ryan
+ function smtp_send($header, $body) {
+ include("class.smtp.php"); // Load code only if asked
+ $smtp = new SMTP;
+ $smtp->do_debug = $this->SMTPDebug;
+
+ // Try to connect to all SMTP servers
+ $hosts = explode(";", $this->Host);
+ $x = 0;
+ $connection = false;
+ while($x < count($hosts))
+ {
+ if($smtp->Connect($hosts[$x], $this->Port, $this->Timeout))
+ {
+ $connection = true;
+ break;
+ }
+ // printf("%s host could not connect
", $hosts[$x]); //debug only
+ $x++;
+ }
+ if(!$connection)
+ $this->error_handler("SMTP Error: could not connect to SMTP host server(s)");
+
+ $smtp->Hello($this->Helo);
+ $smtp->Mail(sprintf("<%s>", $this->From));
+
+ for($x = 0; $x < count($this->to); $x++)
+ $smtp->Recipient(sprintf("<%s>", $this->to[$x][0]));
+ for($x = 0; $x < count($this->cc); $x++)
+ $smtp->Recipient(sprintf("<%s>", $this->cc[$x][0]));
+ for($x = 0; $x < count($this->bcc); $x++)
+ $smtp->Recipient(sprintf("<%s>", $this->bcc[$x][0]));
+
+ $smtp->Data(sprintf("%s%s", $header, $body));
+ $smtp->Quit();
+ }
+
+
+ /////////////////////////////////////////////////
+ // MESSAGE CREATION METHODS
+ /////////////////////////////////////////////////
+
+ // Creates recipient headers
+ function addr_append($type, $addr) {
+ $addr_str = "";
+ $addr_str .= sprintf("%s: %s <%s>", $type, $addr[0][1], $addr[0][0]);
+ if(count($addr) > 1)
+ {
+ for($x = 1; $x < count($addr); $x++)
+ {
+ $addr_str .= sprintf(", %s <%s>", $addr[$x][1], $addr[$x][0]);
+ }
+ $addr_str .= "\n";
+ }
+ else
+ $addr_str .= "\n";
+
+ return($addr_str);
+ }
+
+ // Wraps message for use with mailers that don't
+ // automatically perform wrapping
+ // Written by philippe@cyberabuse.org
+ function wordwrap($message, $length) {
+ $line=explode("\n", $message);
+ $message="";
+ for ($i=0 ;$i < count($line); $i++)
+ {
+ $line_part = explode(" ", trim($line[$i]));
+ $buf = "";
+ for ($e = 0; $e $length and $buf_o != "")
+ {
+ $message .= $buf_o . "\n";
+ $buf = $line_part[$e];
+ }
+ }
+ $message .= $buf . "\n";
+ }
+ return ($message);
+ }
+
+ // Assembles and returns the message header
+ function create_header() {
+ $header = array();
+ $header[] = sprintf("Date: %s\n", date("D M j G:i:s T"));
+ $header[] = $this->addr_append("To", $this->to);
+ $header[] = sprintf("From: %s <%s>\n", $this->FromName, trim($this->From));
+ if(count($this->cc) > 0)
+ $header[] = $this->addr_append("cc", $this->cc);
+ if(count($this->bcc) > 0)
+ $header[] = $this->addr_append("bcc", $this->bcc);
+ if(count($this->ReplyTo) > 0)
+ $header[] = $this->addr_append("Reply-to", $this->ReplyTo);
+ $header[] = sprintf("Subject: %s\n", trim($this->Subject));
+ $header[] = sprintf("X-Priority: %d\n", $this->Priority);
+ $header[] = sprintf("X-Mailer: phpmailer [version .9]\n");
+ $header[] = sprintf("Content-Transfer-Encoding: %s\n", $this->Encoding);
+ $header[] = sprintf("Return-Path: %s\n", trim($this->From));
+ // $header[] = sprintf("Content-Length: %d\n", (strlen($this->Body) * 7));
+ if(count($this->attachment) > 0)
+ {
+ $header[] = sprintf("Content-Type: Multipart/Mixed; charset = \"%s\";\n", $this->CharSet);
+ $header[] = sprintf(" boundary=\"Boundary-=%s\"\n", $this->boundary);
+ }
+ else
+ {
+ $header[] = sprintf("Content-Type: %s; charset = \"%s\";\n", $this->ContentType, $this->CharSet);
+ }
+ $header[] = "MIME-Version: 1.0\n\n";
+
+ return(join("", $header));
+ }
+
+ // Assembles and returns the message body
+ function create_body() {
+ // wordwrap the message body if set
+ if($this->WordWrap)
+ $this->Body = $this->wordwrap($this->Body, $this->WordWrap);
+
+ if(count($this->attachment) > 0)
+ $body = $this->attach_all();
+ else
+ $body = $this->Body;
+
+ return($body);
+ }
+
+
+ /////////////////////////////////////////////////
+ // ATTACHMENT METHODS
+ /////////////////////////////////////////////////
+
+ // Check if attachment is valid and add to list
+ function AddAttachment($path) {
+ if(!is_file($path))
+ $this->error_handler(sprintf("Could not find %s file on filesystem", $path));
+
+ // Separate file name from full path
+ $separator = "/";
+ $len = strlen($path);
+
+ // Set $separator to win32 style
+ if(!ereg($separator, $path))
+ $separator = "\\";
+
+ // Get the filename from the path
+ $pos = strrpos($path, $separator) + 1;
+ $filename = substr($path, $pos, $len);
+
+ // Set message boundary
+ $this->boundary = "_b" . md5(uniqid(time()));
+
+ // Append to $attachment array
+ $cur = count($this->attachment);
+ $this->attachment[$cur][0] = $path;
+ $this->attachment[$cur][1] = $filename;
+ }
+
+ // Attach text and binary attachments to body
+ function attach_all() {
+ // Return text of body
+ $mime = array();
+ $mime[] = sprintf("--Boundary-=%s\n", $this->boundary);
+ $mime[] = sprintf("Content-Type: %s\n", $this->ContentType);
+ $mime[] = "Content-Transfer-Encoding: 8bit\n\n";
+ $mime[] = sprintf("%s\n", $this->Body);
+
+ // Add all attachments
+ for($x = 0; $x < count($this->attachment); $x++)
+ {
+ $path = $this->attachment[$x][0];
+ $filename = $this->attachment[$x][1];
+ $mime[] = sprintf("--Boundary-=%s\n", $this->boundary);
+ $mime[] = "Content-Type: application/octet-stream;\n";
+ $mime[] = sprintf("name=\"%s\"\n", $filename);
+ $mime[] = "Content-Transfer-Encoding: base64\n";
+ $mime[] = sprintf("Content-Disposition: attachment; filename=\"%s\"\n\n", $filename);
+ $mime[] = sprintf("%s\n\n", $this->encode_file($path));
+ }
+ $mime[] = sprintf("\n--Boundary-=%s--\n", $this->boundary);
+
+ return(join("", $mime));
+ }
+
+ // Encode attachment in base64 format
+ function encode_file ($path) {
+ if(!$fd = fopen($path, "r"))
+ $this->error_handler("File Error: Could not open file %s", $path);
+ $file = fread($fd, filesize($path));
+
+ // chunk_split is found in PHP >= 3.0.6
+ $encoded = chunk_split(base64_encode($file));
+ fclose($fd);
+
+ return($encoded);
+ }
+
+ /////////////////////////////////////////////////
+ // MISCELLANEOUS METHODS
+ /////////////////////////////////////////////////
+
+ // Print out error and exit
+ function error_handler($msg) {
+ if($this->MailerDebug == true)
+ {
+ print("Mailer Error
");
+ print("Description:
");
+ printf("%s", $msg);
+ exit;
+ }
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/phpmailer/class.smtp.php b/phpmailer/class.smtp.php
new file mode 100644
index 00000000..0ae6aa12
--- /dev/null
+++ b/phpmailer/class.smtp.php
@@ -0,0 +1,937 @@
+
+ * Created: 03/26/2001
+ *
+ * TODO:
+ * - Move all the duplicate code to a utility function
+ * Most of the functions have the first lines of
+ * code do the same processing. If this can be moved
+ * into a utility function then it would reduce the
+ * overall size of the code significantly.
+ */
+
+ /*
+ * STMP is rfc 821 compliant and implements all the rfc 821 SMTP
+ * commands except TURN which will always return a not implemented
+ * error. SMTP also provides some utility methods for sending mail
+ * to an SMTP server.
+ */
+ class SMTP {
+ var $SMTP_PORT = 25; # the default SMTP PORT
+ var $CRLF = "\r\n"; # CRLF pair
+
+ var $smtp_conn; # the socket to the server
+ var $error; # error if any on the last call
+ var $helo_rply; # the reply the server sent to us for HELO
+
+ var $do_debug; # the level of debug to perform
+
+ /*
+ * SMTP()
+ *
+ * Initialize the class so that the data is in a known state.
+ */
+ function SMTP() {
+ $this->smtp_conn = 0;
+ $this->error = null;
+ $this->helo_rply = null;
+
+ $this->do_debug = 0;
+ }
+
+ /************************************************************
+ * CONNECTION FUNCTIONS *
+ ***********************************************************/
+
+ /*
+ * Connect($host, $port=0, $tval=30)
+ *
+ * Connect to the server specified on the port specified.
+ * If the port is not specified use the default SMTP_PORT.
+ * If tval is specified then a connection will try and be
+ * established with the server for that number of seconds.
+ * If tval is not specified the default is 30 seconds to
+ * try on the connection.
+ *
+ * SMTP CODE SUCCESS: 220
+ * SMTP CODE FAILURE: 421
+ */
+ function Connect($host,$port=0,$tval=30) {
+ # set the error val to null so there is no confusion
+ $this->error = null;
+
+ # make sure we are __not__ connected
+ if($this->connected()) {
+ # ok we are connected! what should we do?
+ # for now we will just give an error saying we
+ # are already connected
+ $this->error =
+ array("error" => "Already connected to a server");
+ return false;
+ }
+
+ if(empty($port)) {
+ $port = $this->SMTP_PORT;
+ }
+
+ #connect to the smtp server
+ $this->smtp_conn = fsockopen($host, # the host of the server
+ $port, # the port to use
+ $errno, # error number if any
+ $errstr, # error message if any
+ $tval); # give up after ? secs
+ # verify we connected properly
+ if(empty($this->smtp_conn)) {
+ $this->error = array("error" => "Failed to connect to server",
+ "errno" => $errno,
+ "errstr" => $errstr);
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": $errstr ($errno)" . $this->CRLF;
+ }
+ return false;
+ }
+
+ # sometimes the SMTP server takes a little longer to respond
+ # so we will give it a longer timeout for the first read
+ //socket_set_timeout($this->smtp_conn, 1, 0);
+
+ # get any announcement stuff
+ $announce = $this->get_lines();
+
+ # set the timeout of any socket functions at 1/10 of a second
+ //socket_set_timeout($this->smtp_conn, 0, 100000);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce;
+ }
+
+ return true;
+ }
+
+ /*
+ * Connected()
+ *
+ * Returns true if connected to a server otherwise false
+ */
+ function Connected() {
+ if(!empty($this->smtp_conn)) {
+ $sock_status = socket_get_status($this->smtp_conn);
+ if($sock_status["eof"]) {
+ # hmm this is an odd situation... the socket is
+ # valid but we aren't connected anymore
+ if($this->do_debug >= 1) {
+ echo "SMTP -> NOTICE:" . $this->CRLF .
+ "EOF caught while checking if connected";
+ }
+ $this->Close();
+ return false;
+ }
+ return true; # everything looks good
+ }
+ return false;
+ }
+
+ /*
+ * Close()
+ *
+ * Closes the socket and cleans up the state of the class.
+ * It is not considered good to use this function without
+ * first trying to use QUIT.
+ */
+ function Close() {
+ $this->error = null; # so there is no confusion
+ $this->helo_rply = null;
+ if(!empty($this->smtp_conn)) {
+ # close the connection and cleanup
+ fclose($this->smtp_conn);
+ $this->smtp_conn = 0;
+ }
+ }
+
+
+ /**************************************************************
+ * SMTP COMMANDS *
+ *************************************************************/
+
+ /*
+ * Data($msg_data)
+ *
+ * Issues a data command and sends the msg_data to the server
+ * finializing the mail transaction. $msg_data is the message
+ * that is to be send with the headers. Each header needs to be
+ * on a single line followed by a with the message headers
+ * and the message body being seperated by and additional .
+ *
+ * Implements rfc 821: DATA
+ *
+ * SMTP CODE INTERMEDIATE: 354
+ * [data]
+ * .
+ * SMTP CODE SUCCESS: 250
+ * SMTP CODE FAILURE: 552,554,451,452
+ * SMTP CODE FAILURE: 451,554
+ * SMTP CODE ERROR : 500,501,503,421
+ */
+ function Data($msg_data) {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Data() without being connected");
+ return false;
+ }
+
+ fputs($this->smtp_conn,"DATA" . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 354) {
+ $this->error =
+ array("error" => "DATA command not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+
+ # the server is ready to accept data!
+ # according to rfc 821 we should not send more than 1000
+ # including the CRLF
+ # characters on a single line 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.
+ # in addition we will be looking for lines that start with
+ # a period '.' and append and additional period '.' to that
+ # line. NOTE: this does not count towards are limit.
+
+ # normalize the line breaks so we know the explode works
+ $msg_data = str_replace("\r\n","\n",$msg_data);
+ $msg_data = str_replace("\r","\n",$msg_data);
+ $lines = explode("\n",$msg_data);
+
+ # we need to find a good way to determine is headers are
+ # in the msg_data or if it is a straight msg body
+ # currently I'm assuming rfc 822 definitions of msg headers
+ # and if the first field of the first line (':' sperated)
+ # does not contain a space then it _should_ be a header
+ # and we can process all lines before a blank "" line as
+ # headers.
+ $field = substr($lines[0],0,strpos($lines[0],":"));
+ $in_headers = false;
+ if(!empty($field) && !strstr($field," ")) {
+ $in_headers = true;
+ }
+
+ $max_line_length = 998; # used below; set here for ease in change
+
+ while(list(,$line) = @each($lines)) {
+ $lines_out = null;
+ if($line == "" && $in_headers) {
+ $in_headers = false;
+ }
+ # ok we need to break this line up into several
+ # smaller lines
+ while(strlen($line) > $max_line_length) {
+ $pos = strrpos(substr($line,0,$max_line_length)," ");
+ $lines_out[] = substr($line,0,$pos);
+ $line = substr($line,$pos + 1);
+ # if we are processing headers we need to
+ # add a LWSP-char to the front of the new line
+ # rfc 822 on long msg headers
+ if($in_headers) {
+ $line = "\t" . $line;
+ }
+ }
+ $lines_out[] = $line;
+
+ # now send the lines to the server
+ while(list(,$line_out) = @each($lines_out)) {
+ if($line_out[0] == ".") {
+ $line_out = "." . $line_out;
+ }
+ fputs($this->smtp_conn,$line_out . $this->CRLF);
+ }
+ }
+
+ # ok all the message data has been sent so lets get this
+ # over with aleady
+ fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250) {
+ $this->error =
+ array("error" => "DATA not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * Expand($name)
+ *
+ * Expand takes the name and asks the server to list all the
+ * people who are members of the _list_. Expand will return
+ * back and array of the result or false if an error occurs.
+ * Each value in the array returned has the format of:
+ * [ ]
+ * The definition of is defined in rfc 821
+ *
+ * Implements rfc 821: EXPN
+ *
+ * SMTP CODE SUCCESS: 250
+ * SMTP CODE FAILURE: 550
+ * SMTP CODE ERROR : 500,501,502,504,421
+ */
+ function Expand($name) {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Expand() without being connected");
+ return false;
+ }
+
+ fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250) {
+ $this->error =
+ array("error" => "EXPN not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+
+ # parse the reply and place in our array to return to user
+ $entries = explode($this->CRLF,$rply);
+ while(list(,$l) = @each($entries)) {
+ $list[] = substr($l,4);
+ }
+
+ return $rval;
+ }
+
+ /*
+ * Hello($host="")
+ *
+ * Sends the HELO command to the smtp server.
+ * This makes sure that we and the server are in
+ * the same known state.
+ *
+ * Implements from rfc 821: HELO
+ *
+ * SMTP CODE SUCCESS: 250
+ * SMTP CODE ERROR : 500, 501, 504, 421
+ */
+ function Hello($host="") {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Hello() without being connected");
+ return false;
+ }
+
+ # if a hostname for the HELO wasn't specified determine
+ # a suitable one to send
+ if(empty($host)) {
+ # we need to determine some sort of appopiate default
+ # to send to the server
+ $host = "localhost";
+ }
+
+ fputs($this->smtp_conn,"HELO " . $host . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250) {
+ $this->error =
+ array("error" => "HELO not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+
+ $this->helo_rply = $rply;
+
+ return true;
+ }
+
+ /*
+ * Help($keyword="")
+ *
+ * Gets help information on the keyword specified. If the keyword
+ * is not specified then returns generic help, ussually contianing
+ * A list of keywords that help is available on. This function
+ * returns the results back to the user. It is up to the user to
+ * handle the returned data. If an error occurs then false is
+ * returned with $this->error set appropiately.
+ *
+ * Implements rfc 821: HELP [ ]
+ *
+ * SMTP CODE SUCCESS: 211,214
+ * SMTP CODE ERROR : 500,501,502,504,421
+ *
+ function Help($keyword="") {
+ $this->error = null; # to avoid confusion
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Help() without being connected");
+ return false;
+ }
+
+ $extra = "";
+ if(!empty($keyword)) {
+ $extra = " " . $keyword;
+ }
+
+ fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 211 && $code != 214) {
+ $this->error =
+ array("error" => "HELP not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+
+ return $rply;
+ }
+
+ /*
+ * Mail($from)
+ *
+ * Starts a mail transaction from the email address specified in
+ * $from. Returns true if successful or false otherwise. If True
+ * the mail transaction is started and then one or more Recipient
+ * commands may be called followed by a Data command.
+ *
+ * Implements rfc 821: MAIL FROM:
+ *
+ * SMTP CODE SUCCESS: 250
+ * SMTP CODE SUCCESS: 552,451,452
+ * SMTP CODE SUCCESS: 500,501,421
+ */
+ function Mail($from) {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Mail() without being connected");
+ return false;
+ }
+
+ fputs($this->smtp_conn,"MAIL FROM:" . $from . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250) {
+ $this->error =
+ array("error" => "MAIL not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * Noop()
+ *
+ * Sends the command NOOP to the SMTP server.
+ *
+ * Implements from rfc 821: NOOP
+ *
+ * SMTP CODE SUCCESS: 250
+ * SMTP CODE ERROR : 500, 421
+ */
+ function Noop() {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Noop() without being connected");
+ return false;
+ }
+
+ fputs($this->smtp_conn,"NOOP" . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250) {
+ $this->error =
+ array("error" => "NOOP not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * Quit($close_on_error=true)
+ *
+ * Sends the quit command to the server and then closes the socket
+ * if there is no error or the $close_on_error argument is true.
+ *
+ * Implements from rfc 821: QUIT
+ *
+ * SMTP CODE SUCCESS: 221
+ * SMTP CODE ERROR : 500
+ */
+ function Quit($close_on_error=true) {
+ $this->error = null; # so there is no confusion
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Quit() without being connected");
+ return false;
+ }
+
+ # send the quit command to the server
+ fputs($this->smtp_conn,"quit" . $this->CRLF);
+
+ # get any good-bye messages
+ $byemsg = $this->get_lines();
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg;
+ }
+
+ $rval = true;
+ $e = null;
+
+ $code = substr($byemsg,0,3);
+ if($code != 221) {
+ # use e as a tmp var cause Close will overwrite $this->error
+ $e = array("error" => "SMTP server rejected quit command",
+ "smtp_code" => $code,
+ "smtp_rply" => substr($byemsg,4));
+ $rval = false;
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $e["error"] . ": " .
+ $byemsg . $this->CRLF;
+ }
+ }
+
+ if(empty($e) || $close_on_error) {
+ $this->Close();
+ }
+
+ return $rval;
+ }
+
+ /*
+ * Recipient($to)
+ *
+ * Sends the command RCPT to the SMTP server with the TO: argument of $to.
+ * Returns true if the recipient was accepted false if it was rejected.
+ *
+ * Implements from rfc 821: RCPT TO:
+ *
+ * SMTP CODE SUCCESS: 250,251
+ * SMTP CODE FAILURE: 550,551,552,553,450,451,452
+ * SMTP CODE ERROR : 500,501,503,421
+ */
+ function Recipient($to) {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Recipient() without being connected");
+ return false;
+ }
+
+ fputs($this->smtp_conn,"RCPT TO:" . $to . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250 && $code != 251) {
+ $this->error =
+ array("error" => "RCPT not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * Reset()
+ *
+ * Sends the RSET command to abort and transaction that is
+ * currently in progress. Returns true if successful false
+ * otherwise.
+ *
+ * Implements rfc 821: RSET
+ *
+ * SMTP CODE SUCCESS: 250
+ * SMTP CODE ERROR : 500,501,504,421
+ */
+ function Reset() {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Reset() without being connected");
+ return false;
+ }
+
+ fputs($this->smtp_conn,"RSET" . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250) {
+ $this->error =
+ array("error" => "RSET failed",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+
+ return true;
+ }
+
+ /*
+ * Send($from)
+ *
+ * Starts a mail transaction from the email address specified in
+ * $from. Returns true if successful or false otherwise. If True
+ * the mail transaction is started and then one or more Recipient
+ * commands may be called followed by a Data command. This command
+ * will send the message to the users terminal if they are logged
+ * in.
+ *
+ * Implements rfc 821: SEND FROM:
+ *
+ * SMTP CODE SUCCESS: 250
+ * SMTP CODE SUCCESS: 552,451,452
+ * SMTP CODE SUCCESS: 500,501,502,421
+ */
+ function Send($from) {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Send() without being connected");
+ return false;
+ }
+
+ fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250) {
+ $this->error =
+ array("error" => "SEND not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * SendAndMail($from)
+ *
+ * Starts a mail transaction from the email address specified in
+ * $from. Returns true if successful or false otherwise. If True
+ * the mail transaction is started and then one or more Recipient
+ * commands may be called followed by a Data command. This command
+ * will send the message to the users terminal if they are logged
+ * in and send them an email.
+ *
+ * Implements rfc 821: SAML FROM:
+ *
+ * SMTP CODE SUCCESS: 250
+ * SMTP CODE SUCCESS: 552,451,452
+ * SMTP CODE SUCCESS: 500,501,502,421
+ */
+ function SendAndMail($from) {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called SendAndMail() without being connected");
+ return false;
+ }
+
+ fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250) {
+ $this->error =
+ array("error" => "SAML not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * SendOrMail($from)
+ *
+ * Starts a mail transaction from the email address specified in
+ * $from. Returns true if successful or false otherwise. If True
+ * the mail transaction is started and then one or more Recipient
+ * commands may be called followed by a Data command. This command
+ * will send the message to the users terminal if they are logged
+ * in or mail it to them if they are not.
+ *
+ * Implements rfc 821: SOML FROM:
+ *
+ * SMTP CODE SUCCESS: 250
+ * SMTP CODE SUCCESS: 552,451,452
+ * SMTP CODE SUCCESS: 500,501,502,421
+ */
+ function SendOrMail($from) {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called SendOrMail() without being connected");
+ return false;
+ }
+
+ fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250) {
+ $this->error =
+ array("error" => "SOML not accepted from server",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * Turn()
+ *
+ * This is an optional command for SMTP that this class does not
+ * support. This method is here to make the RFC821 Definition
+ * complete for this class and __may__ be implimented in the future
+ *
+ * Implements from rfc 821: TURN
+ *
+ * SMTP CODE SUCCESS: 250
+ * SMTP CODE FAILURE: 502
+ * SMTP CODE ERROR : 500, 503
+ */
+ function Turn() {
+ $this->error = array("error" => "This method, TURN, of the SMTP ".
+ "is not implemented");
+ if($this->do_debug >= 1) {
+ echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF;
+ }
+ return false;
+ }
+
+ /*
+ * Verify($name)
+ *
+ * Verifies that the name is recognized by the server.
+ * Returns false if the name could not be verified otherwise
+ * the response from the server is returned.
+ *
+ * Implements rfc 821: VRFY
+ *
+ * SMTP CODE SUCCESS: 250,251
+ * SMTP CODE FAILURE: 550,551,553
+ * SMTP CODE ERROR : 500,501,502,421
+ */
+ function Verify($name) {
+ $this->error = null; # so no confusion is caused
+
+ if(!$this->connected()) {
+ $this->error = array(
+ "error" => "Called Verify() without being connected");
+ return false;
+ }
+
+ fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF);
+
+ $rply = $this->get_lines();
+ $code = substr($rply,0,3);
+
+ if($this->do_debug >= 2) {
+ echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
+ }
+
+ if($code != 250 && $code != 251) {
+ $this->error =
+ array("error" => "VRFY failed on name '$name'",
+ "smtp_code" => $code,
+ "smtp_msg" => substr($rply,4));
+ if($this->do_debug >= 1) {
+ echo "SMTP -> ERROR: " . $this->error["error"] .
+ ": " . $rply . $this->CRLF;
+ }
+ return false;
+ }
+ return $rply;
+ }
+
+ /******************************************************************
+ * INTERNAL FUNCTIONS *
+ ******************************************************************/
+
+ /*
+ * get_lines()
+ *
+ * __internal_use_only__: read in as many lines as possible
+ * either before eof or socket timeout occurs on the operation.
+ * With SMTP we can tell if we have more lines to read if the
+ * 4th character is '-' symbol. If it is a space then we don't
+ * need to read anything else.
+ */
+ function get_lines() {
+ $data = "";
+ while($str = fgets($this->smtp_conn,515)) {
+ if($this->do_debug >= 4) {
+ echo "SMTP -> get_lines(): \$data was \"$data\"" .
+ $this->CRLF;
+ echo "SMTP -> get_lines(): \$str is \"$str\"" .
+ $this->CRLF;
+ }
+ $data .= $str;
+ if($this->do_debug >= 4) {
+ echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF;
+ }
+ # if the 4th character is a space then we are done reading
+ # so just break the loop
+ if(substr($str,3,1) == " ") { break; }
+ }
+ return $data;
+ }
+
+ }
+
+
+ ?>
diff --git a/phpmailer/docs/extending.html b/phpmailer/docs/extending.html
new file mode 100644
index 00000000..20c698c2
--- /dev/null
+++ b/phpmailer/docs/extending.html
@@ -0,0 +1,80 @@
+
+
+Extending phpmailer
+
+
+
+
+Extending phpmailer (inheritance)
+
+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:
+
+
+Here's a class that extends the phpmailer class and sets the defaults
+for the particular site:
+PHP include file: mail.inc.php
+
+
+
+
+require("class.phpmailer.php");
+
+class my_phpmailer extends phpmailer {
+ // Set default variables for all new objects
+ var $From = "from@email.com";
+ var $FromName = "Mailer";
+ var $Host = "smtp1.site.com;smtp2.site.com";
+ var $Mailer = "smtp";
+ 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
+ }
+}
+ |
+
+
+
+
+Now here's a normal PHP page in the site:
+Normal PHP file: mail_test.php
+
+
+
+
+require("mail.inc.php");
+
+// Instantiate your new class
+$mail = new my_phpmailer;
+
+// Now you only need to add the necessary stuff
+$mail->AddAddress("josh@site.com", "Josh Adams");
+$mail->Subject = "Here is the subject";
+$mail->Body = "This is the message body";
+$mail->AddAttachment("c:/temp/11-10-00.zip");
+$mail->Send(); // send message
+
+echo "Message was sent successfully";
+
+ |
+
+
+
+
+
+
\ No newline at end of file
diff --git a/phpmailer/docs/faq.html b/phpmailer/docs/faq.html
new file mode 100644
index 00000000..283e6517
--- /dev/null
+++ b/phpmailer/docs/faq.html
@@ -0,0 +1,66 @@
+
+
+phpmailer FAQ
+
+
+
+
+phpmailer FAQ
+
+
+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?
+
+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:
+timeoutfix.diff. Otherwise you can wait
+for the new PHP release.
+
+
+
+I am concerned that using include files will take up too much
+processing time on my computer. How can I make it run faster?
+
+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: APC
+(Alternative PHP Cache) and Afterburner
+(Win32 download)
+are excellent free tools that do just this. If you have the money
+you might also try Zend Cache, 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.
+
+
+
+
+What mailer gives me the best performance?
+
+On a single machine the mail() or sendmail mailers give you the best
+performance because they do not have the added 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.
+
+
+
+When I try to attach a file with on my server I get a
+"Could not find {file} on filesystem error". Why is this?
+
+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 ("/").
+
+
+
+
\ No newline at end of file
diff --git a/phpmailer/docs/manual.html b/phpmailer/docs/manual.html
new file mode 100644
index 00000000..ee593f5c
--- /dev/null
+++ b/phpmailer/docs/manual.html
@@ -0,0 +1,231 @@
+
+
+phpmailer Manual
+
+
+
+
+
+
+phpmailer Manual
+
+
+Directions
+
+Variables are set like this:
+$mail->Priority = 1;
+
+
+
+Methods are set like this:
+$mail->AddCC("roger@email.com", "Roger Opus");
+
+
+General Variables
+
+
+
+| Variable |
+Description |
+Default Value |
+
+
+| string Mailer |
+Set the mailer ("mail", "sendmail", or "smtp") |
+mail |
+
+ |
+| int Priority |
+Set email priority (1 (High), 3 (Normal), 5 (low) |
+3 |
+
+ |
+
+| string CharSet |
+Set CharSet |
+iso-8859-1 |
+
+string ContentType |
+Set ContentType |
+text/plain |
+
+
+| string Encoding |
+Set Content-Transfer-Encoding |
+8bit |
+
+
+| string From |
+Set email address of sender |
+root@localhost |
+
+
+| string FromName |
+Set name of sender |
+root |
+
+
+| string Subject |
+Set message subject |
+none |
+
+
+| string Body |
+Set message body |
+none |
+
+
+| int WordWrap |
+Set word wrap on message body |
+false (off) |
+
+
+| bool MailerDebug |
+Turn debugging on or off |
+true (on) |
+
+
+
+
+SMTP-specific Variables
+
+
+
+| Variable |
+Description |
+Default Value |
+
+
+| string Host |
+Set mail servers (separated by semicolons (";") |
+localhost |
+
+ |
+
+| int Port |
+SMTP port |
+25 |
+
+
+| string Helo |
+Set SMTP HELO |
+localhost.localdomain |
+
+
+| int Timeout |
+Set connection timeout |
+10 (seconds) |
+
+
+| bool SMTPDebug |
+Set SMTP debugging on or off |
+false (off) |
+
+
+
+
+General Methods
+
+
+
+| Method |
+Description |
+
+
+| IsHTML(bool) |
+Turn HTML format on/off |
+
+ |
+
+| IsSMTP() |
+Set mailer to SMTP |
+
+ |
+
+| IsMail() |
+Set mailer to PHP mail() function |
+
+ |
+
+| IsSendmail() |
+Set mailer to $sendmail |
+
+ |
+
+| IsQmail() |
+Set $sendmail to /var/qmail/bin/qmail-inject |
+
+ |
+
+| AddAddress(string address, string name) |
+Add a "to" address (name optional) |
+
+ |
+
+| AddCC(string address, string name) |
+Add a "cc" address (name optional) |
+
+ |
+
+| AddBCC(string address, string name) |
+Add a "bcc" address (name optional) |
+
+ |
+
+| AddReplyTo(string address, string name) |
+Add a "Reply-To" address (name optional) |
+
+ |
+
+| AddAttachment(string path) |
+Add an attachment |
+
+ |
+
+| Send() |
+Send the message |
+
+ |
+
+
+
+
+
\ No newline at end of file
diff --git a/phpmailer/docs/timeoutfix.diff b/phpmailer/docs/timeoutfix.diff
new file mode 100644
index 00000000..63ebd43a
--- /dev/null
+++ b/phpmailer/docs/timeoutfix.diff
@@ -0,0 +1,23 @@
+*** /usr/local/src/php-4.0.4pl1/ext/standard/fsock.c.old Mon Mar 26 13:07:40 2001
+--- /usr/local/src/php-4.0.4pl1/ext/standard/fsock.c Mon Mar 26 13:12:03 2001
+***************
+*** 559,564 ****
+--- 559,565 ----
+
+ static void php_sockread_total(php_sockbuf *sock, size_t maxread)
+ {
++ sock->timeout_event = 0;
+ while(!sock->eof && TOREAD(sock) < maxread && !sock->timeout_event) {
+ php_sockread_internal(sock);
+ }
+***************
+*** 619,624 ****
+--- 620,627 ----
+ }
+
+ SEARCHCR();
++
++ sock->timeout_event = 0;
+
+ if(!p) {
+ if(sock->is_blocked) {