Java Mail API 路由电子邮件而不修改 FROM header

标签 java email jakarta-mail

我有 2 个电子邮件地址,我想将所有邮件从一个电子邮件地址路由(自动转发)到另一个电子邮件地址。不幸的是,我的邮件客户端上的此功能停止工作,我想创建一个小型控制台应用程序,该应用程序将检查我的电子邮件并每 10 分钟自动转发一次。

我开始使用 Java Mail API 开发 Java 控制台应用程序,但在设置适当的 FROM header 时遇到问题。当我设置原始发件人电子邮件地址并尝试发送电子邮件时,SMTP 抛出异常:SMTP 邮件发件人与经过身份验证的用户名不匹配

这看起来合乎逻辑,因为这样我就可以伪造电子邮件地址发件人,但我不希望电子邮件像我发送的那样出现在其他电子邮件上。出于多种原因需要这样做:

  1. 更容易阅读
  2. 当我想要回复电子邮件时,我希望能够回复原始发件人,而不是我自己

我已经使用 PHP 在我的网站联系表单上实现了这一点,但我不知道如何在 Java 中实现这一点。

<小时/>

我会尝试以更简单的方式解释情况。

我提供了 2 个电子邮件:a@a.comb@b.com

现在电子邮件从 c@c.com 发送至 a@a.com

我想将电子邮件从 a@a.com 转发到 b@b.com,但是当邮件到达 b@b.com 时 在 FROM header 中,我想看到它来自 c@c.com (不是来自 a@a.com)

我的问题是:这是否可能,如果可能,我如何将 header FROM 设置为原始发件人。

这是我的代码:

public class ForwardMailService {

    public static void forward() {
        String popHost = "pop.a.com";
        String popPort = "110"; // 995 SSL

        String imapHost = "imap.a.com";
        String imapPort = "143"; // 993 SSL

        String smtpHost = "smtp.a.com";
        String smtpPort = "25";

        String user = "USERNAME";
        String password = "PASSWORD";

        Properties properties = new Properties();

        properties.put("mail.store.protocol", "imap");
        properties.put("mail.imap.host", imapHost);
        properties.put("mail.imap.port", imapPort);
        properties.put("mail.imap.starttls.enable", "true");

        properties.put("mail.smtp.auth", "true");
        properties.put("mail.smtp.host", smtpHost);
        properties.put("mail.smtp.port", smtpPort);

        Session session = Session.getDefaultInstance(properties);

        try {
            Store store = session.getStore("imap");
            store.connect(imapHost, user, password);

            Folder folder = store.getFolder("inbox");
            folder.open(Folder.READ_ONLY);

            SearchTerm searchTerm = new SentDateTerm(ComparisonTerm.GE, new Date());
            Message[] messages = folder.search(searchTerm);
            if(messages.length != 0) {
                for(Message message : messages) {                    
                    String from = InternetAddress.toString(message.getFrom());
                    String replyTo = InternetAddress.toString(message.getReplyTo());
                    String to = InternetAddress.toString(message.getRecipients(Message.RecipientType.TO));
                    String subject = message.getSubject();
                    Date sentDate = message.getSentDate();

                    Message forward = new MimeMessage(session);
                    forward.setRecipients(Message.RecipientType.TO, InternetAddress.parse("a@a.com));
                    forward.setSubject("Fwd: " + message.getSubject());
                    forward.setFrom(new InternetAddress(from));
                    forward.setReplyTo(InternetAddress.parse(replyTo));

                    MimeBodyPart messageBodyPart = new MimeBodyPart();
                    Multipart multipart = new MimeMultipart();
                    messageBodyPart.setContent(message, "message/rfc822");
                    multipart.addBodyPart(messageBodyPart);
                    forward.setContent(multipart);
                    forward.saveChanges();

                    Transport transport = session.getTransport("smtp");
                    try {
                        transport.connect(smtpHost, user, password);
                        transport.sendMessage(forward, forward.getRecipients(Message.RecipientType.TO));
                    } catch(Exception ex) {
                        ex.printStackTrace();
                    } finally {
                        transport.close();
                    }
                }
            }


            folder.close(false);
            store.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

}

提前致谢。

最佳答案

这完全取决于您的邮件服务器是否允许您将邮件发送到 b@b.com,而不会显示邮件来自 a@a.com。大多数服务器不允许这样做。

更简单的解决方案是从 a@a.com 的收件箱中读取邮件,并使用 Folder.appendMessages 将其附加到 b@b.com 的收件箱中,而不是使用 Transport.sendMessage 重新发送它。

关于Java Mail API 路由电子邮件而不修改 FROM header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56409865/

相关文章:

java - 使用 JavaMail 发送电子邮件,由于 "Connection refused"而收到 "too many connections"- 为什么?

java - 获取错误连接失败,未指定密码?偶尔

java - @Configuration 和 @Bean 注释在此代码中起作用吗?

java - Java jar文件执行时如何调用XML文件

java - 我可以使用线程在 JavaFX 中设置标签文本吗?

PHP 脚本使该用户无法访问我的网站

r - 使用R下载Gmail邮件内容

php - Facebook 登录 : Which parameter should my app identify the user with? id,或电子邮件?

java - Map 可以将 java 类 ByteArrayoutputstream 作为值吗? List 可以保存 javax.mail.MimeMessage 对象吗?

java - 使用托管 Bean 绑定(bind)属性数据表 @JSF