以编程方式从Excel发送电子邮件 - 唯一

时间:2013-01-10 15:29:45

标签: java python perl excel email

情况是这样的: 我有一张excel表,其中包含电子邮件列表以及位置(2列)。这些位置有时与相同的电子邮件相关联。我需要向每个电子邮件地址发送一封电子邮件,其中包含正文中 EACH 相关位置的文字。

示例:

hollis    example@example.net
nashua    example@example.net
concord   example@example.net
Email: To: example@example.net
You have 3 locations (Hollis, Nashua, Concord)

是否有一种简单的方法以编程方式大致 1500 times ?我对python/vb/perl拥有非常轻松的经验以及java的丰富经验。

这是为了工作,我想要一个简单的方法来做到这一点,不仅是我自己,而是其他不那么技术的人都能理解。也许是某种类型的剧本。

编辑:我可以将其保存为CSV格式。

3 个答案:

答案 0 :(得分:1)

在我的帖子uploading file from Access 2010中查看SMTP CDO下的Microsoft CDO。

这是Ron de Bruin的一个例子:

Sub CDO_Mail_Small_Text()
    Dim iMsg As Object
    Dim iConf As Object
    Dim strbody As String
    '    Dim Flds As Variant

    Set iMsg = CreateObject("CDO.Message")
    Set iConf = CreateObject("CDO.Configuration")

    '    iConf.Load -1    ' CDO Source Defaults
    '    Set Flds = iConf.Fields
    '    With Flds
    '        .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    '        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") _
    '                       = "Fill in your SMTP server here"
    '        .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    '        .Update
    '    End With

    strbody = "Hi there" & vbNewLine & vbNewLine & _
              "This is line 1" & vbNewLine & _
              "This is line 2" & vbNewLine & _
              "This is line 3" & vbNewLine & _
              "This is line 4"

    With iMsg
        Set .Configuration = iConf
        .To = "ron@debruin.nl"
        .CC = ""
        .BCC = ""
        .From = """Ron"" <ron@something.nl>"
        .Subject = "New figures"
        .TextBody = strbody
        .Send
    End With

End Sub

它适用于Access 2003和2007,它应该在Excel中工作。您只需根据需要调整它,您就不需要使用任何附加组件(即自定义Python脚本 - 所有这些都在VBA中)。

答案 1 :(得分:0)

我必须做类似的事情。所有过滤和类似过程都是在excel上完成的。

对于邮件,我认为最简单的方法是python(我不记得从哪里获得此代码,归功于其作者):

SMTP_SERVER = 'yourserver'
SMTP_PORT = 25
SMTP_USERNAME = 'username'
SMTP_PASSWORD = 'supersecretpass'
SMTP_FROM = 'foo@bar.com'
SMTP_TO =['recipients@example.com', '']
MESSAGE=""" Here goes the message"""
import smtplib, email
from email import encoders
import os
msg = email.MIMEMultipart.MIMEMultipart()
body = email.MIMEText.MIMEText(MESSAGE)
msg.attach(body)
msg.add_header('From', SMTP_FROM)
msg.add_header('To', ', '.join(SMTP_TO))
msg.add_header('Subject', 'This is a test')
mailer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
mailer.login(SMTP_USERNAME, SMTP_PASSWORD)
mailer.sendmail(SMTP_FROM, SMTP_TO, msg.as_string())
mailer.close()

所以我在excel中准备了一切,然后sed + awk为每封电子邮件生成一个python脚本。然后,执行每个循环。它不是很优雅,但它是我能得到的最快捷方式:)。

希望有所帮助

答案 2 :(得分:0)

如果我们使用制表符分隔文件,则收集每个电子邮件地址的位置非常简单:

#!/usr/bin/perl
use strict; use warnings;

my %email_to_location;

while (<>) {
  my ($location, $email) = split /\t/;
  $location = ucfirst $location;
  $email = lc $email;
  push @{ $email_to_location{$email} }, $location;
}

# the data is now loaded.
for my $email (sort keys %email_to_location) {
  print $email, "\t", join(", ", @{ $email_to_location{$email} }), "\n";
}

输入:

hollis    example@example.net
nashua    example@example.net
concord   example@example.net

输出:

example@example.net     Hollis, Nashua, Concord

输入文件可以指定为命令行参数,也可以作为STDIN给出。输出转到STDOUT。

您也可以调用邮件程序脚本,而不是打印输出,例如

while (my ($email, $locations) = each %email_to_location) {
  my $loc_string = join ", ", @$locations;
  system("mailer-script", $email, $loc_string) == 0
    or die "Mailer script failed: $?";
}

邮件程序脚本不需要进行任何进一步的解析;电子邮件地址和位置字符串作为命令行参数给出。

当然,在Perl脚本中进行邮件也是最好的,但我没有相关的技术诀窍。也许使用其他答案。