Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
6 changes: 4 additions & 2 deletions src/main/java/hudson/cli/MailCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -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;
}
}
28 changes: 25 additions & 3 deletions src/main/java/hudson/tasks/Mailer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -308,6 +307,11 @@ public static final class DescriptorImpl extends BuildStepDescriptor<Publisher>
*/
private String charset;

/**
* The new domain for Message-ID header.
*/
private String messageIdDomain;

/**
* Used to keep track of number test e-mails.
*/
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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));
Expand All @@ -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());
Expand Down
75 changes: 75 additions & 0 deletions src/main/java/jenkins/plugins/mailer/tasks/EnhancedMessage.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
3 changes: 3 additions & 0 deletions src/main/resources/hudson/tasks/Mailer/global.jelly
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ THE SOFTWARE.
<f:entry title="${%Charset}" field="charset">
<f:textbox />
</f:entry>
<f:entry title="${%Replace Message-ID domain with:}" field="messageIdDomain">
<f:textbox />
</f:entry>
</f:advanced>
<f:optionalBlock title="${%Test configuration by sending test e-mail}">
<f:entry title="${%Test e-mail recipient}">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
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.
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
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.
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
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.
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
メッセージIDヘッダーの新しいドメイン名。 一部の電子メールサーバーは、メッセージIDヘッダーのドメイン名がサーバーのドメインに対応していない場合、迷惑メールを送信します。 @mydomain.com を指定して、Message-IDドメイン名または空のテキストをオーバーライドしてデフォルトのままにします。
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
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.
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
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.
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
Новое доменное имя для заголовка Message-ID. Некоторые почтовые серверы помещают электронную почту в нежелательную, если имя домена для заголовка Message-ID не соответствует домену сервера. Укажите @mydomain.com, чтобы переопределить доменное имя для заголовка Message-ID или пустой текст, чтобы оставить его по умолчанию.
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
İ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.
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<div>
Message-ID标头的新域名。 如果Message-ID标头域名与服务器的域不对应,则某些电子邮件服务器会将电子邮件放入垃圾邮件。 指定@ mydomain.com以覆盖Message-ID域名或空文本以将其保留为默认值。
</div>