Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mail API在不修改发件人标头的情况下路由电子邮件_Java_Email_Jakarta Mail - Fatal编程技术网

Java Mail API在不修改发件人标头的情况下路由电子邮件

Java Mail API在不修改发件人标头的情况下路由电子邮件,java,email,jakarta-mail,Java,Email,Jakarta Mail,我有两个电子邮件地址,我想路由自动转发我的所有邮件从一个电子邮件地址到另一个。不幸的是,我的邮件客户端上的这个功能停止工作了,我想创建一个小的控制台应用程序,它可以检查我的电子邮件,并在每10分钟自动转发一次 我开始使用Java邮件API在Java中开发控制台应用程序,但在设置适当的FROM头时遇到了问题。当我设置原始发件人电子邮件地址并尝试发送电子邮件时,SMTP引发异常:SMTP邮件发件人与经过身份验证的用户名不匹配 这是合乎逻辑的,因为这样我可以伪造发件人的电子邮件地址,但我不想让其他电子

我有两个电子邮件地址,我想路由自动转发我的所有邮件从一个电子邮件地址到另一个。不幸的是,我的邮件客户端上的这个功能停止工作了,我想创建一个小的控制台应用程序,它可以检查我的电子邮件,并在每10分钟自动转发一次

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

这是合乎逻辑的,因为这样我可以伪造发件人的电子邮件地址,但我不想让其他电子邮件像我发送的那样发送电子邮件。出于多种原因,需要这样做:

易读性 当我想回复电子邮件时,我希望能够回复我的原始发件人,而不是我自己 我用PHP在我的网站联系人表单上实现了这一点,但我不知道如何用Java实现这一点

我会尽量以更简单的方式解释情况

我发了两封电子邮件:a@a.com和b@b.com

现在电子邮件来自c@c.com到a@a.com

我想转发来自的电子邮件a@a.com到b@b.com,但当邮件到达b@b.com在FROM标题中,我希望看到它来自c@c.com不是从a@a.com

我的问题是:这可能吗?如果可能,我如何将标题从设置为原始发件人

这是我的代码:

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重新发送。

谢谢您的回答。我也在考虑做同样的事情。今天晚些时候我会试试这个,如果有用的话我会给你回复的。