Jenkins和Office365电子邮件通知设置

18

环境:

  • Windows 2008 R2
  • Jenkins 1.580.2 LTS
  • Mailer 插件 1.12
  • Email Extension 插件 2.39
  • Java 8

我在将Jenkins CI服务器迁移到Office365的商业帐户后,配置邮件通知时遇到了一些问题。 这是我的配置:

  • Jenkins 启动时支持 StartTLS(使用参数 '-Dmail.smtp.starttls.enabled=true')
  • SMTP服务器为'smtp.office365.com'
  • SMTP端口为587
  • SSL已禁用 SMTP 认证
  • 帐户和密码都正确
  • 帐户指定为username@company.com

看起来消息应该能够正确发送,但实际上电子邮件未被发送。

出现以下错误:

Failed to send out e-mail

com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM

at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2057)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1580)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1097)
at javax.mail.Transport.send0(Transport.java:195)
at javax.mail.Transport.send(Transport.java:124)
at hudson.tasks.Mailer$DescriptorImpl.doSendTestMail(Mailer.java:527)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:298)
at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:161)
at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:96)
at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:121)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875)
at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249)
at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)
at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:745)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:875)
at org.kohsuke.stapler.Stapler.invoke(Stapler.java:648)
at org.kohsuke.stapler.Stapler.service(Stapler.java:237)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:686)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1494)
at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:96)
at hudson.plugins.greenballs.GreenBallFilter.doFilter(GreenBallFilter.java:58)
at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:99)
at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:88)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:48)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:86)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)
at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)
at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:164)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:46)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482)
at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1474)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:370)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489)
at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:960)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1021)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

可以有人帮我解决这个问题吗? 谢谢

7个回答

30

在查看了这里的答案后,我仍然遇到了以下错误:

客户端无权以此发件人身份发送邮件

所以我忘记设置系统管理员电子邮件地址,然后一切正常 - 可能是电子邮件插件使用系统管理员电子邮件地址来连接邮箱。

这里是配置邮件通知(也适用于email ext)的所有步骤:

进入Jenkins主页 > 系统配置:

在Jenkins位置下

System Admin e-mail address: notification@domain.com

在扩展电子邮件通知下:

SMTP server: smtp.office365.com 

Default user e-mail suffix: @domain.com

User Name: notification@domain.com

Password: ###########

Use SSL: no

SMTP Port: 25 or 587

Charset UTF-8

编辑文件:"/etc/default/jenkins"

sudo vim /etc/default/jenkins

添加这一行:

JAVA_ARGS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"

重启Jenkins

sudo /etc/init.d/jenkins restart

在Ubuntu 16上进行了测试。


1
感谢您指出“系统管理员电子邮件地址”设置。我一直在尝试找出如何让“nobody@nowhere”地址消失一个小时。 - Douglas Manley
JAVA_ARGS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"解决了我的问题。 - hao
我提供的系统管理员电子邮件地址是Sometagmymail@domain.com,但在电子邮件中我没有看到标签,而是看到了在Outlook中配置的名称。这只发生在Outlook中,如果我使用Gmail进行配置,则可以正常工作。 - Jerry

11

TLS未启用。

只需在Jenkins启动时添加下一个Java属性:

-Dmail.smtp.starttls.enable=true

因此,对于Ubuntu,可以在此处进行配置:

home/ubuntu# grep ^JAVA_ARGS /etc/default/jenkins
JAVA_ARGS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"

1
谢谢您的评论,但您可能没有仔细阅读说明。在说明中有一点_Jenkins是使用StartTLS支持启动的(使用参数“-Dmail.smtp.starttls.enabled=true”)_。所以我确定Jenkins已经启用了TLS。 - sturman
很抱歉听到那对你没用。我也遇到了完全相同的错误,而对我来说,这正是解决问题的方法。 结果发现Ubuntu升级已经从默认文件中清除了我的自定义-D参数。 当有疑问时,请检查Jenkins的/systemInfo页面,以查看参数是否正确传递。 - Jeroen K
如何添加此属性?在哪里添加?是在哪个文件中? - Kiran Machhewar

3

我使用了SMTP端口25而不是587,并且它可以正常工作。


3
如果您正在使用AWS EC2 AMI Linux,则这是一个常见问题。您需要编辑 /etc/sysconfig/jenkins 并重新启动Jenkins。
您需要同时拥有以下两个设置:
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"

JENKINS_ARGS="-Dmail.smtp.starttls.enable=true"

0
步骤:
  • 打开您的邮件发送者调试
  • 检查您的第一个调试信息中是否有以下内容。

    DEBUG: setDebug: JavaMail version 1.3

  • 请将您的JavaMail版本升级到高于1.4的版本,这样就可以在不进行任何代码更改的情况下解决问题。


0

根据我的测试,只需要以下参数:

  • 系统管理员电子邮件地址:bunny@acme.com
  • SMTP服务器:smtp.office365.com
  • SMTP端口:587
  • SMTP用户名:bunny@acme.com
  • SMTP密码:***
  • 使用SSL:否
  • 字符集UTF-8

如果您不想在低级别上触摸/重启jenkins (-Dmail.smtp.starttls.enable=true),只需添加

mail.smtp.starttls.enable = true高级电子邮件属性

enter image description here


0
如果您正在Kubernetes中使用Jenkins,请在您的YAML文件中添加以下行,并确保您在“系统管理员电子邮件地址:”中具有相同的电子邮件。
containers:
     ...

      env:
        - name: JENKINS_OPTS
          value: "-Dmail.smtp.starttls.enable=true"

        - name: JENKINS_JAVA_OPTIONS
          value: "-Djava.awt.headless=true -Dmail.smtp.starttls.enable=true"

        - name: JAVA_OPTS
          value: >-
            -Djava.awt.headless=true
            -Dmail.smtp.starttls.enable=true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接