2

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

目前我通过我的 gmail 帐户正常发送电子邮件(我不一定需要使用 gmail)。但是,在发送了几封邮件之后,我指出除非我登录到 gmail Web 应用程序,否则 gmail 会停止发送我的邮件。我通过经典的 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

4 回答 4

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 记录之一。SMTP 使从“受信任的”来源发送邮件成为可能,这通常意味着使其通过垃圾邮件过滤器。

考虑到所有这些,正如您所提到的,您的另一个选择是制作本地电子邮件服务器。但是,该电子邮件服务器需要“发件人”域的 MX 记录。Google 提供了一套非常全面的说明,说明如何使用不同的 DNS 提供商进行设置(全部在左侧列出)。即,如果您的发件人地址是 you@yourdomain.com,那么 yourdomain.com 需要有一个 MX 记录指向托管您的电子邮件服务器的服务器。

希望有帮助。

于 2013-10-21T22:14:46.000 回答
1

安装一个本地 SMTP 服务器(如果还没有的话),这样你就可以远程登录到端口 25。对于 Ubuntu,postfix 很好。

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

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


编辑:您可以直接调用 sendmail 。您只需提供正确的 MIME 编码消息作为正文并通过标准输入将其输入。您应该能够让 JavaMail 为您提供该正文,但我没有这方面的个人经验。

于 2013-10-17T08:48:59.957 回答
1

环顾四周后:

如何使用与 PHP mail() 相同的机制在 Java 中发送邮件

我想我已经为你找到了一些答案:

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

是的你是。但正如本文所述,您可以使用Apache James作为服务器。

通过 PHP,我们可以直接发送电子邮件而无需 SMTP,我也可以使用 Java 来实现吗?

PHPmail()函数也使用 SMTP。php.ini您可以在该文件中找到 SMTP 服务器配置。

你说你使用的是经典的 Java API 你指的是这个吗?如果没有,那你可以试试。

希望这可以帮助。

于 2013-10-26T05:27:49.977 回答
0

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

于 2013-10-26T03:41:13.137 回答