diff --git a/README.adoc b/README.adoc index e11ecd45..df28651a 100644 --- a/README.adoc +++ b/README.adoc @@ -33,6 +33,7 @@ Leave it empty to use the default port for the protocol (`465` if using SSL, `25 * **Reply-To Address**: Address to include in the `Reply-To` header. Up to version `1.16`, only one address is allowed, starting in version `1.17` more than one can be used. * **Charset**: character set to use to construct the message. +* **Replace Message-ID domain with**: Message-ID header new domain name. Specify @mydomain.com to override Message-ID domain name or empty text to leave it default. In order to test the configuration, you can check the _Test configuration by sending test e-mail_ checkbox, provide a destination address at the _Test e-mail recipient_ field and clicking the _Test configuration_ button. diff --git a/src/main/java/hudson/cli/MailCommand.java b/src/main/java/hudson/cli/MailCommand.java index b6e69d24..64216f09 100644 --- a/src/main/java/hudson/cli/MailCommand.java +++ b/src/main/java/hudson/cli/MailCommand.java @@ -23,11 +23,11 @@ */ package hudson.cli; +import jenkins.plugins.mailer.tasks.EnhancedMessage; import hudson.tasks.Mailer; import hudson.Extension; import jenkins.model.Jenkins; -import javax.mail.internet.MimeMessage; import javax.mail.Transport; /** @@ -47,7 +47,9 @@ public String getShortDescription() { protected int run() throws Exception { Jenkins jenkins = Jenkins.getActiveInstance(); jenkins.checkPermission(Jenkins.ADMINISTER); - Transport.send(new MimeMessage(Mailer.descriptor().createSession(),stdin)); + EnhancedMessage message = new EnhancedMessage(Mailer.descriptor().createSession(),stdin); + message.setNewMessageIdDomain(Mailer.descriptor().getMessageIdDomain()); + Transport.send(message); return 0; } } diff --git a/src/main/java/hudson/tasks/Mailer.java b/src/main/java/hudson/tasks/Mailer.java index ebda8c4e..adb4a508 100644 --- a/src/main/java/hudson/tasks/Mailer.java +++ b/src/main/java/hudson/tasks/Mailer.java @@ -36,6 +36,7 @@ import hudson.RestrictedSince; import hudson.Util; import hudson.model.*; +import jenkins.plugins.mailer.tasks.EnhancedMessage; import jenkins.plugins.mailer.tasks.i18n.Messages; import hudson.util.FormValidation; import hudson.util.Secret; @@ -68,8 +69,6 @@ import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMessage; -import javax.servlet.ServletException; import org.apache.tools.ant.types.selectors.SelectorUtils; import org.kohsuke.accmod.Restricted; @@ -308,6 +307,11 @@ public static final class DescriptorImpl extends BuildStepDescriptor */ private String charset; + /** + * The new domain for Message-ID header. + */ + private String messageIdDomain; + /** * Used to keep track of number test e-mails. */ @@ -556,6 +560,16 @@ public void setCharset(String charset) { save(); } + @DataBoundSetter + public void setMessageIdDomain(String messageIdDomain) { + this.messageIdDomain = messageIdDomain; + save(); + } + + public String getMessageIdDomain() { + return this.messageIdDomain; + } + @DataBoundSetter public void setAuthentication(@CheckForNull SMTPAuthentication authentication) { this.authentication = authentication; @@ -626,6 +640,13 @@ public FormValidation doCheckDefaultSuffix(@QueryParameter String value) { return FormValidation.error(Messages.Mailer_Suffix_Error()); } + public FormValidation doCheckMessageIdDomain(@QueryParameter String value) { + if (value.matches("^@[A-Za-z0-9.\\-]+") || fixEmptyAndTrim(value)==null) + return FormValidation.ok(); + else + return FormValidation.error(Messages.Mailer_Suffix_Error()); + } + /** * Send an email to the admin address * @throws IOException in case the active jenkins instance cannot be retrieved @@ -660,7 +681,7 @@ public FormValidation doSendTestMail( password = null; } - MimeMessage msg = new MimeMessage(createSession(smtpHost, smtpPort, useSsl, username, password)); + EnhancedMessage msg = new EnhancedMessage(createSession(smtpHost, smtpPort, useSsl, username, password)); msg.setSubject(Messages.Mailer_TestMail_Subject(testEmailCount.incrementAndGet()), charset); msg.setText(Messages.Mailer_TestMail_Content(testEmailCount.get(), jenkins.getDisplayName()), charset); msg.setFrom(stringToAddress(adminAddress, charset)); @@ -669,6 +690,7 @@ public FormValidation doSendTestMail( } msg.setSentDate(new Date()); msg.setRecipient(Message.RecipientType.TO, stringToAddress(sendTestMailTo, charset)); + msg.setNewMessageIdDomain(this.messageIdDomain); Transport.send(msg); return FormValidation.ok(Messages.Mailer_EmailSentSuccessfully()); diff --git a/src/main/java/jenkins/plugins/mailer/tasks/EnhancedMessage.java b/src/main/java/jenkins/plugins/mailer/tasks/EnhancedMessage.java new file mode 100644 index 00000000..ae2bffa9 --- /dev/null +++ b/src/main/java/jenkins/plugins/mailer/tasks/EnhancedMessage.java @@ -0,0 +1,75 @@ +package jenkins.plugins.mailer.tasks; + +import javax.mail.MessagingException; +import javax.mail.Session; +import javax.mail.internet.MimeMessage; +import java.io.InputStream; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** + * A special class for overriding Message-ID header. + * Some e-mail servers put the mail into spam if Message-ID header domain + * does not correspond to e-mail server domain. This class helps to overcome the issue. + * + * @author Vitaly Krivenko + */ +@Restricted(NoExternalUse.class) +public class EnhancedMessage extends MimeMessage +{ + /** + * The new Message-ID domain that will override the default one. + */ + private String newMessageIdDomain; + + /** + * Initializes EnhancedMessage class instance. + * @param session the session context + */ + public EnhancedMessage(Session session) { + super(session); + } + + /** + * Initializes EnhancedMessage class instance. + * @param session the session context + * @param is the message input stream + */ + public EnhancedMessage(Session session, InputStream is) throws MessagingException { + super(session, is); + } + + /** + * Initializes EnhancedMessage class instance. + * @param source the message to copy + */ + public EnhancedMessage(EnhancedMessage source) throws MessagingException { + super(source); + } + + /** + * Sets the new Message-ID header domain which will override the default one. + * @param newDomain The new Message-ID header domain + */ + public void setNewMessageIdDomain(String newDomain) + { + this.newMessageIdDomain = newDomain; + } + + /** + * Overrides default javamail behaviour by replacing the default Message-ID domain with the new one. + */ + @Override + protected void updateMessageID() throws MessagingException { + super.updateMessageID(); + if (this.newMessageIdDomain != null && this.newMessageIdDomain.length() > 0 && this.newMessageIdDomain.startsWith("@")) { + String messageId = super.getMessageID(); + int index = messageId.lastIndexOf('@'); + if (index >= 0) { + String firstPart = messageId.substring(0, index); + String newMessageId = firstPart + this.newMessageIdDomain + '>'; + setHeader("Message-ID", newMessageId); + } + } + } +} diff --git a/src/main/java/jenkins/plugins/mailer/tasks/MimeMessageBuilder.java b/src/main/java/jenkins/plugins/mailer/tasks/MimeMessageBuilder.java index bf64639e..fc76f529 100644 --- a/src/main/java/jenkins/plugins/mailer/tasks/MimeMessageBuilder.java +++ b/src/main/java/jenkins/plugins/mailer/tasks/MimeMessageBuilder.java @@ -195,7 +195,8 @@ public MimeMessageBuilder addRecipients(@Nonnull String recipients, @Nonnull Mes * @throws UnsupportedEncodingException in case of encoding problems */ public MimeMessage buildMimeMessage() throws MessagingException, UnsupportedEncodingException { - MimeMessage msg = new MimeMessage(Mailer.descriptor().createSession()); + EnhancedMessage msg = new EnhancedMessage(Mailer.descriptor().createSession()); + msg.setNewMessageIdDomain(Mailer.descriptor().getMessageIdDomain()); setJenkinsInstanceIdent(msg); diff --git a/src/main/resources/hudson/tasks/Mailer/global.jelly b/src/main/resources/hudson/tasks/Mailer/global.jelly index 8316c673..d95674e3 100644 --- a/src/main/resources/hudson/tasks/Mailer/global.jelly +++ b/src/main/resources/hudson/tasks/Mailer/global.jelly @@ -47,6 +47,9 @@ THE SOFTWARE. + + + diff --git a/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain.html b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain.html new file mode 100644 index 00000000..74016979 --- /dev/null +++ b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain.html @@ -0,0 +1,3 @@ +
+ Message-ID header new domain name. Some e-mail servers put e-mail to junk if Message-ID header domain name does not correspond to server's domain. Specify @mydomain.com to override Message-ID domain name or empty text to leave it default. +
\ No newline at end of file diff --git a/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_de.html b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_de.html new file mode 100644 index 00000000..a9e7e405 --- /dev/null +++ b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_de.html @@ -0,0 +1,3 @@ +
+ Message-ID header Neuer Domänenname. Einige E-Mail-Server versetzen E-Mails in Junk-Mails, wenn der Domänenname des Message-ID header nicht der Domäne des Servers entspricht. Geben Sie @mydomain.com an, um den Domänennamen der Message-ID oder den leeren Text zu überschreiben und die Standardeinstellung beizubehalten. +
\ No newline at end of file diff --git a/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_fr.html b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_fr.html new file mode 100644 index 00000000..e7d6a0a4 --- /dev/null +++ b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_fr.html @@ -0,0 +1,3 @@ +
+ Nouveau nom de domaine en-tête de l'ID de message. Certains serveurs de messagerie rejettent le courrier indésirable si le nom de domaine de l'en-tête Message-ID ne correspond pas au domaine du serveur. Spécifiez @mondomaine.com pour remplacer le nom de domaine Message-ID ou le texte vide pour le laisser par défaut. +
\ No newline at end of file diff --git a/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_ja.html b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_ja.html new file mode 100644 index 00000000..f335d2a5 --- /dev/null +++ b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_ja.html @@ -0,0 +1,3 @@ +
+ メッセージIDヘッダーの新しいドメイン名。 一部の電子メールサーバーは、メッセージIDヘッダーのドメイン名がサーバーのドメインに対応していない場合、迷惑メールを送信します。 @mydomain.com を指定して、Message-IDドメイン名または空のテキストをオーバーライドしてデフォルトのままにします。 +
\ No newline at end of file diff --git a/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_nl.html b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_nl.html new file mode 100644 index 00000000..30db0a33 --- /dev/null +++ b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_nl.html @@ -0,0 +1,3 @@ +
+ Meddelelses-ID-overskrift nyt domænenavn. Nogle e-mail-servere sætter e-mail til skrammel, hvis meddelelses-ID-domænenavn ikke svarer til serverens domæne. Specificer @mydomain.com for at tilsidesætte Message-ID-domænenavn eller tom tekst for at lade det være standard. +
\ No newline at end of file diff --git a/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_pt_BR.html b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_pt_BR.html new file mode 100644 index 00000000..0d5a0126 --- /dev/null +++ b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_pt_BR.html @@ -0,0 +1,3 @@ +
+ Novo nome de domínio do cabeçalho de ID da mensagem. Alguns servidores de email colocam o lixo eletrônico como lixo eletrônico se o nome do domínio do cabeçalho do ID da mensagem não corresponder ao domínio do servidor. Especifique @mydomain.com para substituir o nome de domínio do ID da mensagem ou o texto vazio para deixá-lo como padrão. +
\ No newline at end of file diff --git a/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_ru.html b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_ru.html new file mode 100644 index 00000000..52643f54 --- /dev/null +++ b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_ru.html @@ -0,0 +1,3 @@ +
+ Новое доменное имя для заголовка Message-ID. Некоторые почтовые серверы помещают электронную почту в нежелательную, если имя домена для заголовка Message-ID не соответствует домену сервера. Укажите @mydomain.com, чтобы переопределить доменное имя для заголовка Message-ID или пустой текст, чтобы оставить его по умолчанию. +
\ No newline at end of file diff --git a/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_tr.html b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_tr.html new file mode 100644 index 00000000..e912a882 --- /dev/null +++ b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_tr.html @@ -0,0 +1,3 @@ +
+ İleti kimliği başlığı yeni etki alanı adı. Bazı e-posta sunucuları, Message-ID başlık etki alanı adı sunucunun etki alanına uymuyorsa e-postaları önemsiz duruma getirir. Message-ID etki alanı adını geçersiz kılmak için @mydomain.com adresini veya varsayılanı bırakmak için boş metni belirtin. +
\ No newline at end of file diff --git a/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_zh_TW.html b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_zh_TW.html new file mode 100644 index 00000000..d3fd4fdf --- /dev/null +++ b/src/main/resources/hudson/tasks/Mailer/help-messageIdDomain_zh_TW.html @@ -0,0 +1,3 @@ +
+ Message-ID标头的新域名。 如果Message-ID标头域名与服务器的域不对应,则某些电子邮件服务器会将电子邮件放入垃圾邮件。 指定@ mydomain.com以覆盖Message-ID域名或空文本以将其保留为默认值。 +
\ No newline at end of file