在我的java应用程序中正确实现邮件

时间:2013-10-17 07:47:30

标签: java email smtp

我正在尝试在我的java应用程序中实现邮件系统,我不确定如何发送电子邮件,以便它们受到邮件服务器及其垃圾邮件过滤器的尊重。我将发送电子邮件,其中包含“完成注册”,“忘记密码”以及用户帐户内发出的通知。

目前我正在通过我的Gmail帐户发送电子邮件(我不一定需要使用gmail)。但是在发送了几封邮件之后,我指出gmail停止发送我的邮件,除非我登录到gmail Web应用程序。我通过经典的Java邮件API发送它:

// settings
properties = System.getProperties();
properties.put("mail.smtp.host", smtpServer);
properties.put("mail.smtp.port", smtpPort);
properties.put("mail.smtp.socketFactory.port", smtpPort);
properties.put("mail.smtp.socketFactory.class", SSLSocketFactory.class.getName());
properties.put("mail.smtp.auth", "true");

// sending email via smtp
Session session = Session.getInstance(properties, authenticator);
final MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(subject, "UTF-8");
message.setContent(content, "text/html; charset=UTF-8");
Transport.send(message);

所以我必须使用自己的SMTP服务器吗?那个默认的sendmail linux命令怎么样,为什么我需要SMTP?从PHP我们可以直接发送没有SMTP的电子邮件,我可以用Java实现这个吗?

<?php mail($to, $subject, $message, $headers); ?>

哪种技术最正确?如何使用这些服务让他们信任他人?如果不将其标记为垃圾邮件,我该怎么办?

4 个答案:

答案 0 :(得分:1)

安装本地SMTP服务器(如果尚未安装),以便您可以telnet到端口25.对于Ubuntu postfix很不错。

然后在java程序中使用localhost作为SMTP服务器。

请注意,大多数现代服务器都希望收件人或发件人“属于”服务器以接受邮件。这是为了避免滥用垃圾邮件。


编辑:您可以直接调用sendmail。您只需要提供一个正确的MIME编码的消息作为正文并通过stdin管道它。您应该能够让JavaMail为您提供该机构,但我没有个人经验。

答案 1 :(得分:1)

有几个问题,所以这里有几个答案:

尝试在代码中添加以下内容 - 它们可以让您在Gmail中更好地工作:

properties.put("mail.smtp.socketFactory.fallback", "false");
properties.put("mail.smtp.ssl.enable", "true");

并确保您的身份验证器是这样的:

javax.mail.Authenticator auth = new javax.mail.Authenticator(){
    protected PasswordAuthentication getPasswordAuthentication(){ 
        return new PasswordAuthentication(username,password);   
    }
};
谷歌仍有一些发送限制。它们相当高,但这都是主观的。如果这不起作用,这里有几个答案:

Java允许您直接从您的应用程序发送邮件。但是,如果通过电子邮件垃圾邮件过滤器,这种情况很少发生。因此,即使您可以在没有SMTP的情况下发送它,也不建议这样做。这些电子邮件被阻止的主要原因之一是因为发送电子邮件的IP地址不是该域的有效MX records之一。 SMTP可以从“受信任”的来源发送邮件,通常这意味着它可以通过垃圾邮件过滤器。

考虑到所有这些,正如您所提到的,您的另一个选择是制作本地电子邮件服务器。但是,该电子邮件服务器需要“来自”域的MX记录。 Google provides a pretty comprehensive set of instructions for how to set that with the different DNS providers (all listed down the left side)。即如果您的发件人地址是you@yourdomain.com,那么yourdomain.com需要有一个指向托管您电子邮件服务器的服务器的MX记录。

希望有所帮助。

答案 2 :(得分:1)

在查看问题之后:

How to send mail in Java using same mechanism like in PHP mail()

我想我找到了一些答案:

  

我是否必须使用自己的SMTP服务器?

是的,你这样做。但正如this帖子中所述,您可以将Apache James用作服务器。

  

从PHP我们可以直接发送没有SMTP的电子邮件,我可以用Java实现这个吗?

PHP mail()功能也使用SMTP。您可以在php.ini文件中找到SMTP服务器配置。

你说你使用的是经典的Java API,你指的是this one?如果没有,那么你可以试试。

希望这有帮助。

答案 3 :(得分:0)

处理SMTP服务器对我来说是一个更简单的解决方案。所以我建议安装本地SMTP服务器。 好吧,如果您可以访问要从中发送邮件的域的DNS记录,请创建SPF记录,并将其指向SMTP服务器的IP地址。然后,电子邮件服务会认为电子邮件来自合法服务器,除非您向同一用户发送过多电子邮件并将您的IP地址置于黑名单中。