Я выполняю веб-сервис, который в настоящее время отсылает электронные письма с подтверждением новым пользователям через Gmail smtp серверы. Поскольку я только получаю несколько новых пользователей каждый день, это не было проблемой.
Я недавно добавил новые опции к веб-приложению, которое потребует, чтобы специализированное сообщение отсылалось каждому пользователю каждый день. Думайте об этом как подобном регулярным сообщениям, которые LinkedIn отсылает, которые дают Вам отчет о состоянии относительно действия в Вашей сети. Сообщение каждого пользователя будет отличаться. С тысячами пользователей это означает, что тысячи уникальных сообщений будут отправляться каждый день.
Править: Я с тех пор нашел, что эти типы электронной почты называют "транзакционными или сообщения отношений". Spamtacular имеет хорошую статью о дифференциации между маркетингом и транзакционной электронной почтой.
Я не думаю с помощью smtp серверов Gmail, будет больше сокращать его, но я не знаю это наверняка. Я не знаю, какие максимальные исходящие сообщения Gmail на учетную запись (это могло бы быть 100/день), но они ограничивают исходящую почту 500 получателями на сообщение. Я не отправляю единственное сообщение 500 получателям, но я собираюсь быть передающими 1000-ми специализированных сообщений с каждым получателем, добирающимся один в день.
Мне интересно изучать любые лучшие практики для того, чтобы сделать это (специально для основанных на Java веб-приложений). Вот некоторые мои мысли и проблемы на нем:
Любой совет ценится. Я также очень интересуюсь инструментами с открытым исходным кодом или веб-сервисами, которые упрощают вещи и могли помочь мне расти как можно быстрее.
Спасибо!
Попробуйте проверить, работает ли ваша почта:
<?php
require_once "Mail.php";
$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <recipient@example.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";
$host = "mail.example.com";
$username = "smtp_username";
$password = "smtp_password";
$headers = array ('From' => $from,
'To' => $to,
'Subject' => $subject);
$smtp = Mail::factory('smtp',
array ('host' => $host,
'auth' => true,
'username' => $username,
'password' => $password));
$mail = $smtp->send($to, $headers, $body);
if (PEAR::isError($mail)) {
echo("<p>" . $mail->getMessage() . "</p>");
} else {
echo("<p>Message successfully sent!</p>");
}
?>
Если это не работает, вам необходимо проверить конфигурацию PHP.
Для получения дополнительной информации см. http://php.net/manual/en/function.mail.php .
-121--2328723-Я согласен с Арне Бурмейстером, код для этого будет выглядеть следующим образом:
private static class SingletonObjectFactoryHolder
{
private static ObjectFactory INSTANCE;
private ObjectFactory()
{
}
public static String getInstance() throws Exception
{
return (INSTANCE == null) ? (INSTANCE = new ObjectFactory()) : INSTANCE;
// A ternary operator might not be the best fit if you need to throw an exception, but I think it looks nicer than the if(INSTANCE==null){} else{} for lazy instantiation.
}
}
-121--1362692- Что касается вашего первого вопроса, да, вы должны настроить свой собственный почтовый сервер. Использование gmail для этого может сработать на какое-то время, но они, вероятно, закроют вас в коротком порядке, когда увидят этот вид деятельности. Можно зарегистрировать корпоративную учетную запись и использовать механизм приложений для отправки сообщений. Вот ссылка с информацией о квотах почты для этой услуги.
Что касается ваших вторых и третьих вопросов, было бы неплохо поставить сообщения в очередь веб-приложения и отправить их централизованной службой вместо того, чтобы приложение отправляло сообщения самостоятельно.
Обычно я просто использую таблицу базы данных в качестве очереди - веб-приложение вставляет строки для каждого сообщения, которое оно хочет отправить. Приложение службы/запланированной задачи извлекает новые сообщения из таблицы и отправляет их. Это дает вам большую гибкость, если вы хотите переключить почтовые серверы позже, лучшую надежность, если почтовый сервер не работает, более простую диагностику, если есть проблемы с получателями, не получающими сообщения, и возможность повторной отправки сообщений. Что касается использования JMS/MQ для этого - вероятно, нет необходимости. IMO таблица базы данных, используемая в качестве очереди, даст вам больше гибкости, чем фактическая система очередей на основе JMS.
Что касается выбора, ДА - вы должны дать людям способ отказаться. Я не думаю, что вам нужно помечать сообщения как массовые.
Что касается архитектуры, я бы определенно рассмотрел возможность отделения отправки электронных писем от основной службы с помощью некоторой формы асинхронной очереди сообщений (или ее факсимильной связи с использованием база данных в качестве посредника). Еще одним преимуществом этого подхода является то, что если SMPT-сервер \ сеть не работает, вы можете создать семантику повтора, кроме того, для будущей масштабируемости вы можете реализовать несколько отправителей почты, читающих из одной очереди, или реализовать регулирование отправки или планирование (т.е. отправлять n сообщений в час. ) и т. д. и т. д.