Тестирование почты с сервером разработки приложений (java)
Я использую javamail для отправки писем из приложения appengine. Он отлично работает в развертывании, но я не могу понять, как это сделать, используя сервер разработки. Всякий раз, когда мне нужно проверить sendmail, мне нужно развернуть приложение, которое очень раздражает.
Фоновая информация (почему журналы не работают):
Мы знаем, что электронные письма отправляются в журналы на сервере разработки приложений. Однако основной причиной нежелания отправлять электронные письма с сервера разработки можно проверить формат электронной почты. Как это выглядит? Необходимо внести изменения в шаблон электронной почты, чтобы он выглядел хорошо в почтовых клиентах A, B и C, и это можно сделать быстро, без хлопот развертывания до реальной версии приложения по умолчанию каждый раз.
Мы не спамеры. Мы не пытаемся обойти любые виды безопасности. Короче говоря, мы хотим законно иметь возможность видеть реальную, фактическую электронную почту в одном или нескольких почтовых клиентах, а затем мгновенно изменять код, чтобы мы могли настроить их без необходимости проходить кропотливый процесс редактирования, компиляции, подождать 5 минут для его развертывания, тестирования, повторного цикла. Поскольку нет стандартов в том, как каждый клиент электронной почты передает электронное письмо, этот кропотливый процесс усиливается, пытаясь заставить что-то работать на многих клиентах.
Вопрос:
Как настроить сервер разработки Java Google App Engine на отправку электронной почты с локального компьютера или службы SMTP для проверки электронных писем, отправляемых на реальные, фактические почтовые клиенты?
Ответы
Ответ 1
В Eclipse выберите меню "Выполнить", "Конфигурации отладки...", а затем выберите приложения
конфигурации. Выберите вкладку "Аргументы", затем в разделе "Параметры VM" установите VM
свойств, подобных этому:
-Dmail.log_mail_level=WARNING -Dmail.log_mail_body=true
Ответ 2
Когда я работал с реализацией службы электронной почты, я использовал крутой намек. Поэтому, если вы также используете MimeMessage
и хотите просто проверить, отформатировано ли сообщение, как ожидается, проверьте, имеются ли вложения, HTML хорошо отформатирован, изображения имеют право ссылки и т.д., Вы могли бы построить все сообщение и во время отладки у вас может быть такой код:
MimeMessage msg = new MimeMessage(session);
...
if ("1".equals(System.getProperty("mail.debug"))) {
msg.writeTo(new FileOutputStream(new File("/tmp/sentEmail.eml")));
}
Каждый раз, когда это выполняется, объект MimeMessage
будет сохранен в emailSent.eml
. Этот файл можно открыть с помощью вашего устройства чтения электронной почты и проверить, все ли в порядке.
Конечно, вам нужно выполнить свое приложение с параметром -Dmail.debug = 1.
Пример с прикрепленным файлом, текстовым сообщением и html-сообщением с таким подходом может быть следующим:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.junit.Test;
public class MimeMessageTest {
@Test
public void tesstMimeMessage() throws MessagingException, FileNotFoundException, IOException {
Session session = Session.getDefaultInstance(new Properties(), null);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("[email protected]", "Foo Admin"));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]", "Baz User"));
msg.setSubject("Subject from admin e-mail to baz user");
// create and fill the first message part
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setText("test message and so on");
mbp1.setContent("<h1>test message and so on in HTML</h1>", "text/html");
// create the second message part
MimeBodyPart mbp2 = new MimeBodyPart();
// attach the file to the message
FileDataSource fds = new FileDataSource("/tmp/fileToBeAttached");
mbp2.setDataHandler(new DataHandler(fds));
mbp2.setFileName(fds.getName());
// create the Multipart and add its parts to it
Multipart mp = new MimeMultipart();
mp.addBodyPart(mbp1);
mp.addBodyPart(mbp2);
// add the Multipart to the message
msg.setContent(mp);
if ("1".equals(System.getProperty("debug"))) {
msg.writeTo(new FileOutputStream(new File("/tmp/sentEmail.eml")));
}
}
}
Ответ 3
От документы:
Когда приложение, запущенное в сервер разработки вызывает Mail службы для отправки сообщения электронной почты, сообщение печатается в журнале. Сервер разработки Java не отправляет сообщение электронной почты.
Поэтому просто проверяйте журналы, когда собираетесь отправлять почту, и убедитесь, что она отображается там. Фактическая почта не будет отправлена.
Ответ 4
GAE использует JavaMail, поэтому не слишком сложно заставить его работать. Есть две вещи, которые вам нужно будет изменить.
Во-первых, правильно настройте свой сеанс JavaMail для своего STMP-сервера. Для этого вместо Session.getDefaultInstance
используйте Session.getInstance
, предоставляя по крайней мере свойства mail.smtp.host
. См. ссылка JavaMail SMTP или просто найдите общий Java-сервис SMTP-тупорта.
Второе изменение заключается в том, что вам необходимо остановить GAE, обрабатывая ваши письма. Он делает это из-за строки
rfc822=gm
в META-INF/javamail.address.map в банке SDK. Вы можете указать свою собственную адресную карту, но это раздражает, потому что я предполагаю, что вы хотите ее только для отладки - или изменить адресную карту из кода. Это так же просто, как делать
session.setProtocolForAddress("rfc822", "smtp");
в сеансе, который вы создали на первом шаге. Это должно направлять все ваши письма на стандартный обработчик SMTP.
Ответ 5
Для настройки электронной почты на сервере разработки вы можете сделать следующее:
final String username = "[email protected]";//change accordingly
final String password = "xxxxxxx";//change accordingly
// Assuming you are sending email through gmail
String host = "smtp.gmail.com";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", "587");
// Get the Session object.
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
session.setProtocolForAddress("rfc822", "smtp");
И обычно используйте сеанс для отправки писем:
try {
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("[email protected]", "xxxx"));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress("[email protected],"Mr. User"));
msg.setSubject("Test email from GAE/J development");
msg.setText("This is test:);
Transport.send(msg);
} catch (Exception e) {
e.printStackTrace();
}
Кроме того, вам необходимо добавить следующие две библиотеки в путь сборки и под управлением войны /WEB -INF/lib:
- javax.mail.jar
- javax.activation.jar
Вы можете легко найти ссылки, отправив их в Google.
Наконец, если вы хотите использовать gmail как smtp-сервер, вам нужно перейти в свою учетную запись и включить доступ для менее seucre-приложений
https://www.google.com/settings/security/lesssecureapps
Ответ 6
В случае, если кто-то еще сталкивается с этим вопросом, вот инструкции для настройки вашего локального сервера GAE для отправки почты