Вы можете использовать PHPMailer для простой отправки электронной почты. Для начала вам нужно знать, как получить данные поста в PHP. а затем сохраните их как новые переменные, затем добавьте их в тело письма для отправки.
Ссылка для PHPMailer: https://github.com/PHPMailer/PHPMailer
Учебник для PHPMailer: https://github.com/PHPMailer/PHPMailer/ wiki / Tutorial
Вы должны предоставить свой адрес электронной почты и пароль в Библиотеке PHPMailer. Наконец, ваш PHP-код будет таким, как показано ниже
Вы можете использовать PHPMailer для простой отправки электронной почты. Для начала вам нужно знать, как получить данные поста в PHP. а затем сохраните их как новые переменные, затем добавьте их в тело письма для отправки. Ссылка для PHPMailer: https://github.com/PHPMailer/PHPMailer
Учебник для PHPMailer: https://github.com/PHPMailer/PHPMailer/ wiki / Tutorial
Вы должны предоставить свой адрес электронной почты и пароль в Библиотеке PHPMailer. Наконец, ваш PHP-код будет таким, как показано ниже
[110]POST['name'];
$email = Вы можете использовать PHPMailer для простой отправки электронной почты. Для начала вам нужно знать, как получить данные поста в PHP. а затем сохраните их как новые переменные, затем добавьте их в тело письма для отправки.
Ссылка для PHPMailer: https://github.com/PHPMailer/PHPMailer
Учебник для PHPMailer: https://github.com/PHPMailer/PHPMailer/ wiki / Tutorial
Вы должны предоставить свой адрес электронной почты и пароль в Библиотеке PHPMailer. Наконец, ваш PHP-код будет таким, как показано ниже
[110]POST['email'];
$mail = new PHPMailer;
$mail->setFrom('from@example.com', 'Your Name');
$mail->addAddress($email, 'My Friend');
$mail->Subject = 'First PHPMailer Message';
$mail->Body = " Hi! $name This is my first e-mail sent through PHPMailer.';
if(!$mail->send()) {
echo 'Message was not sent.';
echo 'Mailer error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent.';
}
Вы можете вручную контролировать состояние индикатора выполнения, отправляя сообщения INSTALLMESSAGE_PROGRESS
установщику. Подробности можно найти здесь:
http://msdn.microsoft.com/en-us/library/aa370354.aspx
В частности, вы
LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
// Initialize the progress bar range and position
MsiProcessMessage(current_installer, reset_message); // see MSDN for details
for each (subinstaller in list_of_installers)
{
launch subinstaller; // see MSDN for details
// Update the progress bar to reflect most recent changes
MsiProcessMessage(current_installer, increment_message); // see MSDN for details
}
return (result);
}
Основным недостатком является то, что индикатор выполнения будет работать несколько изменчиво. Если вы действительно хотите получить фантазию и сделать ее более плавной, вы можете запустить отдельный поток «слушателя», который будет ждать обновлений от субинсталлятора, чтобы сделать более мелкие приращения к индикатору выполнения. Примерно так:
LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
// Initialize the progress bar range and position
MsiProcessMessage(current_installer, reset_message); // see MSDN for details
launch_listener_thread(); // launches listener_thread_proc (see below)
for each (subinstaller in list_of_installers)
{
launch subinstaller; // see MSDN for details
}
tell_listener_thread_to_stop();
optionally_wait_for_listener_thread_to_die();
return (result);
}
void listener_thread_proc()
{
// Loop until told to stop
while (!time_for_me_to_stop)
{
// Listen for update from sub-installer
timed_wait_for_update(); // probably required IPC, perhaps a named event?
// Only update the progress bar if an update message was actually received
if (!timeout)
{
// Update the progress bar to reflect most recent changes
MsiProcessMessage(current_installer, increment_message); // see MSDN for details
}
}
}
Очевидно, что каждый вспомогательный установщик должен был бы сигнализировать основному установщику, что достигнут прогресс, поэтому это может потребовать более обширных изменений в вашем продукте. Стоит ли это усилий или нет - решать вам.
LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
// Initialize the progress bar range and position
MsiProcessMessage(current_installer, reset_message); // see MSDN for details
for each (subinstaller in list_of_installers)
{
launch subinstaller; // see MSDN for details
// Update the progress bar to reflect most recent changes
MsiProcessMessage(current_installer, increment_message); // see MSDN for details
}
return (result);
}
Основным недостатком является то, что индикатор выполнения будет работать несколько изменчиво. Если вы действительно хотите получить фантазию и сделать ее более плавной, вы можете запустить отдельный поток «слушателя», который будет ждать обновлений от субинсталлятора, чтобы сделать более мелкие приращения к индикатору выполнения. Примерно так:
LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
// Initialize the progress bar range and position
MsiProcessMessage(current_installer, reset_message); // see MSDN for details
launch_listener_thread(); // launches listener_thread_proc (see below)
for each (subinstaller in list_of_installers)
{
launch subinstaller; // see MSDN for details
}
tell_listener_thread_to_stop();
optionally_wait_for_listener_thread_to_die();
return (result);
}
void listener_thread_proc()
{
// Loop until told to stop
while (!time_for_me_to_stop)
{
// Listen for update from sub-installer
timed_wait_for_update(); // probably required IPC, perhaps a named event?
// Only update the progress bar if an update message was actually received
if (!timeout)
{
// Update the progress bar to reflect most recent changes
MsiProcessMessage(current_installer, increment_message); // see MSDN for details
}
}
}
Очевидно, что каждый вспомогательный установщик должен был бы сигнализировать основному установщику, что достигнут прогресс, поэтому это может потребовать более обширных изменений в вашем продукте. Стоит ли это усилий или нет - решать вам.
поток, который будет ждать обновлений от субинсталлятора, чтобы сделать более мелкие приращения к индикатору выполнения. Примерно так:LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
// Initialize the progress bar range and position
MsiProcessMessage(current_installer, reset_message); // see MSDN for details
launch_listener_thread(); // launches listener_thread_proc (see below)
for each (subinstaller in list_of_installers)
{
launch subinstaller; // see MSDN for details
}
tell_listener_thread_to_stop();
optionally_wait_for_listener_thread_to_die();
return (result);
}
void listener_thread_proc()
{
// Loop until told to stop
while (!time_for_me_to_stop)
{
// Listen for update from sub-installer
timed_wait_for_update(); // probably required IPC, perhaps a named event?
// Only update the progress bar if an update message was actually received
if (!timeout)
{
// Update the progress bar to reflect most recent changes
MsiProcessMessage(current_installer, increment_message); // see MSDN for details
}
}
}
Очевидно, что каждый вспомогательный установщик должен был бы сигнализировать основному установщику, что достигнут прогресс, поэтому это может потребовать более обширных изменений в вашем продукте. Стоит ли это усилий или нет - решать вам.
поток, который будет ждать обновлений от субинсталлятора, чтобы сделать более мелкие приращения к индикатору выполнения. Примерно так:LONG LaunchSubinstallersCA(MSIHANDLE current_installer)
{
// Initialize the progress bar range and position
MsiProcessMessage(current_installer, reset_message); // see MSDN for details
launch_listener_thread(); // launches listener_thread_proc (see below)
for each (subinstaller in list_of_installers)
{
launch subinstaller; // see MSDN for details
}
tell_listener_thread_to_stop();
optionally_wait_for_listener_thread_to_die();
return (result);
}
void listener_thread_proc()
{
// Loop until told to stop
while (!time_for_me_to_stop)
{
// Listen for update from sub-installer
timed_wait_for_update(); // probably required IPC, perhaps a named event?
// Only update the progress bar if an update message was actually received
if (!timeout)
{
// Update the progress bar to reflect most recent changes
MsiProcessMessage(current_installer, increment_message); // see MSDN for details
}
}
}
Очевидно, что каждый вспомогательный установщик должен был бы сигнализировать основному установщику, что достигнут прогресс, поэтому это может потребовать более обширных изменений в вашем продукте. Стоит ли это усилий или нет - решать вам.