首页 \ 问答 \ 通过Java API发送邮件:即使附件失败,如何发送邮件?(Sending mail via Java API: How to send the mail even if attachment fails?)

通过Java API发送邮件:即使附件失败,如何发送邮件?(Sending mail via Java API: How to send the mail even if attachment fails?)

这是我的代码:

try {
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    message.setSubject(messageSubject);
    message.setText(messageBody);

    BodyPart messageBodyPart1 = new MimeBodyPart();
    messageBodyPart1.setText(messageBody);
    MimeBodyPart messageBodyPart2 = new MimeBodyPart();
    String filename = attachment;
    DataSource source = new FileDataSource(filename);
    messageBodyPart2.setDataHandler(new DataHandler(source));
    messageBodyPart2.setFileName(filename);
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart1);
    multipart.addBodyPart(messageBodyPart2);    
    message.setContent(multipart );

    Transport.send(message);
} catch (MessagingException mex) {
    mex.printStackTrace();
}

即使邮件附件由于某种原因失败,我怎么还能发送电子邮件? ATM如果附件失败,则不发送电子邮件,这在我的情况下是不好的。 我应该使用另一个try / catch语句吗?我最后也应该这样做吗? 我是Java新手(3-4周)

编辑:将我的代码更改为此,但没有工作

try {
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    message.setSubject(messageSubject);
    message.setText(messageBody);

    try {
        BodyPart messageBodyPart1 = new MimeBodyPart();
        messageBodyPart1.setText(messageBody);
        MimeBodyPart messageBodyPart2 = new MimeBodyPart();
        String filename = attachment;
        DataSource source = new FileDataSource(filename);
        messageBodyPart2.setDataHandler(new DataHandler(source));
        messageBodyPart2.setFileName(filename);
        Multipart multipart = new MimeMultipart();
        multipart.addBodyPart(messageBodyPart1);
        multipart.addBodyPart(messageBodyPart2);    
        message.setContent(multipart);
    } catch (Exception e) {
        message.setText(messageBody2);
        e.printStackTrace();
    }

    Transport.send(message);

} catch (MessagingException mex) {
    mex.printStackTrace();
}

This is my code:

try {
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    message.setSubject(messageSubject);
    message.setText(messageBody);

    BodyPart messageBodyPart1 = new MimeBodyPart();
    messageBodyPart1.setText(messageBody);
    MimeBodyPart messageBodyPart2 = new MimeBodyPart();
    String filename = attachment;
    DataSource source = new FileDataSource(filename);
    messageBodyPart2.setDataHandler(new DataHandler(source));
    messageBodyPart2.setFileName(filename);
    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart1);
    multipart.addBodyPart(messageBodyPart2);    
    message.setContent(multipart );

    Transport.send(message);
} catch (MessagingException mex) {
    mex.printStackTrace();
}

How can I still send the email even if mail attachment fails for some reason? ATM if attachment fails, the email is not sent, which is bad in my case. Should I use another try/catch statement and should I have finally as well? Im new to Java (3-4 weeks)

edit: Changed my code to this, but didnt work

try {
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    message.setSubject(messageSubject);
    message.setText(messageBody);

    try {
        BodyPart messageBodyPart1 = new MimeBodyPart();
        messageBodyPart1.setText(messageBody);
        MimeBodyPart messageBodyPart2 = new MimeBodyPart();
        String filename = attachment;
        DataSource source = new FileDataSource(filename);
        messageBodyPart2.setDataHandler(new DataHandler(source));
        messageBodyPart2.setFileName(filename);
        Multipart multipart = new MimeMultipart();
        multipart.addBodyPart(messageBodyPart1);
        multipart.addBodyPart(messageBodyPart2);    
        message.setContent(multipart);
    } catch (Exception e) {
        message.setText(messageBody2);
        e.printStackTrace();
    }

    Transport.send(message);

} catch (MessagingException mex) {
    mex.printStackTrace();
}

原文:https://stackoverflow.com/questions/18107716
更新时间:2022-07-08 10:07

最满意答案

NaN不等于任何东西,甚至不是NaN

在MDN参考

更详细的问题和答案

有关权威来源,请参阅ECMAScript 5官方规范 ,第11.9.1节和第11.9.3节:

1. If Type(x) is the same as Type(y), then
     [...]
  c. If Type(x) is Number, then
     i. If x is NaN, return false.
    ii. If y is NaN, return false.
        [...]

NaN is not equal to anything, not even NaN.

Reference at MDN

More detailed SO question and answer

For the authoritative source, see the ECMAScript 5 Official Specification, sections 11.9.1 and 11.9.3:

1. If Type(x) is the same as Type(y), then
     [...]
  c. If Type(x) is Number, then
     i. If x is NaN, return false.
    ii. If y is NaN, return false.
        [...]

相关问答

