【问题标题】:Set MessageId in header before sending mail发送邮件前在 header 中设置 MessageId
【发布时间】:2013-07-23 00:19:23
【问题描述】:

我在 smtp 服务器,端口 465 上使用 JAVA 邮件从我的应用程序发送邮件。我的需要是,我必须在发送邮件之前设置 Message-ID。我做了一些研发,找到了下面的代码。我已经覆盖了 updateMessageID() 的方法 MimeMessage

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;

public class CustomMimeMessage extends MimeMessage {

public CustomMimeMessage(Session session) {
    super(session);
}

@Override
protected void updateMessageID() throws MessagingException {

    setHeader("Message-ID", "message id");

   }
}

然后我在我的服务中创建了一个 CustomMimeMessage 的实例,然后使用该实例调用 updateMessageID() 方法,但我仍然得到了 gmail 生成的 Message-ID。

【问题讨论】:

  • 这可能意味着当邮件经过 gmail 的服务器时,gmail 在将其转发到目的地之前会修改该标头。你不能使用其他标题吗?
  • 如果您打开JavaMail session debugging,您是否在正在发送的消息中看到正确的Message-ID 标头?如果 Gmail 正在修改通过它的邮件的 Message-ID,那就太糟糕了...

标签: java email grails groovy jakarta-mail


【解决方案1】:

在您的代码中

setHeader("Message-ID", "message id");

您正在尝试将“消息 ID”设置为消息 ID,这是非常错误的,您必须设置一个唯一的 ID,以符合消息 ID (Read This) 的所有规则。

试试这个..,.

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class CustomMimeMessage extends MimeMessage {
Session session;
private static int id = 0;

public CustomMimeMessage(Session session) {
    super(session);
    this.session=session;
}

@Override
protected void updateMessageID() throws MessagingException {
    setHeader("Message-ID", "<" + getUniqueMessageIDValue(session) + ">");
}

public static String getUniqueMessageIDValue(Session ssn) {
    String suffix = null;

    InternetAddress addr = InternetAddress.getLocalAddress(ssn);
    if (addr != null)
        suffix = addr.getAddress();
    else {
        suffix = "javamailuser@localhost"; // worst-case default
    }

    StringBuffer s = new StringBuffer();

    // Unique string is <hashcode>.<id>.<currentTime>.JavaMail.<suffix>
    s.append(s.hashCode()).append('.').append(getUniqueId()).append('.').
      append(System.currentTimeMillis()).append('.').
      append("JavaMail.").
      append(suffix);
    return s.toString();
    }

private static synchronized int getUniqueId() {
        return id++;
}
}

【讨论】:

  • 起初,这对我不起作用,但this answer 帮助了我。我错过了关于覆盖的部分。
【解决方案2】:

我正在做类似的事情,但改为从本地主机发送。这可能会有所帮助。

import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import javax.mail.Transport;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

public class SendEmail {
/**
 * Sends an email based on paramaters passed to it.
 * 
 * @param toWho - the recipiants email address 
 * @param fromWho - the senders email address
 * @param subject - the subject line of the email  
 * @param body - the email message body  
 * @return void
 * @throws AddressException
 * @throws MessageingException
 */
public void sendMail(String toWho, String subject, String body, String fromWho) throws AddressException, MessagingException {

    // Setting Properties
    Properties props = System.getProperties();
    props.put("mail.imaps.ssl.trust", "*"); // trusting all server certificates
    props.setProperty("mail.store.protocol", "imaps");

    // Get the default Session object.
    Session session = Session.getDefaultInstance(props, null);

    // Create a default MimeMessage object.
    MimeMessage message = new MimeMessage(session);
    // Set From header
    message.setFrom(new InternetAddress(fromWho));
    // Set to header
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(toWho));
    // Header set subject
    message.setSubject(subject);
    // Message Body
    message.setContent(body, "text/html; charset=utf-8");
    // Send message
    Transport.send(message);
}
}

【讨论】:

    【解决方案3】:

    您可以在调用 Transport.send() 之前将 message-id 设置为 MimeMessage,方法是像这样扩展 MimeMessage。

    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.internet.MimeMessage;
    
    public class MyMimeMessage extends MimeMessage {
    
        public MailorMimeMessage(Session session) {
            super(session);
        }
    
        @Override
        protected void updateMessageID() throws MessagingException {
            if (getHeader("Message-Id") == null) {
                super.updateMessageID();
            }
        }
    }
    

    并设置自定义 message-id。

    message.setHeader("Message-Id","<MY-MESSAGE-ID>");
    

    【讨论】:

      【解决方案4】:

      您可以在“@”左侧尝试使用 .(dot) 自定义 ID。它对我有用。 检查以下代码sn -p:

      public class CustomMimeMessage extends MimeMessage {
      
      Session session;
      private static int id = 0;
      
      public CustomMimeMessage(Session session) {
          super(session);
          this.session = session;
      }
      
      protected void updateMessageID() throws MessagingException {
          debugLog("Calling updateMessageID()");
          setHeader("Message-ID", "<" + getUniqueMessageIDValue(session) + ">");
      }
      
      public static String getUniqueMessageIDValue(Session ssn) {
          String suffix = null;
      
          InternetAddress addr = InternetAddress.getLocalAddress(ssn);
          if (addr != null) {
              testLog("InternetAddress = " + addr.toString());
              String address = addr.getAddress();
              if (address.contains("@")) {
                  address = address.substring(address.lastIndexOf("@"), address.length());
                  suffix = address;
              }
          }
      
          if (suffix == null) {
              suffix = "@mail";// worst-case default
          }
          testLog("suffix Address = " + suffix);
      
          StringBuffer s = new StringBuffer();
          s.append(System.currentTimeMillis()).append("")
                  .append(getUniqueId()).append(suffix).append(".sm");
          testLog("NEW MESSAGE-ID: " + s.toString());
          return s.toString();
      }
      
      private static synchronized int getUniqueId() {
          return id++;
      }
      

      有关详细信息,请参阅以下 RFC。这些对于创建自定义消息 ID 的语法非常有帮助。

      1. RFC 2822
      2. RFC 5322

      希望这也对你有用。

      【讨论】:

        猜你喜欢
        • 2017-07-06
        • 2013-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-23
        相关资源
        最近更新 更多