For a long time now I’ve wanted to write a script that would automatically generate email traffic within an Exchange Server test lab environment.
Having realistic email traffic within a test lab environment means you can do such real world activities as:
- test backup and recovery scenarios
- learn how to use message tracking logs
- test archiving solutions
In the past I’ve used some simple VBScripts that just sent random messages via SMTP as a way to fill up test lab mailboxes. That approach had some disadvantages though. The scripts I wrote only sent a stream of email messages at a single rate rather than at varying rates through the day as you would see in the real world. They also filled up inboxes only, never putting the messages in the Sent Items folder for the From address.
So I got to work creating a new PowerShell script to generate the email traffic. I tracked some of the development in the forums and can now share the complete script here.
This script does require some setting up before you run it, so please read the instructions to get it working in your test lab. I have only written and tested this script for Exchange 2010 training lab environments on the assumption that most people will be training for the latest version of Exchange.
Before we go further let me be absolutely clear that this script is for test lab environments only. Under no circumstances should you attempt to run this script in a production environment.
Using the Start-MailGen.ps1 Script in Your Test Lab
The scripts uses the Exchange Web Services Managed API so the first step is to download and install that on your test lab server.
Next, download the script and extract the three files to your server. I placed mine in C:ScriptsMailGen.
Download the script files from Github.
Open the Start-MailGen.ps1 file in the PowerShell editor or in Notepad and check the following items.
The $dllfolderpath variable is set to the default installation path for the EWS Managed API v2.0. If you install a different version, or to a different path, update this variable.
#Path to the Exchange Web Services DLL $dllfolderpath = "C:Program FilesMicrosoftExchangeWeb Services1.1Microsoft.Exchange.WebServices.dll"
The script uses a switch statement to determine how many emails to send each hour of the day. These values are what I use but you can change them up or down to suit your test lab. The hours 6am to 7pm are individually specified, and then the default value at the end is used for the remaining hours of the day.
06 {$sendcount = 50} 07 {$sendcount = 80} 08 {$sendcount = 600} 09 {$sendcount = 600} 10 {$sendcount = 800} 11 {$sendcount = 1000} 12 {$sendcount = 600} 13 {$sendcount = 600} 14 {$sendcount = 800} 15 {$sendcount = 800} 16 {$sendcount = 900} 17 {$sendcount = 400} 18 {$sendcount = 200} 19 {$sendcount = 80} default {$sendcount = 10}
You can just specify even numbers like the above because the script varies the send count further by adding a random number each time. This will give you a realistic level of email traffic through the different hours of the day.
The service account that will be running the script needs to have its own mailbox, and also have impersonation rights granted to it. I run mine as Administrator since it is just a test lab. Open the Exchange Management Shell and run the following command to grant the impersonation rights.
[PS] C:\>New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:administrator
You may also need to set your script execution policy to unrestricted.
[PS] C:\>Set-ExecutionPolicy Unrestricted
Also, as the script file was downloaded from the internet you may need to right-click the file and choose Properties, and then click the Unblock button.
The script also depends on the Active Directory remote administration tools. These should be installed already on an Exchange 2010 mailbox server, but if you’re running the script from a non-Exchange server you may need to install them.
Finally, to start generating email traffic open the Exchange Management Shell and run the script.
[PS] C:ScriptsMailgen>.Start-MailGen.ps1
The script begins to send email and will show a progress indicator.
The script will select a random sender and recipient from the available mailboxes and distribution groups in your test lab environment, and then construct a random email message using the two files that are provided with the script.
After sending the applicable number of emails for that hour of the day the script will sleep for 5 minute blocks until it reaches the next hour, and will start sending again.
You can leave the script running for several days if you wish, or set it as a scheduled task to ensure that it starts up again if the server is rebooted.
How to Hard-Code the EWS URL
A few people have seen Autodiscover errors in their test lab and, if they have verified that Autodiscover is otherwise working fine, may need to look at hard-coding the EWS URL in the script. To do so find the following line and comment it out with the hash character:
#$service.AutodiscoverUrl($user.Properties.mail)
Now add a new line below it with the following:
$service.Url = "https://ho-ex2010-mb1.exchangeserverpro.net/EWS/Exchange.asmx"
Replace the URL above with the appropriate server FQDN for your own server environment.
Hi Paul,
tried this script on an EX 2016 (2 servers) in a test domain (no internet connectivity)
when i run it i get this error on all mailboxes:
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. The underlying connection was closed: Could not establish trust relationship for the SSL/TLS se
cure channel.”
At D:\sources\Start-MailGen\Start-MailGen.ps1:296 char:5
+ $mail.SendAndSaveCopy()
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServiceRequestException
any help will be most appreciated/
thnx.
Probably need to force PowerShell to use TLS 1.2. This is true in Exchange Online and might be the case for on-premises too, depending on your configuration. See https://office365itpros.com/2021/11/12/microsoft-flags-need-upgrade-powershell-scripts-use-tls-12/ for EXO detail.
Hi Paul,
Thank you for the script. Today I have installed the ExchangeServer2016-x64-CU19 version.
Do you have an idea about the error?
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. The remote server returned an error:
(401) Unauthorized.”
At C:\EmailGen\Start-MailGen.ps1:301 char:5
+ $mail.SendAndSaveCopy()
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServiceRequestException
Great script…This along with the AD Starwars Powershell Module, https://itfordummies.net/2017/08/21/active-directory-star-wars-powershell-module/ i was able to completly build en exchange test environment. Confirmed this works in Exchange 2016 CU17, sortof. the script runs through several iterations before failing with each message with the following error.
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. The remote server returned an error:
(401) Unauthorized.”
At C:\temp\mailgen\Start-MailGen.ps1:301 char:5
+ $mail.SendAndSaveCopy()
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServiceRequestException
if i pause the script and wait a few hours, and start it, it works again, for a while.
Would get an impersonation error if running psh shell as administrator, so had to ‘Run-as my service account (sender) account.
Then script would run but hang at Subject…
[PS] C:\Scripts\MailGen>.\Start-MailGen.ps1
Preparing EWS
Starting email generation loop
*** Will send 14 emails this hour
Retrieving recipient list
1 mailboxes found
0 distribution groups found
1 total recipients found
*** New email message
Sender: mailbot@wacketywack.local
Subject: Parley
Turns out my sender could only see its own mailbox when enumerating recipients.
Found Exchange creates an Active Directory Security Group called View-Only Organization Management which you have to add your service account to.
Members of this group can view the properties of all objects in your Exchange 2010 environment, so can list all the mailboxes on a given server.
i’m having the same problem with the impersonation. can you please explain what exactly did you do?
what do you mean “run-as my service account”? did you create service account? what permissions you gave it?
please explain the steps…this error is killing me here.
(exchange 2016)
thank you.
Would get an impersonation error if running psh shell as administrator, so had to ‘Run-as my service account (sender) account.
Then script would run but hang at Subject…
[PS] C:\Scripts\MailGen>.\Start-MailGen.ps1
Preparing EWS
Starting email generation loop
*** Will send 14 emails this hour
Retrieving recipient list
1 mailboxes found
0 distribution groups found
1 total recipients found
*** New email message
Sender: mailbot@wacketywack.local
Subject: Parley
Turns out my sender could only see its own mailbox when enumerating recipients.
Found Exchange creates an Active Directory Security Group called View-Only Organization Management which you have to add your service account to.
Members of this group can view the properties of all objects in your Exchange 2010 environment, so can list all the mailboxes on a given server.
Dear Paul,
I want to generate an e-mail traffic of 50,000 e-mails for 20, office 365 users.
I had used multi threading to reduce the time to generate traffic, where number of threads will be number of users, in my case it is 20 threads.
I had used the concepts from Start-MailGen.ps1 and the SendMail function in Start-MailGen.ps1 is added as a runspace script as shown below:
$Jobs = @()
foreach ($user in $Users) {
$Job = [powershell]::Create().AddScript($SendMail).AddParameter(“sender”, $user)
$Job.RunspacePool = $RunspacePool
$Jobs += New-Object PSObject -Property @{
RunNum = $_
Job = $Job
Result = $Job.BeginInvoke()
}
}
Could you please look into this code snippet and let me know what is wrong here as this script runs fine, but No emails are generated.
With Regards,
Devraj
Hi Paul,
thank you for that script, it is very usefull. I have some troubles like guys here had.
Hardcoded EWS url and Exception calling “SendAndSaveCopy” with “0” argument(s): “The Url property on the ExchangeService object must be set.”.
I have problem that i change EWS url from https://ex1.domain.local/EWS/Exchange.asmx to https://mail.domain.com/EWS/Exchange.asmx .
I also change certificate from self signed to wildcard for all services. It is problem, if i define URL with domain mail.domain.com and wildcard certificate it doesnt work.
If I use ex1.domain.local with non wilcard certificate it works. I tested self signed and also SAN certificate.
I am testing it on EX2013 CU23. If you have an idea why it have this problem share it please.
Thans Jan
Pingback: project
HI
when i run script i face to this Error :
Exception calling “SendAndSaveCopy” with “0” argument(s): “The account does not have permission to impersonate the requested user.”
i have exchange 2016 and windows server 2012 r2 and it is just the only mail sever in lab, i upgrade exchange server form CU5 to CU9 successfully
So for solving this problem i Done steps as you said
1-i Checked mailbox Owner an run this script by owner user
2-i had impersonation rights granted to user (Owner – User that use for exchange installation)
so i checked all step one by one. but i still see that problem , what should i have to do?
thanks for your help Mr Paul
This rocks! thank you very much.
I know this is probably a silly question…but will this script work on an Exchange 2007 SP3 running on Windows Server 2003 R2 x64?
Works perfectly on Exchange 2016 CU 5, thank you very much Paul!
Hi Paul,
I could fix the above issue by hardcoding EWS url as you mnetioned above. Thank you!
One more question:
The script is executing fine and the mails are being sent sucessfully. But I do not see any data on the DB yet? the DB size is not changing at all. I have mentioned the correct DB for the mailboxes.
Any suggestions?
Thanks,
Venku
Hi Paul,
I am seeing the below error:
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. Unable to connect to the remote server”
At C:\Scripts\Start-MailGen\Start-MailGen.ps1:296 char:5
+ $mail.SendAndSaveCopy()
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServiceRequestException
Any suggestions?
Thanks,
VM
Hi Paul,
I am seeing the below error:
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. Unable to connect to the remote server”
At C:\Scripts\Start-MailGen\Start-MailGen.ps1:296 char:5
+ $mail.SendAndSaveCopy()
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServiceRequestException
Any suggestions?
Thanks,
VM
Great Work .
Morning Paul,
Thank you for the script, works great and well documented. I am running an issue in my TEST lab though:
All servers are VM’s and are running Windows Server 2012 R2 (all updates)
1) Exchange 2013 CU11 (all updates per Windows update)
2) Outlook 2013 Professional (all updates)
The script appears to start working but errors when trying to use SendAndSaveCopy with the following error:
xception calling “SendAndSaveCopy” with “0” argument(s): “This operation is not supported for a relative URI.”
At C:AMailGen1ModdedMailGen01.ps1:346 char:5
+ $mail.SendAndSaveCopy()
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : InvalidOperationException
I have followed this article but no luck so far. Any suggestions?
Thanks!
Jeremiah
How did you modify the script?
Hi Paul, I have setup 2 Exchange server 2016 in my testing lab. I am following and able to setup running this test on one Exchange server. However I am running following issue on second exchange server.
Can you please point out what should I take a look?
Preparing EWS
Exception calling “AutodiscoverUrl” with “1” argument(s): “The Autodiscover service couldn’t be located.”
At C:scriptsStart-MailGen.ps1:367 char:1
+ $service.AutodiscoverUrl($user.Properties.mail)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : AutodiscoverLocalException
Starting email generation loop
*** New email message
Exception calling “SendAndSaveCopy” with “0” argument(s): “The Url property on the ExchangeService object must be set.”
At C:scriptsStart-MailGen.ps1:296 char:5
+ $mail.SendAndSaveCopy()
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServiceLocalException
Maybe Autodiscover isn’t configured, or the account you’re running the script with can’t locate it. Or check the tip at the end of the blog post for hard coding the EWS URL.
Nice Paul, works well on 2013. I was wondering how I would get some email into a training lab server for backup, perfect.
Pingback: Exchange Server 2010 to 2016 Lab #5 – Learning IT
Hi Paul,
Thanks this is just what I was looking for, come to your site all the time for stuff, your knowledge is well valued by me.
Thanks for all the effort that you put into helping us Exchange wanabees
Hi,
The link on github does not work and cannot download the scripts.
can I download the script from a different location?
The GitHub link works fine.
Hi Paul
Exception calling “SendAndSaveCopy” with “0” argument(s): “The Url property on the ExchangeService object must be set.”
At E:mailGenStart-MailGenStart-MailGen.ps1:296 char:5
+ $mail.SendAndSaveCopy()
is there anything need to edit in the script
Autodiscover is probably failing. Try the suggestion at the end of the article.
Hi Paul
PS] E:mailGenStart-MailGen>.Start-MailGen.ps1
Welcome to the Exchange Management Shell!
Full list of cmdlets: Get-Command
Only Exchange cmdlets: Get-ExCommand
Cmdlets that match a specific string: Help **
Get general help: Help
Get help for a cmdlet: Help or -?
Exchange team blog: Get-ExBlog
Show full output for a command: | Format-List
Show quick reference guide: QuickRef
Tip of the day #65:
Do you want to create a new management role assignment policy that’s based on an existing policy, but you don’t want to
include all the management roles? Use the Get-ManagementRoleAssignment cmdlet and pipe the results to the Where cmdlet.
The Where cmdlet excludes any role assignments that contain the roles you specify. The remaining role assignments are pi
ped to the New-ManagementRoleAssignment cmdlet. Type:
New-RoleAssignmentPolicy
Get-ManagementRoleAssignment -RoleAssignee | Where { ($_.Role -NE “”) -An
d ($_.Role -NE “”) } | New-ManagementRoleAssignment -Policy
The Where statement is case-sensitive.
Then you can apply the new policy to a mailbox using the Set-Mailbox cmdlet:
Set-Mailbox -RoleAssignmentPolicy
VERBOSE: Connecting to Tvlsunmbx02.sunoptical.co.in.
VERBOSE: Connected to Tvlsunmbx02.sunoptical.co.in.
Preparing EWS
Starting email generation loop
*** Will send 684 emails this hour
Retrieving recipient list
21 mailboxes found
0 distribution groups found
21 total recipients found
*** New email message
Sender: sallen@sunoptical.co.in
Subject: Extant
Recipient: csimon@sunoptical.co.in
Exception calling “SendAndSaveCopy” with “0” argument(s): “The Url property on the ExchangeService object must be set.”
At E:mailGenStart-MailGenStart-MailGen.ps1:296 char:5
+ $mail.SendAndSaveCopy()
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServiceLocalException
>>SendAndSaveCopy : Exception calling “SendAndSaveCopy” with “0” argument(s):
This can also appear if your Exchange support multiple domains.
For example, when Outlook Web Access if you login as CONTOSOJSmith then you should send this value instead of your email address in the script.
Michael
Dear All,
Can anyone help me out to create a powershell script as per below requirements.
1. We are planning to add new SMTP address to our existing users and so we want to set auto reply message as per below to all user mailbox.
2. Script should take user display name with old email id and new email id and set below customize message on each of individual mailboxes
3. Reply message should be as per below
4. Script should take all BOLD content from excel sheet and set customize auto reply message to each individual mailboxes
Dear Sender,
Please note that my email id has been changed from abc@test.com to xyz@test.com , hence for the please send mail on new email id only…
Regards,
‘User name’
Note: We are having Exchange 2010 environment
Hello Paul,
Is there a way to specify a sample file for an attachment and specify specific text in the subject line or body of the message?
The script is written to randomize the subject, content, and attachments of the emails. You could edit the script so that instead of picking a random value it just uses a value you specify. But if you’re trying to send specific emails, why not just use Send-MailMessage?
Thanks for the script Paul. Works well on Ex2013 with self-signed default cert after hardcoding the EWS URL, using EWS API v2.0.
I use your script to generate enough email volume to grow the database beyond a set size, testing a script that sets the maximum database size.
Being weekend, modified the script to generate 100,000 as opposed to the default of 10.
I also added some larger documents to be used as attachment to make the database size grow quicker. The script seems to pick up all files randomly in the Attachments folder.
Excellent script, thanks again.
I’m having trouble with the impersonation portion of the script. I have assigned the correct role assignment to a service account, but still getting the following error:
SendAndSaveCopy : Exception calling “SendAndSaveCopy” with “0” argument(s): “The account does not have permission to im
personate the requested user.”
At C:MailGenStart-MailGen.ps1:296 char:26
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
I had to change my account that I was using. I got it working.
would you please explain what do you mean “change my account that I was using”?
what exactly did you do?
im having the same problem
i know this article is old… but still best tool out there.
I’m building a test environment. I’m trying to use your Exchange Traffic Generator. I’ve used it before … always worked wonderfully.
i hit an error. i’ve been beating my head against the wall for days.
it has to be something simple.
Please help
it’s not like any of the errors i saw on your article.
when i start Start-MailGen.ps1 … i receive the following error … and then the script continues to run. though no emails are being created.
Error Message:
*******************************************************************
“Import-Module : the specified module ‘ActiveDirectory’ was not loaded because no valid module file was found in any module directory.
At C”MailGenStart-mailGen.ps1:359 char:1.”
* Import-Module ActiveDirectory
**********************************************************
I checked line 359 … and sure enough it’s “Import-Module ActiveDirectory’
what is the ActiveDirectory module?
What could be the problem?
is there a work around? like hardcoding the URL …
but what about retrieving the SID?
Can you help?
JDeek
It’s the Active Directory Powershell module and the script depends on it, so it needs to be installed on the server that you’re running the script from.
Open the powershell and run these commands one after the other
Import-Module ServerManager
Add-WindowsFeature RSAT-ADDS
Install-WindowsFeature RSAT-AD-PowerShell
Hi,
Thanks for the wonderful script. I am not able to run this script with the following error,
Exception calling “SendAndSaveCopy” with “0” argument(s): “Exchange Web Services are not currently available for this request because none of the Client Access Servers in thedestination site could process the request.”
At C:ScriptsStart-MailGen1Start-MailGen-12.ps1:296 char:5
+ $mail.SendAndSaveCopy()
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServiceResponseException
Please help.
The most common cause of problems with this script is SSL certificate issues or Autodiscover configuration issues.
Found this to work pretty well and cleanly. Windows 2008R2 across the board, Exchange 2010. Just need to make sure to follow all the item in the post, and make sure that either a real cert is applied or do a self cert (here is the MS post for self-cert on the Exchange server itself and it WORKS dead on when you follow it- http://social.technet.microsoft.com/wiki/contents/articles/13916.how-to-use-a-self-signed-certificate-in-exchange-2010.aspx )
Also in tinkering, tried dumping some attachments into the attachments directory, just collections of things have gathered over time as sample data, and the script will randomly pick attachments you have placed in the Attachments directory. Pretty nice to be able to drop in your own seed data.
Hi Paul,
thanks for this great script.
I want to use this at our lab and need to change the script that only one or two users receive the emails. How can I modify the random part to a list of users?
Thanks and have a nice day!
Torsten
I’m using these scripts in LAB Environment only.
These scripts are very useful. These scripts are working very much good in Exchange 2013 SP1 CU5 environment. But facing issues with Exchange 2010 SP3 Rollup9.
I’m getting the following error, any help is greatly appreciated.
Exception calling “AutodiscoverUrl” with “1” argument(s): “The Autodiscover service couldn’t be located.”
At C:Start-MailGen1Start-MailGen-02.ps1:367 char:25
+ $service.AutodiscoverUrl <<<< ($user.Properties.mail)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
.start-MailGen script. I received the following error message. Unable to locate Dictionary files C:scriptsdict.csv any help would be very appreciated.
That file is included in the Zip file and needs to be in the same location as the script.
Thanks Paul, I really appreciate your scripts and quick response.
Thanks Paul my lab email is functioning….
Hi Paul,
Thanks for such a wonderful script. I am using this for 1-2 day and it is working fine with me.
Is there any way to specify the mailbox database to send the emails since I do have 5 different exchange database on same exchange server and I would like to have some data generated withing specified exchange database instead all.
Any help on this would be realy appreciated.
Thanks
Modify the line of the script where Get-Mailbox is run to specify just one database.
I’m running the script with Exchange 2010 SP3 server. My exchange deployment is having many exchange servers in the same domain and in same OU. And many of the user mailboxes are registered with other exchange servers which are in not recoverable state.
Now when I ran the script it is trying to select all the users in the domain whose mailboxes are registered with other exchange servers which are in un-usable state.
Is there a way to make/tell the script to select users which are registered with particular exchange server only.
Is this a production environment or a test/dev environment?
Its a purely test environment and I don’t want any distribution groups to be selected for this script to run.
Thanks the scripts are user friendly I was able to customize as per my need.
I filtered mailbox selections and distribution selections. Now when I ran the script I’m getting the following error,
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. The underlying connection was closed: C
uld not establish trust relationship for the SSL/TLS secure channel.”
At C:ScriptsStart-MailGen1Start-MailGen.ps1:296 char:26
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
I read one the comment saying install certificates. Could you please link me to the certificates from where to download or install from..
Thanks alot. My setup is a test setup.
These scripts are user friendly and I was able to customize as per my need.
I filtered mailbox selections and distribution selections. Now when I ran the script I’m getting the following error,
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. The underlying connection was closed: C
uld not establish trust relationship for the SSL/TLS secure channel.”
At C:ScriptsStart-MailGen1Start-MailGen.ps1:296 char:26
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
I read one the comment saying install certificates. Could you please link me to the certificates from where to download or install from..
Thanks for the nice script. I’m running this script on windows 2012 r2 server with exchange 2013
sp1. Also I’ve installed Microsoft Exchange Web Services Managed API 2.2.
I’ve ran the script while following your instructions and I got the following error message,
“Unable to locate Exchange Web Services DLL”
Please correct me where I’m doing wrong.
You need to update the $dllfolderpath variable in the script to point to the correct DLL location. This is explained in more detail in the instructions in the article above.
Thanks Paul, So timely response.
It resolved my issue.
Thanks a lot
Pingback: Enterprise Vault SMTP Journal Archiving | IT diaries by barisca & seldaa
Pingback: Exchange 2013 – Enterprise Vault SMTP Journal Archiving | IT diaries by barisca & seldaa
I keep getting the following error on an Exchange 2010/2013 mixed testing environment. I’m running this as the domain administrator which has a mailbox enabled account. Also, I’ve given full access to the mailboxes in the test environment, set the impersonation account to the administrator, and manually set the EWS url in the script. Any ideas what may be causing this?
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. The remote server returned an error:
(401) Unauthorized.”
At C:ScriptsStart-MailGen.ps1:296 char:5
+ $mail.SendAndSaveCopy()
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ServiceRequestException
I’m also getting the error. How did you verify the role is assigned?
I’ve seen this with certificate issues. Even after replacing the self-signed cert with one from an internal CA I sometimes still run into the problem when trying to run the Start-MailGen.ps1 script directly on the Exchange server. Usually it works fine if I do it from a non-Exchange server that has just the management tools installed.
I tried to run this from a server not in the Exchange environment, but the error still persists. Any other ideas?
Pingback: cheap insurance
Pingback: Atlanta carpet cleaning
Pingback: cell phone spy gratuit
Paul, this is awesome. Do you know if there is a way to set PermissionControlled through EWS Managed API? I have looked around without much luck, but I was hoping to introduce some protected content into the test also to see how the Journal Decryption agent affects performance.
No idea to be honest. The EWS API is pretty well documented on MSDN or I would suggest posting in the Exchange Developers forum on TechNet or checking Glen Scale’s blog to see if he has any tips for that.
Pingback: iphone 4S screen replacement in schaumburg
Pingback: radiology nurse duties
Pingback: fiesta de la tomatina en ingles
Pingback: apple peeler
Pingback: attorney ratings
Pingback: batteries plus
Pingback: Vietnam tours
Pingback: Frank Kern front page
Pingback: Neinstein
Pingback: golf cart windshield
Pingback: 24 hour emergency locksmith
Pingback: url.rifix.net
Hi Paul,
I am trying to run the script in an Exchange 2013 environment from a Win 7 machine running PS 3.0 and all the prerequisites you mentioned in the blog but I get the following errors :
Exception calling “SendAndSaveCopy” with “0” argument(s): “The Id property must be set.”
At C:Userssa-exc-impDesktopStart-MailGen1Start-MailGen.ps1:296 char:26
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
*** New email message
Cannot process argument transformation on parameter 'Identity'. Cannot convert value "TA_Alain Struillou" to type "Micr
osoft.Exchange.Configuration.Tasks.MailboxIdParameter". Error: "Cannot convert hashtable to an object of the following
type: Microsoft.Exchange.Configuration.Tasks.MailboxIdParameter. Hashtable-to-Object conversion is not supported in res
tricted language mode or a Data section."
+ CategoryInfo : InvalidData: (:) [Get-Mailbox], ParameterBindin…mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-Mailbox
You cannot call a method on a null-valued expression.
At C:Userssa-exc-impDesktopStart-MailGen1Start-MailGen.ps1:232 char:31
+ if($SenderSmtpAddress.GetType <<<< ().fullname -eq "Microsoft.Exchange.Data.SmtpAddress") {
+ CategoryInfo : InvalidOperation: (GetType:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Sender:
Subject: Stygian adamant ossify
Cannot process argument transformation on parameter 'Identity'. Cannot convert value "Astruill Microsoft" to type "Micr
osoft.Exchange.Configuration.Tasks.RecipientIdParameter". Error: "Cannot convert hashtable to an object of the followin
g type: Microsoft.Exchange.Configuration.Tasks.RecipientIdParameter. Hashtable-to-Object conversion is not supported in
restricted language mode or a Data section."
+ CategoryInfo : InvalidData: (:) [Get-Recipient], ParameterBindin…mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-Recipient
You cannot call a method on a null-valued expression.
At C:Userssa-exc-impDesktopStart-MailGen1Start-MailGen.ps1:272 char:38
+ if($RecipientSmtpAddress.GetType <<<< ().fullname -eq "Microsoft.Exchange.Data.SmtpAddress") {
+ CategoryInfo : InvalidOperation: (GetType:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Recipient:
Exception calling "Add" with "1" argument(s): "Object reference not set to an instance of an object."
At C:Userssa-exc-impDesktopStart-MailGen1Start-MailGen.ps1:282 char:35
+ [Void] $mail.ToRecipients.Add <<<< ($EmailRecipient)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Cannot process argument transformation on parameter 'Identity'. Cannot convert value "sa-exc-imp" to type "Microsoft.Ex
change.Configuration.Tasks.RecipientIdParameter". Error: "Cannot convert hashtable to an object of the following type:
Microsoft.Exchange.Configuration.Tasks.RecipientIdParameter. Hashtable-to-Object conversion is not supported in restric
ted language mode or a Data section."
+ CategoryInfo : InvalidData: (:) [Get-Recipient], ParameterBindin…mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-Recipient
You cannot call a method on a null-valued expression.
At C:Userssa-exc-impDesktopStart-MailGen1Start-MailGen.ps1:272 char:38
+ if($RecipientSmtpAddress.GetType <<<< ().fullname -eq "Microsoft.Exchange.Data.SmtpAddress") {
+ CategoryInfo : InvalidOperation: (GetType:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Do you have an idea why this might happen ?
Thanks
Have you modified the script in any way?
Have you tried hard coding the EWS URL?
Hi Paul,
Thanks for replying to my post 🙂
I finally managed to solve the issue by installing the Exchange 2010 Management Tools on the workstation and hardcoding the EWS to an Exchange 2010 server.
In fact the first time i did modify the script in order to import the PSSnapin for Exchange 2013 as this would fail with unable to load any snapin… I think this was causing the issue…
Thanks for a great script Paul and i hope this will help others running into the same issue.
Pingback: local equine dentist
Pingback: facebook gratuit
Pingback: Jacksonville SEO company
Pingback: Highly recommended Reading
Pingback: prweb.com
Pingback: trademark Attorney
Pingback: My Favorite Scripts to Use with Exchange | Oddytee
Script also does not work in a 2007/2010 mixed environment
The new script is not available for download
Sorry about that. Download system broke recently. I’ve replaced the link with a working one now.
Hi,
First of all, this is a kickbutt script! Thank you so much.
Now, my question is, is there a way to SPECIFY the email recipients? Not just random? Here’s the thing, I need to stress test my Exch 2010 servers in PROD. A little backstory first, I’m in the middle of migrating from Exch 2007 to Exch 2010. Right now both Exchange 2007 and 2010 are coexisting but I have not cutover yet. Everything flows to Exch 2007 first, then if the email is intended for an Exch 2010 mailbox then it send it to the Exch 2010 mailbox.
Before I actually move all users from 2007 to 2010, I need to make sure my Exch 2010 Mailbox servers can handle the load (it’s a physical server with local attached disks).
If I run this script, it’s going start spamming random Exch 2007 users, and I don’t want that… well, at least I don’t want to be here when that happens 🙂
Any help is greatly appreciated.
Thanks again!
I don’t recommend using this script in any production environment (or any script like it for that matter). It is not intended to be used to validate a hardware/storage design.
If you’ve sized your server and storage hardware based on the Exchange 2013 sizing calculator that Microsoft published, and you want to validate that, then Microsoft also has tools such as Jetstress for that task.
First, this is AWESOME for labs. Just fantastic. I’m so happy I don’t have to run LoadGen 24×7 🙂
A little about my experience:
I created a whole new account to do this with in the lab. On the first run, it only found one recipient, which took me a while to realize, it only found it’s own mailbox. Get-mailbox only returned itself! Woops!
I added the account I use “SMTP Test” to the Exchange Recipient Management RBAC Group. Which solved the problem! Now it’s just chugging away.
Great help
Thanks a lot
highly appreciated
Pingback: Start-MailGen.ps1 - Test Lab Email Generator PowerShell Script V1.01
Paul,
Great script, I’m using it pretty much out of the box on Exchange 2013 CU3 on Windows 2012 and EWS API 2.0 (changed the path in the script to point to the proper DLL)
One thing I did notice was that the last mailbox (user name of Zena), never sent or received email. Basically it was part of this line in your script:
$rand = Get-Random -Minimum 0 -Maximum ($mailboxcount – 1)
If you look at the TechNet article for the Get-Random command (http://technet.microsoft.com/en-us/library/ff730929.aspx), it states that the maximum must be 1 more than your desired maximum:
“And yes, -maximum must always be set to 1 more than the high number in the range. That means that, to select a random number between 1 and 100, we must set –maximum to 101; if we set –maximum to 100 then we’d actually select a random number between 1 and 99. ”
By subtracting 1 from $mailboxcount, the last mailbox would never be used. I changed the line and removed the -1 and the last mailbox is now sending and receiving email.
Thanks again, this is fantastic. I’m busy loading up my mailboxes across six databases to test auto reseed 🙂
Hey all,
Can’t wait to work with this script, however I receiving the following error when I try to run the script.
I have EWS Managed Api 1.2 installed. Exchange 2010 SP3
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.”
At C:Usersbashipman-admDesktopMailgenStart-MailGen.ps1:186 char:23
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Thanks,
Brian
Fixed that issue…
http://blogs.technet.com/b/sbs/archive/2007/04/10/installing-a-self-signed-certificate-as-a-trusted-root-ca-in-windows-vista.aspx
Now running into:
Exception calling “SendAndSaveCopy” with “0” argument(s): “An element node ‘soap:Envelope’ of the type Element was expected, but node ‘Autodiscover’ of type Element was found.”
At C:Usersbashipman-admDesktopMailgenStart-MailGen.ps1:186 char:23
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Tried to fix the issue by disabling all authentication methods on the Autodsicover virtual directory except Basic and received.
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. The remote server returned an error: (401) Unauthorized.”
At C:Usersbashipman-admDesktopMailgenStart-MailGen.ps1:186 char:23
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Then I tried just Windows Authentication (Disabled Basic and Anonymous) and received:
Exception calling "SendAndSaveCopy" with "0" argument(s): "The response received from the service didn't contain validXML."
At C:Usersbashipman-admDesktopMailgenStart-MailGen.ps1:186 char:23
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Hi,
the user running the power shell should be mailbox enabled and should have full access to all mailbox.
Unless the user does not have full access to mailbox it fails to save the copy
the user should have impersonationAssignmentName role assigned
under #Web services initialization
you need to set the $service.URL to https://casserver /ews/exchange.asmx
Paul,
Great script as I got it to run in my Exch 2007 test environment. Is there a way to get this script to run continuously and not wait for the next hour? Additionally, I think I know how to increase the amount of emails generated but want your input….What I’m testing in Dev is to generate many tracking logs for our Arcsite environment.
Thanks,
Dan
Hi
Had the same error for “Exception calling “SendAndSaveCopy” with “0″ arguments(s): “Exchange Server doesn’t support the requested version.””.
Ran Exchange 2010 SP3 on Server 2012. Installed API version 2.0.
Changed the following in the script and errors was gone.
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService(“Exchange2010_SP2″)
Tried SP2 although it was SP3 and it worked.
Hi Paul,
I was looking for something like this for testing. Looks exactly like what I need in my test environment. I currently have Exchange 2010 SP1 running on Windows 2008 R2 server. I have the ” Exchange Web Services Managed API 2.0″ installed on the Exchange Server and the script is pointing to the dll “$dllfolderpath = “C:Program FilesMicrosoftExchangeWeb Services2.0Microsoft.Exchange.WebServices.dll””
When I run the script I’m getting the following error each time it attempts to send an email from a user to a user:
Exception calling “SendAndSaveCopy” with “0” arguments(s): “Exchange Server doesn’t support the requested version.”
At c:generate emailstest email generatorStart-MailGen.ps1:186 char:23
+ $mail.SendAndSaveCopy <<<< ()
+CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+FullyQualifiedErrorID : DotNetMethodException
I did try pointing directly to the EWS address instead of using the Autodiscover but I continue to get the error message.
The problem seems to be on line 186 of the code "$mail.SendAndSaveCopy()". If I comment this out the script does seem to run successfully but no emails are actually sent. It just appears to go through the motion of sending emails.
Any help you can give would be greatly appreciated.
Thanks!
I ran into this issue myself and I can’t remember what exactly was the the cause. I think it was the version of the EWS API needing to be an earlier one (1.x would probably work fine with Exchange 2010 SP1).
So you could try some of the older API versions, or upgrade the Exchange server to 2010 SP3 which should work with API version 2.0 AFAIK.
I was actually able to get it working by adding the Exchange Version to the following line in the code:
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService(“Exchange2010_SP1″)
I found this in the subscriber comments above.
There is another tech in my office who is having some issues as well but we believe its related to his test exchange server and impersonation rights. He’s rebuilding that server and we hope to get it up and running on his by next week.
Thank you for your help!
Ah yes, that was it. Thanks for the reminder.
Hey Paul,
great script, is there a way I could slow the email generation down?
Having issue when sending large volumes, some of the emails don’t get sent and end up in draft folder of the accounts.
Cheers
Sure. Look at the loop where the actual emails are being sent, and just add a Start-Sleep for as long as you need after each email is sent.
Thank you very much for this amazing help.
Lab up and running
Regards
Thanks for a great script.
FYI – The link for EWS should be updated to http://www.microsoft.com/en-us/download/confirmation.aspx?id=28952
Is there any way to find if the attached file is of certain type like xls, jpg, docx, etc, without just looking at the file extension, but by looking at the content-type using ews managed api?
It’s Great 🙂 I had a problem but now it’s works. Thanks 🙂
Is attachment thing possible??
Yes You can send attachment
Add the line under
$mail.From = $EmailSender
$mail.Attachments.AddFileAttachment(“full path of the file to be attached”)
Example
$mail.From = $EmailSender
$mail.Attachments.AddFileAttachment(“C:UserstestexchangeDesktopemailu_ex110430.zip”)
save the file and run you should be able to send attachment
Thx Vishwanath, will try that out!
one more thing, your suggestion hard codes the attachment file.
Is there a way the script randomly picks from the set of files from a given folder.
Say randomly pick any file from the directory C:Attach.
Shakti,
You could do a lookup to put the list of filenames in the directory into an array and then do a Get-Random against that array to select the attachment for a particular email. If you wanted to get even fancier, you could always do another random true or false to see if a particular email actually gets an attachment or not.
Cheers
Shakti,
I followed Vishwanath’s advise about the “$mail.Attachments.AddFileAttachment(“C:UserstestexchangeDesktopemailu_ex110430.zip”)”
however I changed it a little!
I added two new lines to the script,
$attach = Get-childitem C:scriptsmailgenattachments*.* | Get-Random -Count 1
obviously change the folder as to where you want to store the attachments, I just have a few pdf. img, mp3, docx files in there.
above this existing line in the script
$mail = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage($service)
and then I added this line
$mail.Attachments.AddFileAttachment(“$attach”)
so my script now looks like this
$attach = Get-childitem C:scriptsmailgenattachments*.* | Get-Random -Count 1
$mail = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage($service)
$mail.Subject = $emailSubject
$mail.Body = $emailBody
$mail.From = $EmailSender
$mail.Attachments.AddFileAttachment(“$attach”)
[Void] $mail.ToRecipients.Add($EmailRecipient)
$mail.SendAndSaveCopy()
Now obviously this will then send attachments to every email it sends, so all have done is modify the number of sending emails, and run the original script to. so I get both lots of emails with and without attachments delivered within the test lab.
hope that makes sense!
Sam
Using this script with slight modification, Is there a way to add attachments from a given set of attachment types (.txt, .doc, .img etc)???
I’m sure its possible I just haven’t looked into it. It would be handy though, I might try and include it in the next version.
Amazing work buddy!
Just add impersonation part to the prerequisite in the script itself, rest is awsome!
Cheers!!!!
Hi Paul,
This is an excellent contribution. May I ask some customization. I need a similar script to test my exchange online. The script should send repeated email to some particular internal email ids (from a csv). with a 5 minutes delay. Then we need to get the analyzing done on how was the delay in each send. Can you help?
Thanks,
Manu
Has anyone tried this script with Exchange 2013? I need to do some load testing with Exchange 2013 and I’m trying to find tools other than loadsim. This tool works great on Exchange 2010!
Thanks
yes! and it works.. well i had to tweak some things..
i did all of the above, but i was seeing some SendAndSaveAs issues.
i hashed # out
#$mail = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage($service)
#$mail.Subject = $emailSubject
#$mail.Body = $emailBody
#$mail.From = $EmailSender
#[Void] $mail.ToRecipients.Add($EmailRecipient)
#$mail.SendAndSaveCopy()
and added this directly underneath
Send-MailMessage -SmtpServer FRONTENDCAS -From $emailsender -To $EmailRecipient -Subject $emailSubject -Body $emailBody
it was a long shot but it works..
Paul, hope you don’t mind 🙂
That will work but its just sending with SMTP so it doesn’t save the item to the sender’s Sent Items, isn’t as useful for generating test traffic for message tracking etc, doesn’t necessarily use multiple HT’s if available, etc etc. Depends whether you need all that or just the ability to send a bunch of raw traffic around.
Paul – do you have a suggestion for how to make this work correctly on Exchange 2013? I did make the changes that Sam suggested and that’s working, but I’d like items to be logged in the sent items if possible. Thanks!
I imagine for Exchange 2013 it will be a simple case of using the latest EWS API DLL and updating the script variable that points to the DLL path. But I haven’t had a chance to test that yet.
I did get this to work on 2013. I had quite a few issues and saw lots of different errors (most of the ones talked about above and a few more) but they were all issues with my lab…mostly caused by a DNS issue on my DC. After resolving those and undoing all the hacks I was doing to the script trying to get it to work, it works like a champ.
To get it to work after other issues were resolved, I just had to update the path to the EWS DLL that’s included in 2013 and it does work as expected. Thanks for this awesome script, it’s going to make my 2013 eDiscovery testing much easier.
Great, thanks for letting us know. And yes, eDiscovery testing is exactly the type of thing this script is designed to create realistic looking traffic for, so that is awesome 🙂
Do you think it would be possible to run this against at test environment on Microsoft Live@edu?
No.
Thanks for the tip Paul! I installed SP2 on my test server and the script is now running great!
Hi Paul,
Well I got the script working and ran it for a bit but let it set for a few weeks and now when I try and run the script I get the following error,
Get-Random : Minimum (0) cannot be greater than or equal to Maximum (-1).
At C:scriptsmailgenStart-MailGen.ps1:148 char:20
+ $rand = Get-Random <<<< -Minimum 0 -Maximum ($mailboxcount – 1)
+ CategoryInfo : InvalidArgument: (:) [Get-Random], ArgumentException
+ FullyQualifiedErrorId : MinGreaterThanOrEqualMax,Microsoft.PowerShell.Commands.GetRandomCommand
Thanks
Geoff
I would say $mailboxcount is returning 0 for some reason. I assume you’ve still got mailbox users in your test lab?
Hi Paul
Yes I still have mailboxes configured in my test environment
thanks
Geoff
Well Paul, I found my problem. I discovered that I was using the wrong power shell, what a bonehead mistake. its been a long week.
However I get this new error
[PS] C:scriptsmailgen>.Start-MailGen.ps1
Retrieving mailbox list
Preparing EWS
Starting email generation
*** Will send 692 emails this hour
Exception calling “SendAndSaveCopy” with “0” argument(s): “The request failed. The underlying connection was closed: An unexpected error occurred on a sen
d.”
At C:scriptsmailgenStart-MailGen.ps1:186 char:23
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Any ideas where I might find why it is getting a send error?
thanks
Geoff
Something interrupting the SMTP connection to the Transport server you’ve configured in the script variables?
If you test it with Telnet does it work?
Hi Paul
That is what it appeared to me as well but I can telnet into port 25 and it responds back fine
Thanks
Geoff
Paul!
is there a way this script can be modified to target mail enabled public folders? i am trying to prove a point for a customer who has 1000+ public folders and they want to upgrade to 2010!
*** I’ll repeat the warning not to use this script in production environments. ***
On line 236 is the code that determines the mailboxes that are used by the script. You could probably modify that to get mail-enabled public folders instead.
its in a demo environment that is no where near the live environment!
i have tried that but get a long list of errors! it does however pick up the names of the public folders..
“cannot process argument transformation on parameter ‘Identity’. Cannot convert the “PUBLICFOLDERNAME” value of type “Microsoft.Exchange.Data.Directory.Management.MailPublicFolder” to type “Microsoft.Exchange.Configureation.Tasks.MailboxIdParameter”
any ideas?
Hey Paul,
I executed the following command first and still get the error below. Any idea? By the way, I am using Exchange Web Services Managed API 1.1
[PS] C:\>New-ManagementRoleAssignment -Name:impersonationAssignmentName -Role:ApplicationImpersonation -User:administrator
Exception calling “SendAndSaveCopy” with “0” argument(s): “The account does not have permission to impersonate the requested user.”
At C:ScriptsMailgenStart-MailGen.ps1:186 char:23
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
After granting impersonation rights you’ll need to start a new shell session for it to take effect.
Perfect! That was it. Thanks so much. Its a great script! Any idea when this script will work with Exchange Web Services Managed API 1.2?
If you’re running Exchange 2010 SP2 I think it actually does work fine with the EWS v1.2, you just need to update this variable in the script with the correct path: $dllfolderpath
Paul,
First, thank you very much for your time and efforts on this. I have been trying to get this working in a test environment for a couple of days now, and am running into an error that I have not been able to solve. I have a 2008 R2 DC, and a 2008 R2 mail server with Exchange 2010 SP1. I believe I have autodiscover configured correctly, and am using the self signed certificate from the Excahnge server. I have added it to the Trusted Root CA store on the server as well. I installed Exchange Web Services Management API version 1.2 as I could not find version 1.1. When I run the script, I am getting the following:
Retrieving mailbox list
Preparing EWS
Starting email generation
*** Will send 867 emails this hour
Exception calling “SendAndSaveCopy” with “0” argument(s): “Exchange Server doesn’t support the requested version.”
At C:scriptsStart-MailGen.ps1:186 char:23
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Any ideas?
Thanks again,
Russ
I believe that the API v1.2 requires Exchange 2010 SP2.
Does anyone know where I can get a copy of API v1.1? Everywhere i’m looking all I can find is 1.2 or higher. I’ve almost got Exchange 2007 to work but now i’m receiving the same error “Exchange Server doesn’t support the requested version.” I believe with API v1.1 I will have it functioning correctly and will post the changes that were needed in order to make it work.
Hi Paul,
I am using exchange & outlook 2010, trying to move messages from inbox to Temp folder in the same mailbox.. but I am getting the following error message at line below..
$Mailbox = “name@domain.com”
$service.AutodiscoverUrl($Mailbox, {$True}); – This throws an error message..
Exception calling “AutodiscoverUrl” with “2” argument(s): “The Autodiscover service could not be located.”
At C:adMoveItems.ps1:244 char:27
+ $service.AutodiscoverUrl <<<< ($Mailbox, {$True});
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : DotNetMethodException
Please let me to solve this issue.. I am new in dealing with exchange mailboxes.
Regards,
Vikram
I’ve made significant progress in getting this script to run in my lab environment. However, I’m now receiving the following error.
I’m running Exchange 2007 with a Windows 2008R2 DC in the environment. I have worked through several other issues but unable to resolve this one.
Any assistance would be great appreciated!
[PS] D:scriptsmailgen>D:ScriptsMailgenStart-MailGen.ps1
Retrieving mailbox list
Preparing EWS
Starting email generation
*** Will send 822 emails this hour
Exception calling “SendAndSaveCopy” with “0” argument(s): “An element node ‘soa
p:Envelope’ of the type Element was expected, but node ‘Autodiscover’ of type E
lement was found.”
At D:ScriptsMailgenStart-MailGen.ps1:186 char:23
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Hi Eric, I’ve done no testing against Exchange 2007 with this script. I only use it in Exchange 2010 test lab environments.
Paul,
Thanks for the update. I am one step closer to making this work. The problem that was listed above was because I was pointing to the Autodiscover.xml file and it was looking for the ews/exchange.asmx file. Once I pointed that correctly then it is now giving me the error “Exchange Server doesn’t support the requested version.” and I believe that is because I’m running API v1.2 instead of v1.1. Any assistance on finding or obtaining a copy of v1.1 would be greatly appreciated.
Eric
Eric- did you remember to enable impersonation for the user you are running the script as?
foreach ($exchangeServer in Get-ExchangeServer)
{
if ($exchangeServer.ServerRole -match ‘ClientAccess’)
{
Add-ADPermission -Identity $exchangeServer.DistinguishedName -User ‘domainuser’ -ExtendedRights ms-Exch-EPI-Impersonation
}
}
Fixed my headache with exchange 2007 and this script. so far, removing SSL (for a throw away lab, disabling SSL was far simpler), commenting out the exchange.2010 tools, hard coding the services url, and finally giving impersonation permissions to my script user got it all working.
Great script Paul, thank you very much!
Thanks Steve.
It was that simple!
Must make note to self to get head round powershell.
Thanks again.
regards
Gary
Thanks Paul. (no idea why I typed Steve !, to much Red wine)
It was that simple!
Must make note to self to get head round powershell.
Thanks again.
regards
Gary
Nice script, very useful.. Thank you for your time spent.
I’ve been trying to modify the sender to be able to exclude certain addresses, without much sucess. Any pointers would be appricated.
Regards
Gary
This line in the script fetches the list of mailboxes to include.
$mailboxes = @(Get-Mailbox -RecipientTypeDetails UserMailbox -resultsize unlimited)
So you can just modify that Get-Mailbox any way you like to exclude the ones you don’t want. Help info for Get-Mailbox is here:
http://technet.microsoft.com/en-us/library/bb123685.aspx
One way would be to use the -OrganizationalUnit parameter to just get the users in a specific OU, and have the ones you want to exclude be outside of that OU.
Paul this is so cool, i can’t thank you enough for this article en the scripts to put a mail load on a
lab test environment.
Very …..very much appriciated was looking for this for quite some time
Hi Paul
I am getting the same error message but I am unsure how to hard code the URL can you help me out?
Exception calling “AutodiscoverUrl” with “1″ argument(s): “The Autodiscover service couldn’t be located.”
At C:ScriptsMailgenStart-MailGen.ps1:245 char:25
+ $service.AutodiscoverUrl <<<< ($user.Properties.mail)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Thanks
Geoff
Hi Geoff (and others),
Firstly I would double-check that Autodiscover is working at all in your test lab. If there is anything wrong with it, or your SSL cert, then try fixing that first.
Other than that, I am planning to update the script for compatibility with the EWS API v1.2, so I will look to include the manually specified Autodiscover URL option in the next version. Hopefully not far away.
Actually I’ve just added a note to the end of the article with the required script edits to hard-code the URL, if you’re looking for a quick win.
Thanks Paul that helped that problem but now I am having to find out why I am having a permissions/trust Exception calling “SendAndSaveCopy” with “0” argument(s): “Request failed. The underlying connection was closed: Could not establish trust relationship fo
r the SSL/TLS secure channel.”
Some times this stuff makes me pull my hair out.
Thanks again for your help
Geoff
Geoff, that sounds like a certificate issue to me. The same issue is probably why Autodiscover isn’t working in the first place.
How does one solve this issue?
By installing a valid certificate. It can be from a private CA if its just for a test lab.
https://www.practical365.com/exchange-2010-ssl-certificates
Hi Paul,
I have almost the same error but :
“Exception calling “SendAndSaveCopy” with “0” argument(s): “Request failed. The underlying connection was closed: An unexpected error occured on a send”
I’m in an Exchange 2016 environment, can this explain this error which is not very clear?
Thanks 🙂
Robert
Thanks Paul,
I was able to follow your article and others of your articles about SSL for exchange. Once set up a CA and made a signed cert, then it all worked great. Thanks for making good scripts and such easy and excellent articles. They’re detailed and easy to read. Thanks. Keep up the good work 🙂
I successfully solved that error ,I used EWSManaged API version 1.1 instead of 1.2 and your script works fine …the old version (1.1) was not found on Microsoft download center anymore..But got it from “Mike Pfeiffer” Blog “http://www.mikepfeiffer.net/downloads/ExchangeLab.zip” under “bin” folder
I’ll try and update the script for v1.2 if the 1.1 is going to be unavailable for people :-/
Hi Paul ,
Create Efforts
but I got the following error
Exception calling “SendAndSaveCopy” with “0″ argument(s): “The mailbox that was requested doesn’t support the specified RequestServerVersion.”
knowing that version of EWSManged API is 1.2
This is awesome. Thanks for the work.
I will be using this (probably frequently) and provide any feedback and suggestions I have. One quick question… do you know what is this script does not work in Ex 2007? I would ideally like something that works for either version of Exchange… but will look into it myself.
THanks for your work and for sharing it with the world.
J
Hello Paul –
What could be causing this;
Exception calling “SendAndSaveCopy” with “0” argument(s): “The mailbox that was requested doesn’t support the specified
RequestServerVersion.”
At C:ScriptsMailGenStart-MailGen.ps1:186 char:23
+ $mail.SendAndSaveCopy <<<< ()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
I had the same problem and explicitly specifying version of exchange server fixed it:
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService(“Exchange2010_SP1”)
Other possible values:
http://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.exchangeversion%28v=exchg.80%29.aspx
Where I found out about this argument:
“Note that the EWS Managed API 1.1 defaults to Exchange2010_SP1 as the Exchange version that it is connecting to. If you are running another version of Exchange or another service pack, you must specify the correct version by passing the ArgumentList parameter to New-Object.”
http://blogs.technet.com/b/heyscriptingguy/archive/2011/12/02/learn-to-use-the-exchange-web-services-with-powershell.aspx
Hi Paul,
I’m getting the same error as above and the account does have a mailbox.
You could try hard coding the Autodiscover URL instead of the script trying to discover it.
Please share how you would hardcode the Autodiscover URL into your script.
Pingback: Script Powershell para gerar tráfego de emails em ambiente de teste « Rodrigo Rodrigues .:. www.andersonpatricio.org
I am getting this error.
[PS] C:ScriptsMailgen>.Start-MailGen.ps1
Retrieving mailbox list
Preparing EWS
Exception calling “AutodiscoverUrl” with “1” argument(s): “The Autodiscover service couldn’t be located.”
At C:ScriptsMailgenStart-MailGen.ps1:245 char:25
+ $service.AutodiscoverUrl <<<< ($user.Properties.mail)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Running Exchange on DC with Win 2008 R2.
Does the account that you’re using to run the script have a mailbox?
Sorry for the delay
Iam using administrator account and having mailbox.
Hi paul,
It is working fine.
Thank You for your script.
Raj
Paul,
Great script – I have been looking for something like this. I have been using this script for the past 2 days and I’m very impressed by the amount of work you put in to generate the script.
My only comment is this: How about using a text file to log all that information that we “write-host” – For two reasons :
a) we can review later if we need to, especially if there are errors – this one just scrolls by and we cannot see it anymore.
b) aslo it frees up screen and runs at the background.
Just my thoughts.
Thanks for the sharing it with us.
Seems like a good idea. I’ll try to include that in the next version.
Thanks for the reply. Sure I will try tonight and let you know the result.
Hollo Paul,
This is the error I’m getting while running.. DC on win 2k3 server and Exch 2010 typical roles installed on win 2008 R2. I could not find the solution for this over the internet.. Please suggest me.
************************************************************
[PS] C:Paul>.Start-MailGen.ps1
WARNING: Error initializing default drive: ‘Unable to find a default server with Avtive Directory Web Services running.’.
Retrieving mailbox list
Preparing EWS
Exception calling “AutodiscoverUrl” with “1” argument(s): “The Autodiscover service couldn’t be located.”
At C:PaulStart-MailGen.ps1:245 char”25
+ $service.AutodiscoverUrl <<<< ($user.Properties.mail)
+CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+FullQualifiedErrorId : DotNetMethodException
Starting email generation
*** Will send 615 emails this hour
Exception calling "SendAndSaveCopy" with "0" argument(s): "The Url property on the ExchangeService object must be set."
At C:PaulStart-MailGen.ps1:245 char"23
+ $mail.SendAndSaveCpy <<<< ()
+CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+FullQualifiedErrorId : DotNetMethodException
*********************************************************
If you’re not running a 2008 R2 domain controller I believe you need to install this on your DC.
http://www.microsoft.com/download/en/details.aspx?id=2852
Paul,
I was getting error when i ran the script on Exchaneg 2013 (CAS + Mailbox) server.
“Could not establish trust relationship for the SSL/TLS secure channel.”
Then I installed the certificate but now getting the error
“The Url property on the ExchangeService object must be set….”
My server is 2012 R2 hence I don’t have to install “Active Directory Management Gateway Service” as suggested by you above and its not letting me run that update.
What should I do??
Try hard-coding the EWS URL as demonstrated at the end of the article.
Thank so much and it is very important for me
Hi Paul,
Thanks for the info. I will be setting up my test lab this weekend and I will let you know how it goes.
Cheers.
TP
Thank you so much Paul, I was looking for something like this. Will tell you once tried in my lab.
Great article Paul! It will be very helpfull for my labs. Thanks you.-
Love this! will help so much in terms of testing and developing.