更多
  • NaN不等于任何东西,甚至不是NaN 。 在MDN参考 更详细的问题和答案 有关权威来源,请参阅ECMAScript 5官方规范 ,第11.9.1节和第11.9.3节: 1. If Type(x) is the same as Type(y), then [...] c. If Type(x) is Number, then i. If x is NaN, return false. ii. If y is NaN, return false. [...] ...
  • volatile关键字不是同步原语。 它只是防止缓存线程上的值,但它不会阻止两个线程修改相同的值并将其同时写回。 假设两个线程到达需要增加计数器的时间点,现在这个计数器已经设置为5.两个线程都看到了5,使得6出来了,然后把它写回到计数器中。 如果计数器不是volatile ,则两个线程都可以假定他们知道该值为6,并跳过下一次读取。 然而,它是波动的,所以他们都会读回6,并继续增加。 由于线程没有进入锁步,所以在输出中可能会看到一个不同于10000的值,但实际上没有机会看到20000。 The volatil ...
  • 没有什么是表现得很奇怪,它的行为应该是应有的。 当你有一条以上的记录,并且你正在使用像MAX()/MIN()/COUNT()...这样的聚合函数时,如果没有聚合函数的其他列具有不同的值,则会选择其中一条(不确定按什么顺序,我随机思考)。 因此,如果您希望它们返回相同的内容,那么您应该使用以下查询: SELECT UNIX_TIMESTAMP(created_at), created_at, message FROM messages WHERE UNIX_TIMESTAMP(created_at) =(S ...
  • 问题在于你已经在start_hour列名称周围放置了单引号。 实际上,将一个字符串与“start_hour”值进行比较的值为“1”,这会导致一个真实值,并因此返回所有行。 由于单引号被解释为文字字符串,因此您应该使用反标符号(`)来封装列名/表名,而不是单引号。 select start_hour from wp_t128customCalendarBookings WHERE `start_hour` < 1 The problem is that you've put single quotes ar ...
  • 它不是以这种方式实现的 ,它是这样指定的 : 15.1.1全局对象的值属性 15.1.1.1 NaN NaN的值是NaN (见8.5)。 此属性具有属性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}。 15.1.1.2 Infinity Infinity的值是+∞(见8.5)。 此属性具有属性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}。 15 ...
  • 事情是,退格往往是^H和删除往往^? - 和一些白痴终端交换两个或两个提供相同的字符。 当某些终端出现错误时,按键会产生ESC~ , ESC会将vim置于命令模式,然后~将交换字符的情况,依此类推。 您还有终端功能的terminfo或termcap数据库以应对 - 如果您的TERM环境变量与运行的终端完全不匹配,将会选择错误的功能,并且应用程序将生成错误的转义序列以正确控制终奌站。 当然,在Windows上运行进一步复杂化的一切,因为终端不是平台的本地特性 - CMD.EXE做自己的事 ...
  • 您的路线缺少行动: routeTemplate: "api/{controller}/{action}/{id}", 所以它认为{id}是XGetUsers 。 Your route is missing the action: routeTemplate: "api/{controller}/{action}/{id}", so it was thinking that {id} was XGetUsers.
  • 根据定义, NaN是具有未定义数值结果的操作的返回值。 除了作为全局对象的一部分,它还是Number对象的一部分: Number.NaN 。 这就是您看到您描述的行为的原因。 NaN是Number对象的一部分。 它仍然是一种数字数据类型,但未定义为实数。 By definition, NaN is the return value from operations which have an undefined numerical result. Aside from being part of the gl ...
  • 你应该尝试使用jQuery的getScript ; 它处理你不想参与的所有混乱:添加async属性,定义readystatechange和load事件处理程序,避免内存泄漏,... 编辑: 至于你的根问题:如果你异步加载它,我认为你不能使这个脚本工作。 document.write本质上是同步的。 请参阅此相关问题: 警告:忽略从异步加载的外部脚本调用document.write()。 这是如何解决的? You should try using jQuery's getScript; it handles ...
  • 您没有将任何参数传递给函数。 已声明a和b ,但未传递给该函数。 var num1 = prompt("How much money do you have?"); var num2 = prompt("How much money will you add?"); var a = parseInt(num1); var b = parseInt(num2); function addTwoNumbers(a,b) { return a + b; } alert("you will have " ...

相关文章

更多

最新问答

更多
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)
  • 是否可以嵌套hazelcast IMaps?(Is it possible to nest hazelcast IMaps? And whick side effects can I expect? Is it a good Idea anyway?)
  • UIViewAnimationOptionRepeat在两个动画之间暂停(UIViewAnimationOptionRepeat pausing in between two animations)
  • 在x-kendo-template中使用Razor查询(Using Razor query within x-kendo-template)
  • 在BeautifulSoup中替换文本而不转义(Replace text without escaping in BeautifulSoup)
  • 如何在存根或模拟不存在的方法时配置Rspec以引发错误?(How can I configure Rspec to raise error when stubbing or mocking non-existing methods?)
  • asp用javascript(asp with javascript)
  • “%()s”在sql查询中的含义是什么?(What does “%()s” means in sql query?)
  • 如何为其编辑的内容提供自定义UITableViewCell上下文?(How to give a custom UITableViewCell context of what it is editing?)
  • c ++十进制到二进制,然后使用操作,然后回到十进制(c++ Decimal to binary, then use operation, then back to decimal)
  • 以编程方式创建视频?(Create videos programmatically?)
  • 无法在BeautifulSoup中正确解析数据(Unable to parse data correctly in BeautifulSoup)
  • webform和mvc的区别 知乎
  • 如何使用wadl2java生成REST服务模板,其中POST / PUT方法具有参数?(How do you generate REST service template with wadl2java where POST/PUT methods have parameters?)
  • 我无法理解我的travis构建有什么问题(I am having trouble understanding what is wrong with my travis build)
  • iOS9 Scope Bar出现在Search Bar后面或旁边(iOS9 Scope Bar appears either behind or beside Search Bar)
  • 为什么开机慢上面还显示;Inetrnet,Explorer
  • 有关调用远程WCF服务的超时问题(Timeout Question about Invoking a Remote WCF Service)