如何解决可以在Java中使用MailDev吗?
我在远程服务器上安装了MailDev实例。
我试图了解是否可以通过此伪造的SMTP服务器使用Java(使用标准JavaMailSender)发送电子邮件。
该配置仅需要URL和端口,但就我而言,它不起作用。
它总是返回:
def update(request):
print('hi')
url = request.POST.get('url',None)
qNum = request.POST.get('qNum',None)
print(url)
return JsonResponse(qNum)
WebUI正常运行,我可以看到服务器上的空收件箱。
谢谢。
解决方法
似乎您遇到了连接问题。尽管我不能告诉您原因是什么,也许我可以提供替代解决方案来测试您的电子邮件?
使用Wiser,您可以运行嵌入式SMTP服务器并在junit测试中对其进行查询。我在开放源代码项目Simple Java Mail中使用了很多,并为此创建了a Rule:
package testutil.testrules;
import org.jetbrains.annotations.NotNull;
import org.junit.rules.ExternalResource;
import org.subethamail.smtp.server.SMTPServer;
import org.subethamail.wiser.Wiser;
import org.subethamail.wiser.WiserMessage;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Iterator;
import java.util.List;
/**
* SmtpServerRule - a TestRule wrapping a Wiser instance (a SMTP server in Java),started and stopped right before and after each test.
* <br>
* SmtpServerRule exposes the same methods as the {@link Wiser} instance by delegating the implementation to the instance. These methods,however,can not be
* used outside a JUnit statement (otherwise an {@link IllegalStateException} is raised).
* <br>
* The {@link Wiser} instance can be directly retrieved but also only from inside a JUnit statement.
*/
public class SmtpServerRule extends ExternalResource {
private final Wiser wiser = new Wiser();
private final int port;
public SmtpServerRule(@NotNull Integer port) {
this.port = port;
}
@Override
protected void before() {
this.wiser.setPort(port);
this.wiser.start();
}
@Override
protected void after() {
this.wiser.stop();
}
@NotNull
public Wiser getWiser() {
checkState("getWiser()");
return this.wiser;
}
@NotNull
public List<WiserMessage> getMessages() {
checkState("getMessages()");
return wiser.getMessages();
}
@NotNull
public MimeMessage getOnlyMessage(String envelopeReceiver)
throws MessagingException {
checkState("getMessages()");
List<WiserMessage> messages = getMessages();
assertThat(messages).hasSize(1);
Iterator<WiserMessage> iterator = messages.iterator();
WiserMessage wiserMessage = iterator.next();
assertThat(wiserMessage.getEnvelopeReceiver()).isEqualTo(envelopeReceiver);
MimeMessage mimeMessage = wiserMessage.getMimeMessage();
iterator.remove();
return mimeMessage;
}
@NotNull
public MimeMessageAndEnvelope getOnlyMessage()
throws MessagingException {
checkState("getMessages()");
List<WiserMessage> messages = getMessages();
assertThat(messages).hasSize(1);
Iterator<WiserMessage> iterator = messages.iterator();
WiserMessage wiserMessage = iterator.next();
iterator.remove();
return new MimeMessageAndEnvelope(wiserMessage.getMimeMessage(),wiserMessage.getEnvelopeSender());
}
@NotNull
public MimeMessage getMessage(String envelopeReceiver)
throws MessagingException {
checkState("getMessages()");
List<WiserMessage> messages = getMessages();
Iterator<WiserMessage> iterator = messages.iterator();
while (iterator.hasNext()) {
WiserMessage wiserMessage = iterator.next();
if (wiserMessage.getEnvelopeReceiver().equals(envelopeReceiver)) {
MimeMessage mimeMessage = wiserMessage.getMimeMessage();
iterator.remove();
return mimeMessage;
}
}
throw new AssertionError("message not found for recipient " + envelopeReceiver);
}
@NotNull
public SMTPServer getServer() {
checkState("getServer()");
return wiser.getServer();
}
public boolean accept(String from,String recipient) {
checkState("accept(String,String)");
return wiser.accept(from,recipient);
}
public void deliver(String from,String recipient,InputStream data)
throws IOException {
checkState("deliver(String,String,InputStream)");
wiser.deliver(from,recipient,data);
}
public void dumpMessages(PrintStream out)
throws MessagingException {
checkState("dumpMessages(PrintStream)");
wiser.dumpMessages(out);
}
private void checkState(String method) {
if (this.wiser == null) {
throw new IllegalStateException(format("%s must not be called outside of a JUnit statement",method));
}
}
}
然后我像这样使用它:
public class MailerLiveTest {
private static final Integer SERVER_PORT = 251;
@Rule
public final SmtpServerRule smtpServerRule = new SmtpServerRule(SERVER_PORT);
@Before
public void setup() {
mailer = MailerBuilder.withSMTPServer("localhost",SERVER_PORT).buildMailer();
}
@Test
public void createMailSession_EmptySubjectAndBody() {
// send mail using mailer,which goes to localhost:251
MimeMessageAndEnvelope receivedMimeMessage = smtpServerRule.getOnlyMessage();
Email receivedEmail = EmailConverter.mimeMessageToEmail(receivedMimeMessage.getMimeMessage());
// perform assertions on Email object...
}
}
,
检查mail.smtp.auth 和mail.smtp.starttls.enable 是否设置为false。就我而言,它有效(我还将 localhost 设置为主机,将 1025 设置为端口)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。