<?xml version="1.0" encoding="UTF-8"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements. See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License. You may obtain a copy of the License at
 
         http://www.apache.org/licenses/LICENSE-2.0
 
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
<document xmlns="http://maven.apache.org/XDOC/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd">

	<properties>
		<title>LoggerAppenderMailEvent</title>
	</properties>

	<body>
		<section name="LoggerAppenderMailEvent">
		
			<p><code>LoggerAppenderMailEvent</code> appends individual log events via email.</p>
			
			<p>This appender is similar to <code><a href="mail.html">LoggerAppenderMail</a></code>, except that it 
  			sends each each log event in an individual email message at the time when it occurs.</p>
			
		    <div class="alert alert-error">
		        <span class="alert-heading">Deprecated!</span>
		        <p>LoggerAppenderMailEvent is deprecated and will be removed in a future release. Please use 
		        <a href="mail.html">LoggerAppenderMail</a> with <code>bufferSize</code> parameter set to 
				<code>1</code> instead.</p>
            </div>
			
			<subsection name="Layout">
				<p>This appender requires a layout. If no layout is specified in configuration, 
				<code><a href="../layouts/simple.html">LoggerLayoutSimple</a></code> will be used by default.</p>
			</subsection>
			
			<subsection name="Parameters">
				<p>The following parameters are available:</p>
		
				<table>
					<thead>
						<tr>
							<th>Parameter</th>
							<th>Type</th>
							<th>Required</th>
							<th>Default</th>
							<th>Description</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>to</td>
							<td>string</td>
							<td><strong>Yes</strong></td>
							<td>-</td>
							<td>Email address(es) to which the log will be sent. Multiple email addresses may be specified
							by separating them with a comma.</td>
						</tr>
						<tr>
							<td>from</td>
							<td>string</td>
							<td><strong>Yes</strong></td>
							<td>-</td>
							<td>Email address which will be used in the From field.</td>
						</tr>
						<tr>
							<td>subject</td>
							<td>string</td>
							<td>No</td>
							<td>Log4php Report</td>
							<td>Subject of the email message.</td>
						</tr>
						<tr>
							<td>smtpHost</td>
							<td>string</td>
							<td>No</td>
							<td>ini_get('SMTP')</td>
							<td>Used to override the SMTP server. <strong>Only works on Windows.</strong></td>
						</tr>
						<tr>
							<td>port</td>
							<td>integer</td>
							<td>No</td>
							<td>25</td>
							<td>Used to override the default SMTP server port. <strong>Only works on Windows.</strong></td>
						</tr>
					</tbody>
				</table>
			</subsection>
				
			<subsection name="Examples">
				
				<p>This example shows how to configure <code>LoggerAppenderMailEvent</code> to send the log to two email 
				addresses.</p>
				
				<div class="auto-tabs">
					<ul>
						<li>XML</li>
						<li>PHP</li>
					</ul>
 
					<div class="tab-content" >
						<div class="tab-pane">
<pre class="prettyprint"><![CDATA[
<configuration xmlns="http://logging.apache.org/log4php/">
    <appender name="default" class="LoggerAppenderMailEvent">
        <layout class="LoggerLayoutSimple" />
        <param name="to" value="foo@example.com,baz@example.com" />
        <param name="from" value="logger@example.com" />
    </appender>
    <root>
        <appender_ref ref="default" />
    </root>
</configuration>
]]></pre>
						</div>
						<div class="tab-pane">
<pre class="prettyprint"><![CDATA[
array(
    'appenders' => array(
        'default' => array(
            'class' => 'LoggerAppenderMailEvent',
            'layout' => array(
                'class' => 'LoggerLayoutSimple',
            ),
            'params' => array(
                'to' => 'foo@example.com,baz@example.com',
                'from' => 'logger@example.com'
            ),
        ),
    ),
    'rootLogger' => array(
        'appenders' => array('default'),
    ),
);
]]></pre>
						</div>
					</div>
				</div>
				
			</subsection>
		</section>
	</body>
</document>
