【问题标题】:Spring/Java Mail: The FROM address is being ignoredSpring/Java Mail:FROM 地址被忽略
【发布时间】:2012-12-19 06:17:29
【问题描述】:

我在 Spring FW 中使用 JavaMail。一切都很好,但我不知道为什么 FROM 地址总是错误的;它似乎忽略了它,而是说它真正来自哪里。我想要的东西会在一瞬间变得清晰。首先,这是我的代码:

配置

<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>

助手类

@Service("mailService")
public class MailService {

    @Autowired
    private JavaMailSenderImpl mailSender;

    public void sendMail(String from, String to, String subject, String body) {
        try {
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(body, true);
            mailSender.send(message);
        }
        catch (MessagingException ex) {
            Logger.getLogger(MailService.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    //etc...
}

控制器代码片段

mailService.sendMail(
    contactModel.getEmail(), //From
    Constants.DefaultEmailAddress, //To
    "Enquiry from site", "Phone: " + contactModel.getPhone() + "<br />Message: <br />" + contactModel.getMessage());

基本上,contactModel 是一个普通的 Java 类,具有一些用于在 联系我们 表单上收集用户信息的属性。当我发送电子邮件时,我目前看到 FROM 地址与 TO 地址相同。我不知道我是否需要对配置进行一些更改,或者 Gmail 是否可能不允许我这样做。有什么想法吗?

【问题讨论】:

标签: java spring gmail jakarta-mail


【解决方案1】:

Google 不允许您从您的帐户发送邮件,说您不是您本人(其他域)。

因此它会用您授权的帐户覆盖发件人,并保存您在X-google-original-from 标头中指定的内容。您必须按照https://support.google.com/mail/answer/22370?hl=en 中的说明添加您的外部帐户(或者如果您有 Google Apps,则添加您的外部域以在 Google 中进行管理)。

【讨论】:

    【解决方案2】:

    要使用将“setFrom”更改为另一个电子邮件地址的 gmail 帐户,您必须这样做:

    1. 为您的 gmail 帐户添加新地址。说明在这里:https://support.google.com/mail/answer/22370?hl=en
    2. 设置“始终从不同地址发送”。说明在同一链接下。
    3. 在 gmail 帐户设置/帐户和导入/发送邮件中,将您的新电子邮件地址设置为默认值。
    4. 在 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;
      

      }

    5. 在 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);
      }
      }
      

    【讨论】:

      【解决方案3】:

      我不确定为什么没有设置你的收件人地址,我会写一个日志语句来查看传递给 sendMail 方法的内容。

      在您的课程中,您应该使用 MailSender 而不是 MailSenderImpl,因为 MailSender 是您要使用的接口。在我的应用程序中,我使用 SimpleMailMessage 而不是 MimeMessage,这对我有用,下面是我过去使用的代码 sn-p。

      @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);
          }
      

      【讨论】:

      • 谢谢,但我需要使用 JavaMailSenderImpl,因为当我尝试仅使用 MailSender 时,我无法使用 HTML。另外,我已经调试了代码,我可以看到正确的地址被发送到 sendEmail() 方法并在 MimeMessage 对象上设置。
      • @Matt 然后用JavaMailSender接口代替实现。
      • 弗兰克,这很公平,谢谢..但这并不能解决我的问题...有人可以告诉我如何在这里做我想做的事吗?
      【解决方案4】:

      我知道这个问题很老,但请考虑按照 Google 的说明进行操作

      您可以使用 SMTP 或 SSL 连接到 Google Apps 邮件服务器。如果您使用 SMTP 连接,则只能向 Gmail 或 Google Apps 用户发送邮件;如果您使用 SSL 连接,您可以向任何人发送邮件。

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

      你正在使用端口 25。

      【讨论】:

        猜你喜欢
        • 2011-02-23
        • 2014-04-28
        • 2020-05-07
        • 2018-07-26
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        相关资源
        最近更新 更多