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

标签 java email smtp

我正在尝试在我的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); ?>

以下哪种技术最正确?如何使用这些服务才能获得他人的信任?我该怎么做才能不被标记为垃圾邮件?

最佳答案

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

尝试将以下内容添加到您的代码中 - 它们可以使 Gmail 中的操作更好:

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

并确保您的身份 validator 是这样的:

javax.mail.Authenticator auth = new javax.mail.Authenticator(){
    protected PasswordAuthentication getPasswordAuthentication(){ 
        return new PasswordAuthentication(username,password);   
    }
};

Google 仍然存在一些发送限制。它们相当高,但这都是主观的。如果这不起作用,这里还有一些答案:

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) 。即如果您的发件人地址是 [email protected] ,那么 yourdomain.com 需要有一个 MX 记录指向托管您的电子邮件服务器的服务器。

希望有帮助。

关于java - 在我的 java 应用程序中正确实现邮件发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19420990/

相关文章:

java - 不安全地将 Object 向下转换为 Comparable 类型会导致麻烦

安卓 Facebook 图谱 API JSONException 'No value for email'

Javascript 通过 Outlook Express 打开电子邮件

.net - 如何在 .NET 中对 SMTP 进行身份验证?

PHP:PEAR 邮件消息错误

每个连接模型的 Java 线程与 NIO

java - 使用 iText 旋转 PdfSignatureAppearance

java - 无法创建 Java 客户端并将其连接到 C# WebService

Android:如何启动电子邮件联系人?

c# - 在 asp.net 中发送批量电子邮件的最佳方式