Spring/Java邮件:发件人地址被忽略

Spring/Java邮件:发件人地址被忽略,java,spring,gmail,jakarta-mail,Java,Spring,Gmail,Jakarta Mail,我正在使用JavaMail和SpringFW。一切都很顺利,但我不知道为什么发件人地址总是错的;它似乎忽略了它,而是说它真正来自哪里。我想要的会在一瞬间变得更清楚。首先,这是我的代码: 配置 <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="smtp.gmail.com"/> <

我正在使用JavaMail和SpringFW。一切都很顺利,但我不知道为什么发件人地址总是错的;它似乎忽略了它,而是说它真正来自哪里。我想要的会在一瞬间变得更清楚。首先,这是我的代码:

配置

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.gmail.com"/>
    <property name="port" value="25"/>
    <property name="username" value="[my gmail address]"/>
    <property name="password" value="[my password]"/>
    <property name="javaMailProperties">
        <props>
            <prop key="mail.transport.protocol">smtp</prop>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.starttls.enable">true</prop>
            <!--<prop key="mail.debug">true</prop>-->
        </props>
    </property>
</bean>
控制器代码片段

mailService.sendMail(
    contactModel.getEmail(), //From
    Constants.DefaultEmailAddress, //To
    "Enquiry from site", "Phone: " + contactModel.getPhone() + "<br />Message: <br />" + contactModel.getMessage());
mailService.sendMail(
contactModel.getEmail(),//来自
Constants.DefaultEmailAddress,//到
“来自站点的查询”,“电话:+contactModel.getPhone()+”
消息:
“+contactModel.getMessage());

基本上,
contactModel
是一个普通的Java类,具有一些属性,用于在contact-us表单上从用户收集信息。当我发送电子邮件时,我当前看到的发件人地址与收件人地址相同。我搞不清楚的是,我是否需要在配置中做一些更改,或者Gmail是否允许我这样做。想法,有人吗?

我不知道为什么没有设置您的收件人地址,我会放一个日志语句来查看传递给sendMail方法的内容

在类中,您应该使用MailSender而不是MailSenderImpl,因为MailSender是您要使用的接口。在我的应用程序中,我使用SimpleEmailMessage而不是MimemMessage,这对我很有用,下面是我过去使用过的代码片段

@Autowired
private MailSender mailSender;

// Email is my own Pojo with from, to, subject and body properties.
@Transactional(propagation = Propagation.REQUIRES_NEW)
    public void sendEmail(Email email)
    {
            // create email message
            SimpleMailMessage msg = new SimpleMailMessage();
            msg.setFrom(email.getFromAddress());
            msg.setTo(email.getToAddress());
            msg.setSubject(email.getSubject());
            msg.setText(email.getBody());

            // send the message using spring mail sender
            this.mailSender.send(msg);
    }

我知道这个问题已经过时了,但是考虑一下谷歌< P/P >的指示。 您可以使用SMTP或SSL连接到Google Apps邮件服务器。如果使用SMTP连接,则只能向Gmail或Google Apps用户发送邮件;如果使用SSL连接,则可以向任何人发送邮件。

如果您的设备或应用程序支持SSL,请连接端口465或587上的smtp.gmail.com


您正在使用端口25。

谷歌不允许您从您的帐户发送邮件,说您不是某个人(其他域)


因此,它将用您授权的帐户覆盖发件人,并保存您在
X-google-original-from
标题中指定的内容。您必须按照中的指定添加您的外部帐户(或者,如果您有谷歌应用程序,请添加要在谷歌中管理的外部域)。

要使用更改了“setFrom”的gmail帐户到另一个电子邮件地址,您必须执行以下操作:

  • 将新地址添加到您的gmail帐户。说明如下:
  • 设置“始终从其他地址发送”。指令位于同一链接下
  • 在gmail帐户设置/帐户和导入/发送邮件设置中,将您的新电子邮件地址设置为默认地址
  • 在AppConfig.java中键入:

    @Bean
    public JavaMailSender javaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost("smtp.gmail.com");
    mailSender.setPort(587);
    mailSender.setUsername("address@gmail.com");
    mailSender.setPassword(your gmail's password);
    mailSender.getJavaMailProperties().setProperty("mail.smtp.auth", "true");
    mailSender.getJavaMailProperties().setProperty("mail.smtp.starttls.enable", "true");
    return mailSender;
    
    }

  • 在EmailServiceImplementation.java中,键入以下内容:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.stereotype.Service;
    
    @Service       
    public class EmailServiceImpl implements EmailService {
    @Autowired
    private JavaMailSender mailSender;
    @Override
    public void sendEmail(String fromAddress, String toAddress, String subject, String body) {
    SimpleMailMessage mailMessage = new SimpleMailMessage();
    
    mailMessage.setTo(toAddress);
    mailMessage.setFrom("emailWhichYouWishToShow@gmail.com");
    mailMessage.setSubject(subject);
    mailMessage.setText(body);
    
    mailSender.send(mailMessage);
    }
    }
    

  • 谢谢,但我需要使用JavaMailSenderImpl,因为当我尝试仅使用MailSender时,我无法使用HTML。另外,我已经调试了代码,我可以看到正确的地址被发送到sendEmail()方法并在MIMessage对象上设置。@Matt然后使用JavaMailSender接口而不是实现。Frank,这很公平,谢谢。。但这并不能解决我的问题。。。有人能告诉我怎么做我想在这里做的事吗?可能重复:谢谢,弗兰克。。就这样。。。谷歌在这件事上骗了我。如果你加上这个作为回答,那么我将接受它可能的副本
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.stereotype.Service;
    
    @Service       
    public class EmailServiceImpl implements EmailService {
    @Autowired
    private JavaMailSender mailSender;
    @Override
    public void sendEmail(String fromAddress, String toAddress, String subject, String body) {
    SimpleMailMessage mailMessage = new SimpleMailMessage();
    
    mailMessage.setTo(toAddress);
    mailMessage.setFrom("emailWhichYouWishToShow@gmail.com");
    mailMessage.setSubject(subject);
    mailMessage.setText(body);
    
    mailSender.send(mailMessage);
    }
    }