I have SP in SQL Server Agent. for better knowledge lets read this example
USE msdb
EXEC sp_send_dbmail
#profile_name = 'MyProfile',
#recipients = 'Someone#something.com',
#subject = 'T-SQL Query Result',
#body = 'The result from SELECT is appended below.',
#execute_query_database = 'msdb',
#query = 'SELECT *FROM [DB_Mh].[dbo].[mMhs]',
The result is, sql sent me an email like this.
The result from SELECT is appended below.
nim fullname
---------------- ----------
443141100778 Betty
4431411006571 Jessica
4431411002372 Dian
and if an error happen, sql didn't send me any email. so with that script above sql only sent me the result of sql and didn't send me any notification if there is something wrong happen. what I want to ask is How to make sql send me email notification if an error happen with it error message.
You need to use #append_query_error parameter.
Specifies whether to send the e-mail when an error returns from the
query specified in the #query argument.
More # https://msdn.microsoft.com/en-IN/library/ms190307.aspx
Related
I've about 1 month of experience when it comes to SQL and I wanted to send emails to customers based on query criteria. The challange I have is that the emails should only go to users emails that show up in the query. Below is an example of the data. I have no idea what I should do to setup the auto emailing based on a query. Any help is greatly appreciated!
My query would look like this,
select *
from [Tbl]
where [Date Certificate is Expiring]
Between getdate()-372 AND getdate()-371
OUTPUT:
USER ID | Email | Date Certificate is Expiring
NOTE: I do not have access to Visual Basic, SSRS, SSIS, or any other tool than Database Engine and dbMail
Please create DB mail profile first, then put it into below query:
DECLARE #MailRecipients NVARCHAR(MAX);
SELECT #MailRecipients = STUFF((
SELECT DISTINCT ';' + t.Email
FROM [Tbl] t
WHERE t.[Date Certificate is Expiring] BETWEEN GETDATE()-372 AND GETDATE()-371
FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)'),1,1,'')
;
IF COALESCE(#MailRecipients,'') <> ''
BEGIN
EXEC msdb.dbo.sp_send_dbmail
#profile_name = ..., -- <-- you have to create DBMailProfile first
#recipients = #MailRecipients,
#subject = 'Email about expiring stuff',
#body_format = 'HTML',
#body = 'Hi there, your something is expired',
#importance = 'Normal'
END
I am facing a very peculiar issue regarding msdb.dbo.sp_send_dbmail
What works:
I am using msdb.dbo.sp_send_dbmail to send emails from different stored procedures. It works. No problems.
What not works:
Now when I put it in an SQL JOB then it doesn't work i.e. sending to smtp server (gmail) but smtp throws error i.e. Message blocked.
It only happens when I send from JOB from the same server but it works when I used it in stored procedures or manually using static values.
What I have checked so far:
I have checked, the job runs. It works but smtp throws an error:
Message blocked
Your message to abc#gmail.com has been blocked. See technical details below for more information.
Why ?
Job step's code:
IF EXISTS( select * from MC_Complaints.dbo.Complaints cs where cs.OverDue= 1 AND ISNULL(EmailSent,0)= 0)
Begin
Declare #Codes varchar(max)
Set #Codes= (select
distinct
stuff((
select ', ' + cs.Code
from MC_Complaints.dbo.Complaints cs where cs.OverDue= 1 AND ISNULL(EmailSent,0)= 0
order by cs.Code asc
for xml path('')
),1,1,'') as codeslist
from MC_Complaints.dbo.Complaints cs)
Declare #Body varchar(max)
Set #Body= 'Overdue complaints: '+ #Codes
exec MC_Complaints.dbo.SendMail #Body, 'Overdue complaints'
Update Complaints
Set EmailSent=1
where OverDue=1
End
SendMail sp code:
EXEC msdb.dbo.sp_send_dbmail
#profile_name='CMS',
#recipients=#EmailAddresses,
#subject= #Subject,
#body= #Body
Update:
If it was about permissions then it would have not sent it to Gmail. and I checked log, it shows email has been sent from the sql server but gmail fails to send further.
Update:
Tt happens when I send it from my other server, not from others but again the problem is by gmail that blocks the message.
How can I send an email using T-SQL but email address is stored in a table? I want to loop through the table and be able to send email. I cannot find a good example of doing this so far.
Step 1) Create Profile and Account
You need to create a profile and account using the Configure Database Mail Wizard which can be accessed from the Configure Database Mail context menu of the Database Mail node in Management Node. This wizard is used to manage accounts, profiles, and Database Mail global settings.
Step 2)
RUN:
sp_CONFIGURE 'show advanced', 1
GO
RECONFIGURE
GO
sp_CONFIGURE 'Database Mail XPs', 1
GO
RECONFIGURE
GO
Step 3)
USE msdb
GO
EXEC sp_send_dbmail #profile_name='yourprofilename',
#recipients='test#Example.com',
#subject='Test message',
#body='This is the body of the test message.
Congrates Database Mail Received By you Successfully.'
To loop through the table
DECLARE #email_id NVARCHAR(450), #id BIGINT, #max_id BIGINT, #query NVARCHAR(1000)
SELECT #id=MIN(id), #max_id=MAX(id) FROM [email_adresses]
WHILE #id<=#max_id
BEGIN
SELECT #email_id=email_id
FROM [email_adresses]
set #query='sp_send_dbmail #profile_name=''yourprofilename'',
#recipients='''+#email_id+''',
#subject=''Test message'',
#body=''This is the body of the test message.
Congrates Database Mail Received By you Successfully.'''
EXEC #query
SELECT #id=MIN(id) FROM [email_adresses] where id>#id
END
Posted this on the following link http://ms-sql-queries.blogspot.in/2012/12/how-to-send-email-from-sql-server.html
You can send email natively from within SQL Server using Database Mail. This is a great tool for notifying sysadmins about errors or other database events. You could also use it to send a report or an email message to an end user.
The basic syntax for this is:
EXEC msdb.dbo.sp_send_dbmail
#recipients='user#yourdomain.com',
#subject='Testing Email from SQL Server',
#body='<p>It Worked!</p><p>Email sent successfully</p>',
#body_format='HTML',
#from_address='Sender Name <sender#yourdomain.com>',
#reply_to='sender#yourdomain.com'
Before use, Database Mail must be enabled using the Database Mail Configuration Wizard, or sp_configure. A database or Exchange admin might need to help you configure this.
See
http://msdn.microsoft.com/en-us/library/ms190307.aspx
and
http://www.codeproject.com/Articles/485124/Configuring-Database-Mail-in-SQL-Server for more information.
You can do it with a cursor also.
Assuming that you have created an Account and a Profile e.g. "profile" and an Account and you have the table that holds the emails ready e.g. "EmailMessageTable" you can do the following:
USE database_name
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE mass_email AS
declare #email nvarchar (50)
declare #body nvarchar (255)
declare test_cur cursor for
SELECT email from [dbo].[EmailMessageTable]
open test_cur
fetch next from test_cur into
#email
while ##fetch_status = 0
begin
set #body = (SELECT body from [dbo].[EmailMessageTable] where email = #email)
EXEC msdb.dbo.sp_send_dbmail
#profile_name = 'profile',
#recipients = #email,
#body = #body,
#subject = 'Credentials for Web';
fetch next from test_cur into
#email
end
close test_cur
deallocate test_cur
After that all you have to do is execute the Stored Procedure
EXECUTE mass_email
GO
Here's an example of how you might concatenate email addresses from a table into a single #recipients parameter:
CREATE TABLE #emailAddresses (email VARCHAR(25))
INSERT #emailAddresses (email) VALUES ('foo#foobar.com')
INSERT #emailAddresses (email) VALUES ('bar#foobar.com')
INSERT #emailAddresses (email) VALUES ('buzzlightyear#foobar.com')
DECLARE #recipients VARCHAR(MAX)
SELECT #recipients = COALESCE(#recipients + ';', '') + email
FROM #emailAddresses
SELECT #recipients
DROP TABLE #emailAddresses
The resulting #recipients will be:
foo#foobar.com;bar#foobar.com;buzzlightyear#foobar.com
In-order to make SQL server send email notification you need to create mail profile from Management, database mail.
1) User Right click to get the mail profile menu and choose configure database mail
2)choose the first open (set up a database mail by following the following tasks) and press next
Note: if the SMTP is not configured please refer the the URL below
http://www.symantec.com/business/support/index?page=content&id=TECH86263
3) in the second screen fill the the profile name and add SMTP account, then press next
4) choose the type of mail account ( public or private ) then press next
5) change the parameters that related to the sending mail options, and press next
6) press finish
Now to make SQL server send an email if action X happened you can do that via trigger or job ( This is the common ways not the only ones).
1) you can create Job from SQL server agent, then right click on operators and check mails (fill the your email for example) and press OK after that right click Jobs and choose new job
and fill the required info as well as the from steps, name, ...etc and from notification tab select the profile you made.
2) from triggers please refer to the example below.
AS
declare #results varchar(max)
declare #subjectText varchar(max)
declare #databaseName VARCHAR(255)
SET #subjectText = 'your subject'
SET #results = 'your results'
-- write the Trigger JOB
EXEC msdb.dbo.sp_send_dbmail
#profile_name = 'SQLAlerts',
#recipients = 'xxxx#xxxx.com',
#body = #results,
#subject = #subjectText,
#exclude_query_output = 1 --Suppress 'Mail Queued' message
GO
sometimes while not found sp_send_dbmail directly. You may use 'msdb.dbo.sp_send_dbmail' to try
(Work fine on Windows Server 2008 R2 and is tested)
To send mail through SQL Server we need to set up DB mail profile we can either use T-SQl or SQL Database mail option in sql server to create profile. After below code is used to send mail through query or stored procedure.
Use below link to create DB mail profile
http://www.freshcodehub.com/Article/42/configure-database-mail-in-sql-server-database
http://www.freshcodehub.com/Article/43/create-a-database-mail-configuration-using-t-sql-script
--Sending Test Mail
EXEC msdb.dbo.sp_send_dbmail
#profile_name = 'TestProfile',
#recipients = 'To Email Here',
#copy_recipients ='CC Email Here', --For CC Email if exists
#blind_copy_recipients= 'BCC Email Here', --For BCC Email if exists
#subject = 'Mail Subject Here',
#body = 'Mail Body Here',
#body_format='HTML',
#importance ='HIGH',
#file_attachments='C:\Test.pdf'; --For Attachments if exists
Im trying to send an email from a sever to a couple of recipients.
I do query my database using:
SELECT Email from payrollchecksystem
And than use the following to send the email
USE msdb
GO
EXEC sp_send_dbmail #profile_name='SQL Server Alerts System',
#recipients = I DONT KNOW WHAT TO PUT HERE
#subject='Test message',
#body='This is the body of the test message.
Congrates Database Mail Received By you Successfully.'
My problem is that I dont know what to put for #recipients when trying to send all the emails I got from the payrollchecksystem table?
To separate your e-mails into a semi-colon delimited string, use COALESCE:
DECLARE #EmailList varchar(MAX)
SELECT #EmailList = COALESCE(#EmailList + ';', '') + Email
FROM payrollchecksystem
WHERE Email IS NOT NULL
SELECT #EmailList
Then you can use #EmailList like so:
USE msdb
GO
EXEC sp_send_dbmail #profile_name='SQL Server Alerts System',
#recipients = #EmailList,
#subject='Test message',
#body='This is the body of the test message. Congrates Database Mail Received By you Successfully.'
http://msdn.microsoft.com/en-us/library/ms190307.aspx
#recipients
Is a semicolon-delimited list of
e-mail addresses to send the message
to
I'm trying to send an email using sp_send_dbmail in Sql Server 2005. I have both body text and a query being sent as an attachment.
Sometimes, however, the query will return an empty dataset.
Is there any way for me to test the results of the dataset before I send out the email, and if it has no results, not send it as an attachment.
I was thinking to maybe run the query before I send the email, and to test the results that way. Then, I'd have an if-else as follows:
if ##rowcount >0
EXEC msdb.dbo.sp_send_dbmail #recipients=#recipients_list,
#subject = #subject,
#body = #body_text, #body_format = 'HTML',
#query = #query,
#attach_query_result_as_file = 1,
#query_result_width = 4000,
#query_attachment_filename = 'Details.txt'
else
EXEC msdb.dbo.sp_send_dbmail #recipients=#recipients_list,
#subject = #subject,
#body = #body_text, #body_format = 'HTML'
But I don't think this is an efficient way to solve the problem.
Any suggestions? TIA!!
Alright, I couldn't test this on my set up at work since it appears our DBAs have blocked access to this procedure. However, I know that sp_send_dbmail will not use local variables in the calling script, but it might let you use a global temp table.
This isn't a great solution, but you could try inserting your query result set into ##tempTable, then changing the query you pass to sp_send_dbmail to select * from ##tempTable if there are > 0 rows.
That should at least be better than running the original query 2x (if it works). Remember to drop it when you're done!